标题:
实训单片机交通灯软件程序
[打印本页]
作者:
xiongda
时间:
2015-5-26 19:42
标题:
实训单片机交通灯软件程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count=0,i;
uchar num=30;
uchar flag=0,flag2=0,flag3=0;
sbit K1=P2^0;
sbit Stop=P3^4;
sbit LEDGreen_ew=P1^0;
sbit LEDYellow_ew=P1^1;
sbit LEDRed_ew=P1^2;
sbit LEDGreen_sn=P1^3;
sbit LEDYellow_sn=P1^4;
sbit LEDRed_sn=P1^5;
void Turn_LED();
void Delay(uint z);
void Sys_Inital();
void Turnkey();
void delay10ms();
void main()
{
Sys_Inital();
while(1)
{
Turnkey();
}
}
void Turn_LED()
{
if(count==20) //定时时间为1s
{
count=0;
num--;
if(num==0)
{
flag++;
if(flag==3)
{flag=0;}
if(flag==1)
{num=2;}
switch(flag%3)
{
case 0:
LEDGreen_ew=0;LEDYellow_ew=1;LEDRed_ew=1;
LEDGreen_sn=1;LEDYellow_sn=1;LEDRed_sn=0;
break;
case 1:
LEDGreen_ew=1;LEDYellow_ew=0;LEDRed_ew=1;
LEDGreen_sn=1;LEDYellow_sn=0;LEDRed_sn=1;
break;
case 2:
LEDGreen_ew=1;LEDYellow_ew=1;LEDRed_ew=0;
LEDGreen_sn=0;LEDYellow_sn=1;LEDRed_sn=1;
break;
}
num=30;
}
}
}
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay10ms()
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Sys_Inital()
{
TMOD = 0x01;
TH0 = 0x3C; //定时器0高8位
TL0 = 0xB0; //定时器0低8位
EA = 1; //开总中断
ET0 = 1; //定时器0中断允许
TR0=1; //定时器0开始计时
EX0=1; //外部中断0允许
IT0=1;
LEDGreen_ew=1;
LEDYellow_ew=1;
LEDRed_ew=1;
LEDGreen_sn=1;
LEDYellow_sn=1;
LEDRed_sn=1;
}
void Turnkey()
{
if(K1==0)
{
delay10ms();
if(K1==0)
{
flag3++;
while((i<50)&&(K1==0))
{
delay10ms();
i++;
}
i=0;
}
}
if(flag3==2)
{
flag3=0;
num=30;
}
}
void int0() interrupt 0
{
EA=0; //关中断
Delay(10); //设置键消抖 10ms
if(!Stop)
{
flag2++;
if(flag2==2)
{flag2=0;}
switch(flag2)
{
case 0:TMOD=0x01;TR0=1; break;
case 1:TMOD=0x00; TR0=0; break;
}
while((i<50)&&(Stop==0))
{
delay10ms();
i++;
}
i=0;
}
EA=1; //开中断
}
void time0() interrupt 1
{
TH0=0x3c; //定时时间为50ms
TL0=0xb0;
count++;
}
作者:
xiongda
时间:
2015-5-26 19:43
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int //***********参数初始化********************
uchar count=0,count2=0; //定时器0,定时器1的计数初值
uchar green_ns=60,green_ew=30,red_ns=34,red_ew=64,yellow_ns=4,yellow_ew=4;//南北绿灯亮60 东西绿灯30 南北红灯34 东西红灯64 南北黄灯4 东西黄灯4
uchar snorth=60,ewest=64; //上电后南北绿灯亮60秒,东西红灯亮64秒
uchar ding_ns=0,ding_ew=0; //南北状态转换标志位,东西状态转换标志位
uchar flag=0,flag2=0; //设置键按下次数的标志位,长按键的标志位
//***********引脚定义**********************
sbit wela=P2^0; //锁存器位选
sbit dula=P2^1; //锁存器位选
sbit NS_R=P2^2; //南北发光二极管
sbit NS_Y=P2^3;
sbit NS_G=P2^4;
sbit EW_R=P2^5; //东西发光二极管
sbit EW_Y=P2^6;
sbit EW_G=P2^7;
sbit set=P3^2; //按键 设置键 加1键 减1键
sbit up=P3^4;
sbit down=P3^5;
//*********函数声明部分******************
void delay(uint z);
void Inital();
void display(uchar s);
void display_ew(uchar w)
void display_ns(uchar r);
void turnkey();
void show();
//*********共阳数码管段码***************
unsigned char code SEG7[10]= { 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/};
//*******软件延时函数 延时1毫秒*********
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//********初始化函数*******************
void Inital()
{
wela=0; //锁存器初始化
dula=0;
TMOD = 0x11;
//计数器0,1工作在方式1,数值大小16位,定时时间=12*(65536-x)/f x为初值,f为时钟频率
TH0 = 0xD8; //定时器0高8位
TL0 = 0xF0; //定时器0低8位
EA = 1; //开总中断
ET0 = 1; //定时器0中断允许
TR0=1; //定时器0开始计时
TH1=0xD8; //定时器1高8位
TL1=0xF0; //定时器1低8位
ET1 = 1; //定时器1中断允许
EX0=1; //外部中断0允许
IT0=0; //外部中断0电平触发
NS_R=1; //南北发光二极管初始化
NS_G=0;
NS_Y=1;
EW_R=0; //东西发光二极管初始化
EW_G=1;
EW_Y=1;
}
//**********数码管显示函数*************
void display(uchar s)
{
P1=SEG7[s];
}
//*******数码管显示东西方向数字********
void display_ew(uchar w)
{
uchar x,y,i=0;
x=w%10; //个位
y=w/10; //十位
dula=1;
display(x);
dula=0;
P1=0x00;
wela=1;
P1=0x04;
wela=0;
delay(5);
dula=1;
display(y);
dula=0;
P1=0x00;
wela=1;
P1=0x08;
wela=0;
delay(5);
}
//*******数码管显示南北方向数字********
void display_ns(uchar r)
{
uchar x,y,i=0;
x=r%10; //个位
y=r/10; //十位
dula=1;
display(x);
dula=0;
P1=0x00;
wela=1;
P1=0x01;
wela=0;
delay(5);
dula=1;
display(y);
dula=0;
P1=0x00;
wela=1;
P1=0x02;
wela=0;
delay(5);
}
// **********键盘扫描函数************
void turnkey()
{
flag2=0; //扫描之前加10减10标志位清零
if(!up)
{
delay(10); //按键消抖 时10ms
if(!up)
{
TR1=1; //定时器1开始1s定时,用于键盘扫描的定时数值加10
while(!up)
{
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
NS_G=0;
break;
case 2:
display_ns(yellow_ns);
NS_Y=0;break;
case 3:
display_ew(green_ew);
EW_G=0;
break;
case 4:
display_ew(yellow_ew);
EW_Y=0;
break;
}
}
while(!up); //等待按键结束
delay(10); //按键消抖 延时10ms
while(!up);
TR1=0; //定时器1结束
if(count2>=100)
{
flag2=1;
count2=0;
switch(flag2%3)
{
case 0:break;
case 1:
switch(flag)
{
case 0:break;
case 1:
green_ns+=9;
if(green_ns>99)
green_ns=0;
break;
case 2:break;
case 3:
green_ew+=9;
if(green_ew>99)
green_ew=0;
break;
case 4:break;
}
break;
case 2:
switch(flag)
{
case 0:break;
case 1:
green_ns-=9;
if(green_ns<=0)
{
green_ns=99;
}
break;
case 2:break;
case 3:
green_ew-=9;
if(green_ew<=0)
{
green_ew=99;
}
break;
case 4:break;
}
break;
}
}
switch(flag) //短按键加一
{
case 0:break;
case 1:
//南北绿灯加一
green_ns++;
if(green_ns==100)
green_ns=0;
red_ew=green_ns+yellow_ns;
break;
case 2:
//南北黄灯加一
yellow_ns++;
if(yellow_ns==10)
yellow_ns=0;
red_ew=green_ns+yellow_ns;
break;
case 3:
//东西绿灯加一
green_ew++;
if(green_ew==100)
green_ew=0;
red_ns=green_ew+yellow_ew;
break;
case 4:
//东西黄灯处理加一
yellow_ew++;
if(yellow_ew==10)
yellow_ew=0;
red_ns=green_ew+yellow_ew;
break;
}
}
}
if(!down)
{
delay(10); //按键消抖 延时10ms
if(!down)
{
TR1=1; //定时器1开始计时
while(!down)
{
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
NS_G=0;
break;
case 2:
display_ns(yellow_ns);
NS_Y=0;
break;
case 3:
display_ew(green_ew);
EW_G=0;
break;
case 4:
display_ew(yellow_ew);
EW_Y=0;
break;
}
}
while(!down); //等待按键结束
delay(10); //按键消抖 延时10ms
while(!down);
TR1=0; //定时器1结束计时
if(count2>=100)
{
flag2=2;
count2=0;
switch(flag2%3)
{
case 0:break;
case 1:
switch(flag)
{
case 0:break;
case 1:
green_ns+=9;
if(green_ns>99)
green_ns=0;
break;
case 2:
break;
case 3:
green_ew+=9;
if(green_ew>99)
green_ew=0;
break;
case 4:
break;
}
break;
case 2:
switch(flag)
{
case 0:break;
case 1:
green_ns-=9;
if(green_ns<=0)
{
green_ns=99;
}
break;
case 2:break;
case 3:
green_ew-=9;
if(green_ew<=0)
{
green_ew=99;
}
break;
case 4:break;
}
break;
}
}
switch(flag) //短按键减一
{
case 0:break;
case 1: //南北绿灯减一
green_ns--;
if(green_ns==255)
{
green_ns=99;
}
red_ew=green_ns+yellow_ns;
break;
case 2: //南北黄灯减一
yellow_ns--;
if(yellow_ns==255)
yellow_ns=9;
red_ew=green_ns+yellow_ns;
break;
case 3:
green_ew--;
if(green_ew==255)
green_ew=99;
red_ns=green_ew+yellow_ew;
break;
case 4: //东西黄灯减一
yellow_ew--;
if(yellow_ew==255)
{
yellow_ew=9;
}
red_ns=green_ew+yellow_ew;
break;
}
}
}
} //*************闪烁显示函数*****************
void show()
{
switch(count/17) //1秒 亮3次灭3次
{
case 0:
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
break;
case 2:
display_ns(yellow_ns);
break;
case 3:
display_ew(green_ew);
break;
case 4:
display_ew(yellow_ew);
break;
}
break;
case 1:break;
case 2:
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
break;
case 2:
display_ns(yellow_ns);
break;
case 3:
display_ew(green_ew);
break;
case 4:
display_ew(yellow_ew);
break;
}
break;
case 3:break;
case 4:
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
break;
case 2:
display_ns(yellow_ns);
break;
case 3:
display_ew(green_ew);
break;
case 4:
display_ew(yellow_ew);
break;
}
break;
}
}
//***************主函数*********************
void main()
{
Inital(); //初始化函数
while(1)
{
if(flag==0)
{
display_ns(snorth);
display_ew(ewest);
}
else
if(flag!=0)
{
turnkey(); // 键盘扫描函数
show();
//闪烁显示函数
}
}
}
//*************定时器0中断函数**************
void time0() interrupt 1
{
TH0=0xD8; //定时时间为10ms
TL0=0xF0;
count++;
if(count==100)
//定时时间为1s
{
count=0;
if(flag==0)
{
snorth--;
//南北数字减1
ewest--;
//东西数字减1
if(snorth==0)
{
ding_ns++;
//南北下一状态处理
switch(ding_ns%3)
{
case 0: snorth=green_ns;
NS_R=1;
NS_G=0;
NS_Y=1;
break;
case 1: snorth=yellow_ns;
NS_R=1;
NS_G=1;
NS_Y=0;
break;
case 2: snorth=red_ns;
NS_R=0;
NS_G=1;
NS_Y=1;
break;
}
}
if(ewest==0)
{
ding_ew++;
//东西下一状态处理
switch(ding_ew%3)
{
case 0:ewest=red_ew;
EW_R=0
EW_G=1;
EW_Y=1;
break;
case 1:ewest=green_ew;
EW_R=1;
EW_G=0;
EW_Y=1;
break;
case 2: ewest=yellow_ew;
EW_R=1;
EW_G=1;
EW_Y=0;
break;
}
}
}
}
} //*********外部中断处理函数(设置键)************
void int0() interrupt 0
{
EA=0; //关中断
if(!set)
{
delay(10); //设置键消抖 10ms
if(!set)
{
NS_R=1;
NS_G=1;
NS_Y=1;
EW_R=1;
EW_G=1;
EW_Y=1;
flag++;
}
while(!set);
delay(10);
while(!set);
switch(flag)
{
case 0:break;
case 1:
NS_R=1;
//南北发光二极管
NS_G=0;
NS_Y=1;
EW_R=1;
//东西发光二极管
EW_G=1;
EW_Y=1;
display_ns(green_ns);
break;
case 2:
NS_R=1;
//南北发光二极管
NS_G=1;
NS_Y=0;
EW_R=1;
//东西发光二极管
EW_G=1;
EW_Y=1;
display_ns(yellow_ns);
break;
case 3:
NS_R=1;
//南北发光二极管
NS_G=1;
NS_Y=1;
EW_R=1;
//东西发光二极管
EW_G=0;
EW_Y=1;
display_ew(green_ew);
break;
case 4:
NS_R=1;
//南北发光二极管
NS_G=1;
NS_Y=1;
EW_R=1;
//东西发光二极管
EW_G=1;
EW_Y=0;
display_ew(yellow_ew);
break;
}
if(flag==5)
{
flag=0;
//改值后的初始化红绿灯状态和数码管数字
snorth=green_ns;
ewest=red_ew;
NS_R=1;
NS_G=0;
NS_Y=1;
EW_R=0;
EW_G=1;
EW_Y=1;
ding_ns=0;
ding_ew=0;
}
}
EA=1;
//开中断
}
//***********定时器1中断函数****************
void time1() interrupt 3
{
TH1=0xD8;
TL1=0xF0;
count2++;
} 红
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit AA=P2^2; // 南北红
sbit BB=P2^3; // 南北黄
sbit CC=P2^4; // 南北绿
sbit DD=P2^5; // 东西红
sbit EE=P2^6; // 东西黄
sbit FF=P2^7; // 东西绿
void delay(uint z);
void main()
{
while(1)
{
AA=0;
BB=0;
CC=0;
DD=0;
EE=0;
FF=0;
delay(500);
AA=1;
BB=1;
CC=1;
DD=1;
EE=1;
FF=1;
delay(500);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} 数码管显示检测程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count=0;
ucharcount2=0,green_ns=60,
green_ew=30,red_ns=34,red_ew=64,
yellow_ns=4,yellow_ew=4;//南北绿灯亮60 东西绿灯30 南北红灯34 东西红灯64 南北黄灯4 东西黄灯4
uchar ding_ns=0,ding_ew=0,flag=0,snorth=60,ewest=64; //计数到0后的处理,开始南北绿灯亮的时间,东西红灯亮的时间
void delay(uint z);
void display(uchar s);
sbit LED_EW_0=P2^0; //数码管 位选段
sbit LED_EW_1=P2^1;
sbit LED_NS_0=P2^2;
sbit LED_NS_1=P2^3;
unsigned char code SEG7[10]=
{ 0xC0,/*0*/ // 共阳数码管 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/0x90,/*9*/ };
void delay(uint z) //1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar s) //数码管显示程序
{
P1=SEG7[s];
}
void main()
{
while(1)
{
LED_EW_0=1;
LED_EW_1=1;
LED_NS_0=1;
LED_NS_1=1;
P1=0x00;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1