logo资料库

单片机交通灯c程序.docx

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
#include #define uchar unsigned char #define uint unsigned int //头文件 //宏定义 //秒显示的变量 //东西数默认 //南北默认值 //设置东西方向的时间 //设置南北方向的时间 uchar data buf[4]; uchar data sec_dx=20; uchar data sec_nb=30; uchar data set_timedx=20; uchar data set_timenb=30; int n; uchar data countt0,countt1;//定时器 0 中断次数 //定义 6 组开关 k4=P3^7; sbit sbit k1=P3^5; k2=P3^6; sbit k3=P3^4; sbit sbit k5=P3^1; k6=P1^5; sbit //切换方向 //时间加 //时间减 //确认 //禁止 //夜间模式 sbit Red_nb=P2^6; sbit Yellow_nb=P2^5; sbit Green_nb=P2^4; //南北红灯标志 //南北黄灯标志 //南北绿灯标志 sbit Red_dx=P2^3; sbit Yellow_dx=P2^2; sbit Green_dx=P2^1; //东西红灯标志 //东西黄灯标志 //东西绿灯标志 bit set=0; bit dx_nb=0; bit shanruo=0; bit yejian=0; //调时方向切换键标志 =1 时,南北,=0 时,东西 //东西南北控制位 //闪烁标志位 //夜间黄灯闪烁标志位 uchar code table[11]={ //共阴极字型码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, //--0 //--1 //--2 //--3 //--4 //--5 //--6 //--7 //--8 //--9
0x00 //--NULL }; //函数的声明部分 void delay(int ms); void key(); void key_to1(); void key_to2(); void key_to3(); void display(); void logo(); void Buzzer(); //主程序 void main() { TMOD=0X11; TH1=0X3C; TL1=0XB0; TH0=0X3C; TL0=0XB0; EA=1; ET0=1; ET1=1; TR0=1; TR1=0; EX0=1; EX1=1; logo(); P2=0Xc3; sec_nb=sec_dx+5; while(1) { key(); display(); } //延时子程序 //按键扫描子程序 //键处理子程序 //显示子程序 //开机 LOGO //定时器设置 //定时器 0 置初值 0.05S //开总中断 //定时器 0 中断开启 //定时器 1 中断开启 //启动定时 0 //关闭定时 1 //开外部中断 0 //开外部中断 1 //开机初始化 // 开始默认状态,东西绿灯,南北黄灯 //默认南北通行时间比东西多 5 秒 //主循环 //调用按键扫描程序 //调用显示程序 } //函数的定义部分 void key(void) //按键扫描子程序 { if(k1!=1) { display(); if(k1!=1) { //当 K1(时间加)按下时 //调用显示,用于延时消抖 //如果确定按下
TR0=0; shanruo=0; P2=0x00; TR1=0; if(set==0) set_timedx++; else set_timenb++; if(set_timenb==100) set_timenb=1; set_timedx==100) set_timedx=1; if( sec_nb=set_timenb ; sec_dx=set_timedx; do { display(); } while(k1!=1); } } if(k2!=1) { display(); if(k2!=1) { TR0=0; shanruo=0; P2=0x00; TR1=0; if(set==0) set_timedx--; else set_timenb--; if(set_timenb==0) if( set_timenb=99; set_timedx==0 ) set_timedx=99; sec_nb=set_timenb ; sec_dx=set_timedx; do { display(); //关定时器 //闪烁标志位关 //灭显示 //启动定时 1 //设置键按下 //南北加 1S //东西加 1S //加到 100 置 1 //设置的数值赋给东西南北 //调用显示,用于延时 //等待按键释放 //当 K2(时间减)按键按下时 //调用显示,用于延时消抖 //如果确定按下 //关定时器 0 //闪烁标志位关 //灭显示 //关定时器 1 //南北减 1S //东西减 1S //减到 1 重置 99 //设置的数值赋给东西南北 //调用显示,用于延时
} while(k2!=1); //等待按键释放 } } if(k3!=1) { display(); if(k3!=1) { TR0=1; sec_nb=set_timenb; sec_dx=set_timedx; TR1=0; if(set==0) { P2=0X00; Green_dx=1; Red_nb=1; sec_nb=sec_dx+5; } else { } P2=0x00; Green_nb=1; Red_dx=1; sec_dx=sec_nb+5; } } if(k4!=1) { display(); if(k4!=1) { TR0=0; set=!set; TR1=0; dx_nb=set; do { //当 K3(确认)键按下时 //调用显示,用于延时消抖 //如果确定按下 //启动定时器 0 //从中断回复,仍显示设置过的数值 //显示设置过的时间 //关定时器 1 //时间倒时到 0 时 //灭显示 //东西绿灯亮 //南北红灯亮 //回到初值 //南北绿灯,东西红灯 //当 K4(切换)键按下 //调用显示,用于延时消抖 //如果确定按下 //关定时器 0 //取反 set 标志位,以切换调节方向 //关定时器 1 display(); //调用显示,用于延时 }
while(k4!=1); //等待按键释放 } } if(k5!=1) { display(); if(k5!=1) { TR0=0; P2=0x00; Red_dx=1; Red_nb=1; TR1=0; sec_dx=00; sec_nb=00; do { display(); } while(k5!=1); } } if(k6!=1) { display(); if(k6!=1) { TR0=0; P2=0x00; TR1=1; sec_dx=00; sec_nb=00; do { display(); } while(k6!=1); //当 K5(禁止)键按下时 //调用显示,用于延时消抖 //如果确定按下 //关定时器 //灭显示 //全部置红灯 //四个方向的时间都为 00 //调用显示,用于延时 //等待按键释放 //当 K6(夜间模式)按下 //调用显示,用于延时消抖 //如果确定按下 //关定时器 //四个方向的时间都为 00 //调用显示,用于延时 //等待按键释放 } } } void display(void) //显示子程序 { buf[1]=sec_nb/10; //第 1 位 东西秒十位
buf[2]=sec_nb%10; buf[3]=sec_dx/10; buf[0]=sec_dx%10; P1=0xff; P0=0x00; P1=0xfe; P0=table[buf[1]]; delay(1); P1=0xff; P0=0x00; P1=0xfd; P0=table[buf[2]]; delay(1); P1=0xff; P0=0x00; P1=0Xfb; P0=table[buf[3]]; delay(1); P1=0xff; P0=0x00; P1=0Xf7; P0=table[buf[0]]; delay(1); //第 2 位 东西秒个位 //第 3 位 南北秒十位 //第 4 位 南北秒个位 // 初始灯为灭的 ////灭显示 //片选 LED1 //送东西时间十位的数码管编码 //延时 //关显示 //灭显示 //片选 LED2 //送东西时间个位的数码管编码 //延时 //关显示 //关显示 //片选 LED3 //送南北时间十位的数码管编码 //延时 //关显示 //关显示 //片选 LED4 //送南北时间个位的数码管编码 //延时 } void time0(void) interrupt 1 using 1 { //定时中断子程序 TH0=0X3C; TL0=0XB0; TR0=1; countt0++; if(countt0==10) { //重赋初值 //12m 晶振 50ms//重赋初值 //重新启动定时器 //软件计数加 1 //加到 10 也就是半秒 if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1)) { //东西黄灯闪 Green_dx=0; Yellow_dx=0; } if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1)) { //南北黄灯闪 Green_nb=0; Yellow_nb=0; }
} if(countt0==20) { countt0=0; sec_dx--; sec_nb--; // 定时器中断次数=20 时(即 1 秒时) //清零计数器 //东西时间减 1 //南北时间减 1 if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1)) { //东西黄灯闪 Green_dx=0; Yellow_dx=1; } if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1)) { //南北黄灯闪 Green_nb=0; Yellow_nb=1; } if(sec_dx==0&&sec_nb==5) 时间 { sec_dx=5; shanruo=1; } if(sec_nb==0&&sec_dx==5) 时间 { sec_nb=5; shanruo=1; } if(dx_nb==0&&sec_nb==0) { P2=0x00; Green_nb=1; Red_dx=1; dx_nb=!dx_nb; shanruo=0; sec_nb=set_timenb; sec_dx=set_timenb+5; } if(dx_nb==1&&sec_dx==0) { P2=0X00; Green_dx=1; Red_nb=1; //当东西倒计时到 0 时,重置 5 秒,用于黄灯闪烁 //当南北倒计时到 0 时,重置 5 秒,用于黄灯闪烁 //当黄灯闪烁时间倒计时到 0 时, //重置东西南背方向的红绿灯 //重赋南北方向的起始值 //重赋东西方向的起始值 //当黄灯闪烁时间到 //重置东西南北的红绿灯状态 //东西绿灯亮 //南北红灯亮
dx_nb=!dx_nb; shanruo=0; sec_dx=set_timedx; sec_nb=set_timedx+5; //取反 //闪烁 //重赋东西方向的起始值 //重赋南北方向的起始值 } } } void time1(void) interrupt 3 //定时中断子程序 { TH1=0X3C; TL1=0XB0; countt1++; if(countt1==10) { //重赋初值 //12m 晶振 50ms//重赋初值 //软件计数加 1 // 定时器中断次数=10 时(即 0.5 秒) Yellow_nb=0; Yellow_dx=0; //南北黄灯灭 //东西黄灯灭 } if(countt1==20) { countt1=0; Yellow_nb=1; Yellow_dx=1; } } //外部中断 0 void int0(void) interrupt 0 using 1 { TR0=0; TR1=0; P2=0x00; Green_dx=1; Red_nb=1; sec_dx=00; sec_nb=00; } // 定时器中断次数=20 时(即 1 秒时) //清零计数器 //南北黄灯亮 //东西黄灯亮 //只允许东西通行 //关定时器 0 //关定时器 1 //灭显示 //东西方向置绿灯 //南北方向为红灯 //四个方向的时间都为 00 //外部中断 1 void int1(void) interrupt 2 using 1 { TR0=0; TR1=0; P2=0x00; Green_nb=1; //只允许南北通行 //关定时器 0 //关定时器 1 //灭显示 //置南北方向为绿灯
分享到:
收藏