基于单片机的交通灯设计.docx
- 文档编号:2650662
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:16
- 大小:50.88KB
基于单片机的交通灯设计.docx
《基于单片机的交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯设计.docx(16页珍藏版)》请在冰点文库上搜索。
基于单片机的交通灯设计
基于at89c51的交通灯设计
该设计的功能有交通灯倒计时,红绿黄显示,手动控制,日历显示(初始值为11月20日7时01分)。
要做实验设计的拿去用吧,设计思路什么的就自己写。
原创
东北大学秦皇岛分校
交通灯程序:
#include
#defineucharunsignedchar//宏定义uchar
#defineuintunsignedint//宏定义uint
sbitRED_DONGXI=P1^0;//南北方向红灯亮
sbitYELLOW_DONGXI=P1^1;//南北方向黄灯亮
sbitRED_NANBEI=P1^3;//东西方向红灯亮
sbitGREEN_DONGXI=P1^2;//南北方向绿灯亮
sbitYELLOW_NANBEI=P1^4;//东西方向黄灯亮
sbitGREEN_NANBEI=P1^5;//东西方向绿灯亮
sbitDXweixuan1=P1^6;//南北方向数码管位选1
sbitDXweixuan2=P1^7;//南北方向数码管位选2
sbitNBweixuan1=P3^0;//东西方向数码管位选1
sbitNBweixuan2=P3^1;//东西方向数码管位选2
sbitL1=P3^5;
sbitL2=P3^6;
sbitL3=P3^7;//数码管显示位月、日、时、分选控制端
uintaa,bai,shi,ge,bb;
uintshi1,ge1,shi2,ge2,minute=00,hour=07,day=20,month=11;//月日时分初始值设定
uintmonth1,month2,day1,day2,hour1,hour2,minute1,minute2;//定义变量
/*数码管显示0-9*/
uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uintcodetable1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
/*子函数声明*/
voiddelay(uintz);
voiddelay0(uintz);
voidinit(uinta);
voiddisplay(uintshi1,uintge1,uintshi2,uintge2);
voidxtimer0();
voidinit1();
voidinit2();
voidinit3();
voidinit4();
voidinit5();
voidinit6();
voiddisplay1();
/*********************************************************
主函数
*********************************************************/
voidmain()
{
P0=0xFF;
P1=0xFF;
P2=0x00;
P3=0xFF;
EA=1;//打开外部中断
EX0=1;//允许外部中断0中断
IT0=0;
EX1=1;//允许外部中断1中断
IT1=0;
display1();//INT0为沿触发方式
init1();//第1个位状态
while
(1)
{
init6();//第6个状态
init2();//第2个状态
init3();//第3个状态
init4();//第4个状态
init5();//第5个状态
}
}
voidinit1()//预备状态东、西、南、北方向均亮红灯3S
{
uinttemp;
temp=3;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while
(1)
{
RED_DONGXI=0;
RED_NANBEI=0;
GREEN_DONGXI=1;
GREEN_NANBEI=1;
YELLOW_DONGXI=1;
YELLOW_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自减
}
shi1=shi2=temp/10;//显示十位
ge1=ge2=temp%10;//显示个位
if(temp==0)
{
temp=5;//变量赋值为5
break;
}
display(ge1,shi1,ge2,shi2);//显示红绿灯显示剩余时间
display1();//显示年、月、日
}
}
voidinit2()//第二个状态:
东西亮红灯30S~5S、南北亮绿灯25~0S;
{
uinttemp;
temp=26;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while
(1)
{
RED_DONGXI=1;
RED_NANBEI=0;
GREEN_DONGXI=0;
GREEN_NANBEI=1;
YELLOW_DONGXI=1;
YELLOW_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自增
shi1=(temp+5)/10;//显示十位
ge1=(temp+5)%10;//显示个位
shi2=temp/10;
ge2=temp%10;
if(temp==0)//定时25S
{
temp=26;//变量清0
break;
}
}
display(ge1,shi1,ge2,shi2);
display1();
}
}
voidinit3()//第三个状态:
南北绿灯变为黄灯闪5s、东西方向亮红灯5S
{
uinttemp;
temp=6;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while
(1)
{
RED_NANBEI=0;
GREEN_DONGXI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自增
YELLOW_DONGXI=~YELLOW_DONGXI;
shi1=temp/10;
shi2=shi1;//显示十位
ge1=temp%10;
ge2=ge1;//显示个位
}
if(temp==0)//定时5S
{
temp=6;//变量赋值
break;
}
display(ge1,shi1,ge2,shi2);
display1();
}
}
voidinit4()//第四个状态:
东西亮绿灯25~0S,南北方向亮红灯30~5S;
{
uinttemp;
temp=26;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while
(1)
{
RED_DONGXI=0;
RED_NANBEI=1;
YELLOW_DONGXI=1;
GREEN_NANBEI=0;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自增
shi1=temp/10;
shi2=(temp+5)/10;//显示十位
ge1=temp%10;
ge2=(temp+5)%10;//显示个位
if(temp==0)//定时25S
{
temp=26;//变量清0
break;
}
}
display(ge1,shi1,ge2,shi2);
display1();
}
}
voidinit5()//第五个状态:
东西闪黄灯5~0s、南北红灯5S
{
uinttemp;
temp=6;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while
(1)
{
RED_NANBEI=1;
RED_DONGXI=0;
GREEN_DONGXI=1;
GREEN_NANBEI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自增
YELLOW_NANBEI=~YELLOW_NANBEI;
shi1=temp/10;
shi2=shi2;//显示十位
ge1=temp%10;
ge2=ge1;//显示个位
if(temp==0)//定时100S
{
temp=6;//变量清0
break;
}
}
display(ge1,shi1,ge2,shi2);
display1();
}
}
voidinit6()//显示年、月、日
{
minute++;
month1=month/10;
month2=month%10;
day1=day/10;
day2=day%10;
hour1=hour/10;
hour2=hour%10;
minute1=minute/10;
minute2=minute%10;
if(minute==60)
{
hour++;
if(hour==24)
{
day++;
if(day==30)
{
month++;
}
}
}
}
/*显示子函数*/
voiddisplay1()
{
L1=0,L2=0,L3=0;
P2=table1[month1];delay0
(2);
L1=1,L2=0,L3=0;
P2=table1[month2];delay0
(2);
L1=0,L2=1,L3=0;
P2=table1[day1];delay0
(2);
L1=1,L2=1,L3=0;
P2=table1[day2];delay0
(2);
L1=0,L2=0,L3=1;
P2=table1[hour1];delay0
(2);
L1=1,L2=0,L3=1;
P2=table1[hour2];delay0
(2);
L1=0,L2=1,L3=1;
P2=table1[minute1];delay0
(2);
L1=1,L2=1,L3=1;
P2=table1[minute2];delay0
(2);
}
voiddisplay(uintshi1,uintge1,uintshi2,uintge2)
{
DXweixuan1=0;
DXweixuan2=1;
NBweixuan1=1;
NBweixuan2=1;
P0=table[ge1];//显示十位
delay0(5);
DXweixuan1=1;
DXweixuan2=0;
NBweixuan1=1;
NBweixuan2=1;
P0=table[shi1];//显示个位
delay0(5);
DXweixuan1=1;
DXweixuan2=1;
NBweixuan1=0;
NBweixuan2=1;
P0=table[ge2];//显十位
delay0(5);
DXweixuan1=1;
DXweixuan2=1;
NBweixuan1=1;
NBweixuan2=0;
P0=table[shi2];//显示个位
delay0(5);
}
voidxint0()interrupt0//外部中断0
{
RED_NANBEI=0;
RED_DONGXI=0;
GREEN_NANBEI=1;
GREEN_DONGXI=1;
YELLOW_NANBEI=1;
YELLOW_DONGXI=1;
P0=0x00;
NBweixuan1=0;
NBweixuan2=0;
DXweixuan1=0;
DXweixuan2=0;
display1();
return;
}
voidxint1()interrupt2//外部中断1
{
RED_NANBEI=1;
RED_DONGXI=1;
GREEN_NANBEI=0;
GREEN_DONGXI=0;
YELLOW_NANBEI=1;
YELLOW_DONGXI=1;
P0=0x00;
NBweixuan1=0;
NBweixuan2=0;
DXweixuan1=0;
DXweixuan2=0;
display1();
return;
}
/*定时中断子函数*/
voidxtimer0()interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
aa++;
}
/*延时子函数*/
voiddelay0(uintz)
{uinti,j;
for(i=0;i for(j=0;j<110;j++); } voiddelay(unsignedintj) { unsignedchark; unsignedinti; for(;j>0;j--) { for(i=1250;i>0;i--) { for(k=180;k>0;k--); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 交通灯 设计