- #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;
- }
- }
- }
复制代码 |