部分代码如下:
- #include<reg51.h>typedef unsigned char u8;
- typedef unsigned int u16;
- sbit LSA=P2^2;//使用138译码器控制8个灯
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- #define GPIO_DIG P0//数码管段选,宏定义到P0
- #define GPIO_TRAFFIC P1//交通灯的8个端口p1
- sbit RED10=P1^0; //前进路人行道的红灯
- sbit GREEN10=P1^1;//前进路人行道的绿灯
- sbit RED11=P1^2;//上方公路的红灯
- sbit YELLOW11=P1^3;//上方公路的黄灯
- sbit GREEN11=P1^4;//上方公路绿灯
- sbit RED00=P3^0;//上方人行道的红灯(其它的有8个管脚控制,这个用单片机管脚控制)
- sbit GREEN00=P3^1;//上方人行道的绿灯(其它的有8个管脚控制,这个用单片机管脚控制)
- sbit RED01=P1^5;//前进路的红灯
- sbit YELLOW01=P1^6;//前进路的黄灯
- sbit GREEN01=P1^7;//前进路的绿灯
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- u8 second;//存储时间数据
- u8 DispalyData[8];//全局变量,保存动态数码管显示时间的数组
- void delay(u16 i)
- {
- while(i--);
- }
- void Timer0lnit()//初始化
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动(用0001转化为16进制)(低4位T0)(TMOD=TMOD|0x01,防止对前面其他位产生影响)
- TH0=0XFC;//给定时器赋初值,定时1ms(65535-1000+1,结果转换为16进制)
- TL0=0X18;//由低四位溢向高四位,所以是0x18
- ET0=1;//打开定时器0中断允许位
- EA=1;//打开中断
- TR0=1;//打开定时器(T0寄存器控制位,置1开始工作,置0停止工作,软件控制启动和停止)
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- GPIO_DIG=DispalyData[i];//相当于调用smgduan[17]的数组内容
- delay(100); //间隔一段时间扫描
- GPIO_DIG=0x00;//消隐
- }
- }
- void main()
- {
- second=1;
- Timer0lnit();//定时器0初始化
- while(1)
- {
- if(second==70)
- {
- second=1;
- }
- if(second<30)
- {
- DispalyData[0]=0x00;//对于共阴数码管是不点亮的意思,(同是低电平)
- DispalyData[1]=0x00;//同上
- DispalyData[2]=smgduan[(30-second)%100/10];//取十位赋值到DispalyData[i]位选,进而调用smgduan[17]数组里面的数据
- DispalyData[3]=smgduan[(30-second)%10];//取个位同上
-
- DispalyData[4]=0x00;//前两位不显示,代表另外一路口的红绿灯
- DispalyData[5]=0x00;
- DispalyData[6]=DispalyData[2];//后两位显示
- DispalyData[7]=DispalyData[3];
- DigDisplay();
-
- GPIO_TRAFFIC=0xff;//所有初始灯关闭
- RED00=1;//它内部电路接在高电平,所以给它高电平就是关闭状态
- GREEN00=1;//同上
-
-
- GREEN11=0;//上方公路绿灯
- RED00=0;//上方人行道红灯
-
- RED01=0;//前进路红灯
- GREEN10=0;//前进路人行道绿灯
- }
复制代码
|