单片机源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DIG0 0x01 // 定义数码管1
- #define DIG1 0x02 // 定义数码管2
- #define DIG2 0x03 // 定义数码管3
- #define DIG3 0x04 // 定义数码管4
- void delay(uint i);
- void T0_init();
- void MAX7219(uchar addr,uchar num);
- void MAX7219_init(); //MAX7219初始化
- void display();
- sbit DIN=P3^0; //连接MAX7219 DIN引脚
- sbit LOAD=P3^1; //连接MAX7219 LOAD 引脚
- sbit CLK=P3^2; //连接MAX7219 CLK 引脚
- sbit G1=P0^0; //南北红绿灯
- sbit Y1=P0^1;
- sbit R1=P0^2;
-
- sbit G2=P1^0; //东西红绿灯
- sbit Y2=P1^1;
- sbit R2=P1^2;
- uchar NS_S,NS_G,EW_S,EW_G;
- uchar NS,EW;
- uchar temp=0,i;
- uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,
- 0x5b,0x5f,0x70,0x7f,0x7b}; //共阴级数码管数组
-
- void delay(uint i)
- {
- uint j;
- for(j=0;j<i;j++);
- }
- void T0_init()
- { //装初值10MS
- TMOD=0X01;
- TH0=0XD8;
- TL0=0XF0;
- ET0=1;
- TR0=1;
- }
- void MAX_write(uchar ch) //以8位一个字节进行写值
- {
- uchar j,ads;
- for(j=0;j<8;j++) //8位
- {
- ads=ch&0x80; //取最高位
- CLK = 0; //时钟线置低
- if(ads) DIN = 1;
- else DIN = 0;
- ch=ch<<1; //左移一位
- CLK=1; //上升沿,DIN的数据写入到7219
- }
- }
- void MAX7219(uchar addr, uchar num) //写地址,写数据
- {
- LOAD = 0;
- _nop_();
- MAX_write(addr);
- _nop_();
- MAX_write(num);
- _nop_();
- LOAD = 1; //锁存
- }
- void MAX7219_init()
- {
- MAX7219(0x0c,0x01); //正常状态
- MAX7219(0x0b,0x03); //设置扫描范围DIG0-3
- MAX7219(0x0a,0x05); //设置亮度11/32
- MAX7219(0x09,0x00); //采用译码方式 ,不译码
- }
- void display()
- {
- NS_S=NS/10; //南北十位,个位
- NS_G=NS%10;
- EW_S=EW/10; //东西十位,个位
- EW_G=EW%10;
- MAX7219(DIG0,table[NS_S]); //南北十位,个位
- MAX7219(DIG1,table[NS_G]);
- MAX7219(DIG2,table[EW_S]); //东西十位,个位
- MAX7219(DIG3,table[EW_G]);
- }
- void T0_(void)interrupt 1
- {
- temp++;
- TH0=0XD8;
- TL0=0XF0;
- if(temp==100)
- {
- temp=0;
- NS--;
- EW--;
- if((NS==0)&&(EW==3))
- {
- NS=3;
- EW=3;
- i=1;
- }
- if((NS==0)&&(EW==0)&&(i==1))
- {
- NS=83;
- EW=80;
- i=2;
- }
- if((NS==3)&&(EW==0))
- {
- NS=3;
- EW=3;
- i=3;
- }
- if((NS==0)&&(EW==0)&&(i==3))
- {
- NS=60;
- EW=63;
- i=4;
- }
- }
- display();
- }
- void main()
- {
- T0_init();
- MAX7219_init();
- EA=1;
- NS=60; //初始南北通行60秒
- EW=63;
- R2=0,G1=0; //南北绿灯亮,东西红灯亮
- while (1)
- {
- uint k;
- display();
- switch(i)
- {
- case 1: R2=1,G1=1; //关闭南北绿灯,东西红灯
- Y1=0,Y2=0; //黄灯闪烁
- for(k=0;k<3;k++)
- {
- Y1=~Y1;
- Y2=~Y2;
- delay(10000);
- }
- break;
- case 2: G2=0,R1=0; //东西绿灯亮,南北红灯亮
- break;
- case 3: G2=1,R1=1;
- Y1=0,Y2=0; //黄灯闪烁
- for(k=0;k<3;k++) //循环三次进行延时闪烁
- {
- Y1=~Y1;
- Y2=~Y2;
- delay(10000);
- }
- break;
- case 4: R2=0,G1=0; //东西红灯亮,南北绿灯亮
- break;
- }
- }
- }
复制代码 |