红绿灯课设

博主分享了一篇关于单片机实现红绿灯功能的课设作业,代码中包括了东西方向和南北方向的红绿灯控制,以及紧急模式。虽然代码可能冗余且缺少部分注释,但博主提供了按键扫描和时间控制等功能,并提及在遇到紧急按键多次触发时可能出现程序崩溃的问题。此外,博主还预告将分享更多关于32位单片机和万年历项目的有趣经历。
摘要由CSDN通过智能技术生成

最近一直在忙单片机的课设作业,一开始本来是想卖一些的但是好像也没人看的上我的垃圾代码,就摆出来大家看着玩吧。简单介绍一下就是实现一个红绿灯功能,还包括了诸如东西方向常红灯南北方向常绿灯,持续性黄灯闪烁,以及红绿时长改变的功能。一开始写的是所有的功能进行完一个周期后实现对应功能,后来闲着没事,多写了个紧急模式,这样就可以再不论什么情况都可以直接改变状态的办法了。代码可能没有注释,因为版本问题啊中文注释再keil里面显示乱码,就没写。如果有大冤种看到这篇了并且想拿去用的话,有不会的地方可以评论区就好。下面是代码

#include <REGX51.H>

unsigned char DONGXI_S=0,DONGXI_MS=0,NANBEI_S=0,NANBEI_MS=0,DONGXI_S_HONG=30,DONGXI_S_LV=60,DONGXI_S_HUANG=63,NANBEI_S_HONG=63,NANBEI_S_LV=30,NANBEI_S_HUANG=33;
unsigned char JINJI=20,JINJI_MS;
sbit led_dongxi_hong = P2^5;sbit led_dongxi_lv=P2^3;sbit led_dongxi_huang=P2^4;
sbit led_nanbei_hong=P0^5;sbit led_nanbei_lv=P0^3;sbit led_nanbei_huang=P0^4;
sbit smg_dongxi_1=P3^3;
sbit smg_dongxi_2=P3^4;
sbit smg_nanbei_11=P3^5;
sbit smg_nanbei_12=P2^2;
sbit smg_dongxi_11=P3^6;
sbit smg_dongxi_12=P3^7;
sbit smg=P1;  
//char code SMG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char code SMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit smg_nanbei_1=P3^1;
sbit smg_nanbei_2=P3^0;
unsigned char time=0,moshi=0;

void delay(unsigned char i)
{
	while(i--)
	{
	unsigned char n, j;

	n= 2;
	j = 15;
	do
	{
		while (--j);
	} while (--n);
 }
}





unsigned char key_scan()
{
	if(P2_6==0)
	{
		delay(1);
		while(P2_6==0);
			moshi=1;
	}
	if(P2_1==0)
	{
		delay(1);
		while(P2_1==0);
		
		moshi=2;
		
		
	}
	if(P2_7==0)
	{
		delay(1);
		while(P2_7==0);
			moshi=3;
		
	}
	if(P2_0==0)
	{
		delay(1);
		while(P2_0==0);
		moshi=4;
	}
	return moshi;
}


void init()
{
	EX0=1;
	IT0=1;
}

void init_0() interrupt 0
{
	TR0=0;
	ET0=0;
	led_nanbei_huang=1;
	led_nanbei_hong=1;
	led_nanbei_lv=1;
	led_dongxi_huang=1;
	led_dongxi_hong=1;
	led_dongxi_lv=1;
	smg_dongxi_1=1;
	smg_dongxi_2=1;
	smg_nanbei_1=1;
	smg_nanbei_2=1;
		smg_dongxi_11=1;
	smg_dongxi_12=1;
	smg_nanbei_11=1;
	smg_nanbei_12=1;
	P1=0X00;
	DONGXI_S=-1;
}


void TIMER_0()  interrupt 1
{
	TL0 = (65536-45872)%256;		
	TH0 = (65536-45872)/256;		
	DONGXI_MS++;
	NANBEI_MS++;
	if(DONGXI_MS==20)
		{
			DONGXI_S++;
			DONGXI_MS=0;
		}
}

void main()
{
	P0_0=0;
	smg_dongxi_1=0;
	smg_dongxi_2=0;
	smg_nanbei_1=0;
	smg_nanbei_2=0;
//	P1=0XFF;
	P1=0X00;
	time=DONGXI_S_HONG+3;
	init();
  TMOD = 0x01;		
	TL0 = (65536-45872)%256;		
	TH0 = (65536-45872)/256;
	TF0 = 0;		
	TR0 = 1;		
	ET0=1;
	EA=1;
	while(1)
	{
	key_scan();
		while(moshi==0)
	{
			time=DONGXI_S_HONG+3;
				while(0<DONGXI_S&&DONGXI_S<=DONGXI_S_HONG)
				{
						led_dongxi_hong=0;
					  led_dongxi_lv=1;
	        	led_dongxi_huang=1;
					  smg_dongxi_1=0;
					  delay(1);
					  P1=SMG[(DONGXI_S/10)];
					  delay(1);
					  smg_dongxi_1=1;
//					  P1=0XFF;
					  P1=0x00;
					  delay(1);
					  smg_dongxi_2=0;
					  delay(1);
					  P1=SMG[(DONGXI_S%10)];
					  delay(1);
					  smg_dongxi_2=1;
//					  P1=0XFF;
					  P1=0X00;
						smg_dongxi_11=0;
					  delay(1);
					  P1=SMG[(DONGXI_S/10)];
					  delay(1);
					  smg_dongxi_11=1;
//					  P1=0XFF;
						P1=0X00;
					  delay(1);
					  smg_dongxi_12=0;
					  delay(1);
					  P1=SMG[(DONGXI_S%10)];
					  delay(1);
					  smg_dongxi_12=1;
//					  P1=0XFF;
						P1=0X00;
	   				led_nanbei_hong=1;
					  led_nanbei_lv=0;
					  led_nanbei_huang=1;
				   	smg_nanbei_1=0;
				   	delay(1);
				  	P1=SMG[(DONGXI_S/10)];
						delay(1);
			      smg_nanbei_1=1;
//						P1=0XFF;
						P1=0X00;
				    delay(1);
				    smg_nanbei_2=0;
				    delay(1);
				    P1=SMG[(DONGXI_S%10)];
						delay(1);
				  	smg_nanbei_2=1;
//						P1=0XFF;
						P1=0X00;
						smg_nanbei_11=0;
				   	delay(1);
				  	P1=SMG[(DONGXI_S/10)];
						delay(1);
			      smg_nanbei_11=1;
//						P1=0XFF;
						P1=0X00;
				    delay(1);
				    smg_nanbei_12=0;
				    delay(1);
				    P1=SMG[(DONGXI_S%10)];
						delay(1);
				  	smg_nanbei_12=1;
//						P1=0XFF;
						P1=0X00;
						key_scan();
				}
			 while(DONGXI_S_HONG<DONGXI_S&&DONGXI_S<=time)
				{					
						led_dongxi_hong=1;
						led_dongxi_lv=0;
						led_dongxi_huang=1;
						smg_dongxi_1=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
					  delay(1);
						smg_dongxi_1=1;
//					  P1=0XFF;
					P1=0X00;
						delay(1);
						smg_dongxi_2=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
					  delay(1);
					  smg_dongxi_2=1;
//					  P1=0XFF;
					P1=0X00;
						smg_dongxi_11=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
					  delay(1);
						smg_dongxi_11=1;
//					  P1=0XFF;
             P1=0X00;
						delay(1);
						smg_dongxi_12=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
					  delay(1);
					  smg_dongxi_12=1;
//					  P1=0XFF;
						P1=0X00;
						led_nanbei_hong=1;
						led_nanbei_lv=1;
						led_nanbei_huang=0;
						smg_nanbei_1=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
						delay(1);
						smg_nanbei_1=1;
//						P1=0XFF;
						P1=0X00;
						delay(1);
						smg_nanbei_2=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
						delay(1);
						smg_nanbei_2=1;
//						P1=0XFF;
						P1=0X00;
						smg_nanbei_11=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
						delay(1);
						smg_nanbei_11=1;
//						P1=0XFF;
						P1=0X00;
						delay(1);
						smg_nanbei_12=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
						delay(1);
						smg_nanbei_12=1;
//						P1=0XFF;
						P1=0X00;
						key_scan();
					
				}
			while(time<DONGXI_S&&DONGXI_S<=DONGXI_S_LV)
				{					
						led_dongxi_hong=1;
						led_dongxi_lv=0;
						led_dongxi_huang=1;
						smg_dongxi_1=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
					  delay(1);
						smg_dongxi_1=1;
//					  P1=0XFF;
					P1=0X00;
						delay(1);
						smg_dongxi_2=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
					  delay(1);
						smg_dongxi_2=1;
//					  P1=0XFF;
					P1=0X00;
					 smg_dongxi_11=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
					  delay(1);
						smg_dongxi_11=1;
//					  P1=0XFF;
						P1=0X00;
						delay(1);
						smg_dongxi_12=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
					  delay(1);
						smg_dongxi_12=1;
//					  P1=0XFF;
						P1=0X00;
						led_nanbei_hong=0;
						led_nanbei_lv=1;
						led_nanbei_huang=1;
						smg_nanbei_1=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)/10];
						delay(1);
						smg_nanbei_1=1;
//						P1=0XFF;
						P1=0X00;
						delay(1);
						smg_nanbei_2=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)%10];
						delay(1);
						smg_nanbei_2=1;
//						P1=0XFF;
						P1=0X00;
						smg_nanbei_11=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)/10];
						delay(1);
						smg_nanbei_11=1;
//						P1=0XFF;
						P1=0X00;
						delay(1);
						smg_nanbei_12=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)%10];
						delay(1);
						smg_nanbei_12=1;
//						P1=0XFF;
						P1=0X00;
						key_scan();
					
				}
				while(DONGXI_S_LV<DONGXI_S&&DONGXI_S<=DONGXI_S_HUANG)
				{
						led_dongxi_hong=1; 
						led_dongxi_lv=1;
						led_dongxi_huang=0;
						smg_dongxi_1=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_LV)/10];
					  delay(1);
						smg_dongxi_1=1;
//					  P1=0XFF;
					P1=0X00;
						delay(1);
						smg_dongxi_2=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_LV)%10];
					  delay(1);
						smg_dongxi_2=1;
//					  P1=0XFF;
					P1=0X00;
						smg_dongxi_11=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_LV)/10];
					  delay(1);
						smg_dongxi_11=1;
//					  P1=0XFF;
						P1=0X00;
						delay(1);
						smg_dongxi_12=0;
						delay(1);
						P1=SMG[(DONGXI_S-DONGXI_S_LV)%10];
					  delay(1);
						smg_dongxi_12=1;
//					  P1=0XFF;
						P1=0X00;
						led_nanbei_hong=0;
						led_nanbei_lv=1;
						led_nanbei_huang=1;
						smg_nanbei_1=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)/10];
						delay(1);
						smg_nanbei_1=1;
//						P1=0XFF;
						P1=0X00;
						delay(1);
						smg_nanbei_2=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)%10];
						delay(1);
						smg_nanbei_2=1;
//						P1=0XFF;
						P1=0X00;
						smg_nanbei_11=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)/10];
						delay(1);
						smg_nanbei_11=1;
//						P1=0XFF;
						P1=0X00;
						delay(1);
						smg_nanbei_12=0;
						delay(1);
						P1=SMG[(DONGXI_S-time)%10];
						delay(1);
						smg_nanbei_12=1;
//						P1=0XFF;
						P1=0X00;
						key_scan();
				}
			if(DONGXI_S_HUANG<=DONGXI_S)
				{
					DONGXI_S=0;
				}
			key_scan();
		}
	while(moshi==1)
	{
		led_dongxi_hong=0;
		led_dongxi_lv=1;
		led_dongxi_huang=1;
		led_nanbei_hong=1;
		led_nanbei_lv=0;
		led_nanbei_huang=1;
		delay(1);
		smg_dongxi_1=0;
	  P1=SMG[0];
		delay(1);
		smg_dongxi_1=1;
//		P1=0XFF;
		P1=0X00;
		delay(1);
		smg_dongxi_2=0;
		delay(1);
		P1=SMG[0];
		delay(1);
		smg_dongxi_2=1;
//		P1=0XFF;
		P1=0X00;
		smg_nanbei_1=0;
		delay(1);
		P1=SMG[0];
		delay(1);
		smg_nanbei_1=1;
//		P1=0XFF;
		P1=0X00;
		delay(1);
		smg_nanbei_2=0;
		delay(1);
		P1=SMG[0];
		delay(1);
		smg_nanbei_2=1;
//		P1=0XFF;
		P1=0X00;
		delay(1);
		smg_dongxi_11=0;
	  P1=SMG[0];
		delay(1);
		smg_dongxi_11=1;
//		P1=0XFF;
		P1=0X00;
		delay(1);
		smg_dongxi_12=0;
		delay(1);
		P1=SMG[0];
		delay(1);
		smg_dongxi_12=1;
//		P1=0XFF;
		P1=0X00;
		smg_nanbei_11=0;
		delay(1);
		P1=SMG[0];
		delay(1);
		smg_nanbei_11=1;
//		P1=0XFF;
		P1=0X00;
		delay(1);
		smg_nanbei_12=0;
		delay(1);
		P1=SMG[0];
		delay(1);
		smg_nanbei_12=1;
//		P1=0XFF;
		P1=0X00;
    key_scan();
	}
	while(moshi==2)
	{
		led_dongxi_hong=1;
		led_dongxi_lv=1;
		led_dongxi_huang=0;
		delay(500);
		led_dongxi_hong=1;
		led_dongxi_lv=1;
		led_dongxi_huang=1;
		delay(500);
		led_nanbei_hong=1;
		led_nanbei_lv=1;
		led_nanbei_huang=0;
		delay(500);
		led_nanbei_hong=1;
		led_nanbei_lv=1;
		led_nanbei_huang=1;
		delay(500);
		key_scan();
	}
	while(moshi==3)
	{
		TR0 = 0;
		led_dongxi_hong=1;
		led_dongxi_lv=1;
		led_dongxi_huang=1;
		led_nanbei_hong=1;
		led_nanbei_lv=1;
		led_nanbei_huang=1;
		DONGXI_S_HONG=DONGXI_S_HONG+10;
		
		if(DONGXI_S_HONG>50)
		{
			DONGXI_S_HONG=10;
		}
		DONGXI_S=0;
		moshi=0;
		TR0 = 1;
		ET0=1;
		DONGXI_S=0;
		
	}
	if(moshi==4)
	{
		moshi=0;
		TR0 = 1;
		ET0=1;
		DONGXI_S=0;
	}

	 }
 }


代码挺冗余的吧也懒得改了就这样了,做这个的时候倒是没有遇到什么特别离谱的bug,唯一的bug可能是紧急按键按多了程序可能就死掉了得重启。如果有大佬知道怎么解决的话麻烦大佬告诉我一声哈哈哈哈哈哈。后面还有一个万年历,过段时间发吧呢个遇到的一些bug还挺有意思的。后面慢慢发一些32啊这些的东西了,顺便悄咪咪说一句,如果有小伙伴想参加蓝桥杯单片机的话也可以找我交流。

红绿灯控制系统是Verilog语言中常见的课程设计项目之一。这个项目涉及到使用Verilog语言来设计一个红绿灯控制器,通过FPGA或其他可编程逻辑器件来实现真实世界中的红绿灯控制功能。 首先,我们需要定义红绿灯控制器的输入和输出。输入可能包括来自传感器的信号(检测车辆是否存在)、定时器信号(用于控制红绿灯的间隔时间)等。输出则为红绿灯控制信号,通过这个信号来控制红绿灯的状态。 然后,我们需要使用Verilog语言来描述红绿灯控制器的行为。这包括定义状态机、控制信号的生成逻辑、状态转移逻辑等。状态机可以描述红绿灯的各种状态,比如红灯状态、绿灯状态、黄灯状态等。控制信号的生成逻辑则可以根据状态机的当前状态来确定红绿灯应该处于什么状态。状态转移逻辑可以描述在何种条件下红绿灯应该由一种状态切换到另一种状态。 最后,我们需要进行仿真和综合。通过仿真可以验证我们设计的红绿灯控制器是否符合预期的行为。综合则可以将Verilog代码综合成逻辑门级的电路,然后通过FPGA或其他可编程逻辑器件来实现红绿灯控制功能。 通过这个课设,学生可以学会使用Verilog语言来进行数字逻辑设计,了解状态机的设计和应用,掌握数字系统的仿真和综合技术,并且在实际项目中学会了解数字系统设计的相关流程和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cointreau97

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值