学校的课程设计做的一个小程序,用51单片机做的交通灯。
单片机源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DIG0 0x01
- #define DIG1 0x02
- #define DIG2 0x03
- #define DIG3 0x04 // 定义数码管 1,2,3,4
- sbit DIN = P3^0; //MAX7219 DIN引脚
- sbit LOAD = P3^1; //MAX7219 LOAD 引脚
- sbit CLK = P3^2; //MAX7219 CLK 引脚
- sbit G1 = P0^0; //A线信号灯
- sbit Y1 = P0^1;
- sbit R1 = P0^2;
-
- sbit G2 = P1^0; //B线信号灯
- sbit Y2 = P1^1;
- sbit R2 = P1^2;
- uchar NS_S,NS_G,EW_S,EW_G; //AB线数码管个位,十位
- 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);
- void T0_init();
- void MAX7219(uchar addr,uchar num);
- void MAX7219_init();
- void display();
-
- void delay(uint i) //延时
- {
- uint j;
- for(j=0;j<i;j++);
- }
- void T0_init() //定时器
- {
- TMOD=0X01;
- TH0=0XD8; //装初值10MS
- 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初始化
- {
- MAX7219(0x0c,0x01); //正常工作状态
- MAX7219(0x0b,0x03); //设置扫描范围SMG0-3
- MAX7219(0x0a,0x05); //设置亮度11/32
- MAX7219(0x09,0x00); //采用译码方式 ,不译码
- }
- void display() //显示函数
- {
- NS_S=NS/10; //A线十位
- NS_G=NS%10; //A线个位
- EW_S=EW/10; //B线十位
- EW_G=EW%10; //B线个位
- MAX7219(DIG0,table[NS_S]); //A线十位,个位
- MAX7219(DIG1,table[NS_G]);
- MAX7219(DIG2,table[EW_S]); //B线十位,个位
- MAX7219(DIG3,table[EW_G]);
- }
- void main()
- {
- T0_init();
- MAX7219_init();
- EA=1;
- NS=15;
- EW=18;
- R2=0,G1=0; //初始通行15秒,A线绿灯亮,B线红灯亮
- while (1)
- {
- uint k;
- display();
- switch(i) //选择信号灯的亮灭方式
- {
- case 1: G1=1;Y1=0; //关闭A线绿灯,黄灯闪烁
- for(k=0;k<3;k++)
- {
- R2=0;
- Y1=~Y1;
- delay(10000);
- }
- R2=1;break;
- case 2: G2=0,R1=0;break; //B线绿灯亮,A线红灯亮
- case 3: G2=1,Y2=0; //关闭B线绿灯,黄灯闪烁
- for(k=0;k<3;k++)
- {
- R1=0;
- Y2=~Y2;
- delay(10000);
- }
- R1=1;break;
- case 4: R2=0,G1=0;break; //B线红灯亮,A线绿灯亮
- }
- }
- }
- void T0_(void)interrupt 1 //中断
- {
- temp++;
- TH0=0XD8;
- TL0=0XF0;
- if(temp==100) //1s进入
- {
- temp=0;
- NS--;
- EW--;
- if((NS==0)&&(EW==3)) //A线倒计时时间结束且B线剩余3s
- {
- NS=3;
- EW=3;
- i=1;
- }
- if((NS==0)&&(EW==0)&&(i==1)) //AB线倒计时时间结束且刚结束第一种情况
- {
- NS=18;
- EW=15;
- i=2;
- }
- if((NS==3)&&(EW==0)) //B线倒计时时间结束且A线剩余3s
- {
- NS=3;
- EW=3;
- i=3;
- }
- if((NS==0)&&(EW==0)&&(i==3)) //AB线倒计时时间结束且刚结束第三种情况
- {
- NS=15;
- EW=18;
- i=4;
- }
- }
- display();
- }
复制代码
所有资料51hei提供下载:
交通灯.rar
(103.78 KB, 下载次数: 58)
|