基于单片机的交通灯控制系统设计.docx
- 文档编号:25820384
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:19
- 大小:48.33KB
基于单片机的交通灯控制系统设计.docx
《基于单片机的交通灯控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯控制系统设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于单片机的交通灯控制系统设计
#include
#defineucharunsignedchar//宏定义"uchar"代替"unsignedchar"。
#defineuintunsignedint//宏定义"uint"用来定义无符号整型数。
//数码管段选定义0123456789
ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
//ABCDEF不显示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//断码
uchardis_smg[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
ucharsmg_i=4;//显示数码管的个位数
//数码管位选定义
sbitsmg_we1=P2^0;//数码管位选定义
sbitsmg_we2=P2^1;
sbitsmg_we3=P3^6;
sbitsmg_we4=P3^7;
chardx_s=0;//东西南北倒计时变量
sbitdx_red=P2^4;//东西红灯
sbitdx_green=P2^3;//东西绿灯
sbitdx_yellow=P2^2;//东西黄灯
sbitnb_red=P2^7;//南北红灯
sbitnb_green=P2^6;//南北绿灯
sbitnb_yellow=P2^5;//南北黄灯
sbitscl=P3^4;//写24C02时钟
sbitsda=P3^5;//写24C02数据
ucharflag_jtd_mode;//交通灯的模式根据时间
bitflag_1s=0;
bitflag_500ms;
bitflag_dx_nb;//东西南北模式
ucharflag_5m_value;
uchari;
ucharflag_alarm;//模式
uchardx_time=30,nb_time=20;//东西、南北的时间
ucharflag_jdgz;//交通管制
//---延时函数---//
voiddelay()
{;;}
voidstart()//起始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
voidstop()//停止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
voidrespons()//应答信号
{
uchari;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
voidinit()//初始状态,24C02的数据和时钟线都拉高
{
sda=1;
delay();
scl=1;
delay();
}
voidwritebyte(uchardate)//写24C02
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
ucharreadbyte()//读24C02
{
uchari,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
returnk;
}
voidwriteadd(ucharaddress,uchardate)//写24C02
{
start();//起始信号
writebyte(0xa0);//写入器件地址写
respons();
writebyte(address);//写入存储单元地址
respons();
writebyte(date);//写入数据
respons();
stop();//停止信号
}
ucharreadadd(ucharaddress)//读24C02
{
uchardate;
start();//起始信号
writebyte(0xa0);//写入器件地址写
respons();
writebyte(address);//写入读单元地址
respons();
start();//起始信号
writebyte(0xa1);//读命令
respons();
date=readbyte();//读数据
stop();//停止信号
returndate;
}
/***********************数码位选函数*****************************/
voidsmg_we_switch(uchari)
{
switch(i)
{
case0:
smg_we1=0;smg_we2=1;smg_we3=1;smg_we4=1;break;
case1:
smg_we1=1;smg_we2=0;smg_we3=1;smg_we4=1;break;
case2:
smg_we1=1;smg_we2=1;smg_we3=0;smg_we4=1;break;
case3:
smg_we1=1;smg_we2=1;smg_we3=1;smg_we4=0;break;
}
}
/********************************************************************
*名称:
delay_1ms()
*功能:
延时1ms函数
*输入:
q
*输出:
无
***********************************************************************/
voiddelay_1ms(uintq)
{
uinti,j;
for(i=0;i for(j=0;j<110;j++); } /******************************************************************** *名称: display() *功能: 数码管显示 *输入: 无 *输出: 无 ***********************************************************************/ voiddisplay() { uchari; for(i=0;i { P0=0xff;//消隐 smg_we_switch(i);//位选 P0=dis_smg[i];//段选 delay_1ms(3); } } /*********************定时器0、定时器1初始化******************/ voidtime0_init() { EA=1;//开总中断 TMOD=0X11;//定时器0、定时器1工作方式1 ET0=1;//开定时器0中断 TR0=1;//允许定时器0定时 } /*********************交通灯处理函数*********************************/ voidjiaotongdeng_dis() { chardx,nb; if(flag_dx_nb==0) { dx=dx_s; nb=dx_s-5; if(nb<=0)nb=dx_s; } if(flag_dx_nb==1) { dx=dx_s-5; nb=dx_s; if(dx<=0)dx=dx_s; } if(flag_1s==1) {dx_s--; flag_1s=0; if(dx_s==0) { if(flag_dx_nb==1) dx_s=nb_time;//南北时间 else dx_s=dx_time;//东西时间 flag_dx_nb=~flag_dx_nb; } } dis_smg[0]=smg_du[dx%10]; dis_smg[1]=smg_du[dx/10]; dis_smg[2]=smg_du[nb%10]; dis_smg[3]=smg_du[nb/10]; /***********************南北时间*********************************/ if(flag_dx_nb==0) { if(dx_s>5) { dx_red=1;//灭 dx_green=0;//亮 dx_yellow=1;//灭 nb_red=0;//亮 nb_green=1;//灭 nb_yellow=1;//灭 flag_5m_value=0; }elseif(dx_s<=5)//当小于5秒时黄灯要闪了 { dx_red=1;//灭 dx_green=1;//灭 nb_red=0;//亮 nb_green=1;//灭 nb_yellow=1;//灭 if(flag_500ms==0) { dx_yellow=0;//亮 } else { dx_yellow=1;//灭 } } } /***********************东西时间*********************************/ if(flag_dx_nb==1) { if(dx_s>5) { dx_red=0;//亮 dx_green=1;//灭 dx_yellow=1;//灭 nb_red=1;//灭 nb_green=0;//亮 nb_yellow=1;//灭 flag_5m_value=0; }elseif(dx_s<=5)//当小于5秒时黄灯要闪了 { dx_red=0;//灭 dx_green=1;//灭 dx_yellow=1;//灭 nb_red=1;//灭 nb_green=1;//灭 if(flag_500ms==0)//黄灯闪烁 { nb_yellow=0;//亮 } else { nb_yellow=1;//灭 } } } } /********************独立按键程序*****************/ ucharkey_can;//按键值 voidkey()//独立按键程序 { staticucharkey_new; key_can=20;//按键值还原 P1|=0x1f; if((P1&0x1f)! =0x1f)//按键按下 { delay_1ms (1);//按键消抖动 if(((P1&0x1f)! =0x1f)&&(key_new==1)) {//确认是按键按下 key_new=0; switch(P1&0x1f) { case0x1e: key_can=1;break;//得到按键值 case0x1d: key_can=2;break;//得到按键值 case0x1b: key_can=3;break;//得到按键值 case0x17: key_can=4;break;//得到按键值 } } } else key_new=1; } ucharmenu_1,flag_s; /********************设置函数*****************/ voidkey_with() { if(key_can==4)//交通管制按键 { flag_jdgz++; if(flag_jdgz>5) flag_jdgz=0; if(flag_jdgz==1)//全部亮红灯 { dx_red=0;//亮 dx_green=1;//灭 dx_yellow=1;//灭 nb_red=0;//亮 nb_green=1;//灭 nb_yellow=1;//灭 } if(flag_jdgz==2)//东西红灯南北绿灯 { dx_red=0;//亮 dx_green=1;//灭 dx_yellow=1;//灭 nb_red=1;//灭 nb_green=0;//亮 nb_yellow=1;//灭 } if(flag_jdgz==3)//南北红灯东西绿灯 { dx_red=1;//灭 dx_green=0;//亮 dx_yellow=1;//灭 nb_red=0;//亮 nb_green=1;//灭 nb_yellow=1;//灭 } if(flag_jdgz==4)//南北绿灯东西绿灯 { dx_red=1;//灭 dx_green=0;//亮 dx_yellow=1;//灭 nb_red=1;//灭 nb_green=0;//亮 nb_yellow=1;//灭 } if(flag_jdgz==5)//南北黄灯东西黄灯 { dx_red=1;//灭 dx_green=1;//灭 dx_yellow=0;//亮 nb_red=1;//灭 nb_green=1;//灭 nb_yellow=0;//亮 } } if(key_can==1)//设置键 { menu_1++; if(menu_1>=3) { menu_1=0; } } if(menu_1==1)//设置东西的时间 { if(key_can==2) { dx_time++;//加1 if(dx_time>99) dx_time=99; } if(key_can==3) { dx_time--;//减1 if(dx_time<=10) dx_time=10; } dis_smg[0]=smg_du[10];//显示为A dis_smg[1]=smg_du[10];//显示为A dis_smg[2]=smg_du[dx_time%10];//显示东西设置的时候 dis_smg[3]=smg_du[dx_time/10]; writeadd(4,dx_time);//保存数据 } if(menu_1==2)//设置南北的时间 { if(key_can==2) { nb_time++;//加1 if(nb_time>99) nb_time=99; } if(key_can==3) { nb_time--;//减1 if(nb_time<=10) nb_time=10; } dis_smg[0]=smg_du[11];//显示为B dis_smg[1]=smg_du[11];//显示为B dis_smg[2]=smg_du[nb_time%10];//显示东西设置的时候 dis_smg[3]=smg_du[nb_time/10]; writeadd(2,nb_time);//保存数据 } } /******************************************************************** *名称: main() *功能: 实现灯的闪烁 *输入: 无 *输出: 无 ***********************************************************************/ voidmain() { time0_init(); init();//24C02初始化 nb_time=readadd (2);//读取地址2处一个字节给 dx_time=readadd(4);//读取地址4处一个字节给 if(nb_time>99)nb_time=20; if(dx_time>99)dx_time=30; dx_s=nb_time;//东西时间 while (1) { key(); if(key_can<20) key_with(); if((menu_1==0)&&(flag_jdgz==0)) jiaotongdeng_dis(); display(); } } /*********************定时器0中断服务程序************************/ voidtime0_int()interrupt1 { staticucharvalue;//定时10ms中断一次 TH0=0x3c; TL0=0xb0;//50ms value++; flag_5m_value++; if(flag_5m_value%10==0) flag_500ms=~flag_500ms; if(value>=20) { value=0; flag_1s=1; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 交通灯 控制系统 设计