|
简易交通灯【c语言+仿真图】完整注释
单片机源程序:
- #include<reg51.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define PA XBYTE[0xf8ff] //定义A口
- #define PB XBYTE[0xf9ff] //定义B口
- #define PC XBYTE[0xfaff] //定义C口
- #define CTRL XBYTE[0xfbff] //ctrol简写为CTRL 定义控制口
- uint i = 0, cnt = 120, flag=0;
- uchar table[]={ //共阴极
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- void display(int x, int y, int m, int n, int a, int b, int c, int d);
- void delay(int);
- void main()
- {
- CTRL = 0x80; //1000 0000B 方式选择控制字: A口方式0 A口位输出 C口高4位输出 B口方式0 B口输出 C口低4位输出
- IP = 0x05;
- TMOD = 0x01; //方式寄存器TMOD 0000 0001B 定时器0,方式1
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256; //定时50ms
- EA = 1; //开总中断
- ET0 = 1; //允许定时器0中断
- TR0 = 1; //开启定时器0
- while(1)
- {
- if(cnt > 65) //120-cnt 小于55
- {
- XBYTE[PA] = 0x33; //0011 0011B PA2绿灯亮 PA3红灯亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt-65)/10, (cnt-65)%10, (cnt-60)/10, (cnt-60)%10);
- } //1111 1110B,(P1.0) 1111 1101B,(P1.1) 1111 1011B,(P1.2) 1111 0111B,(p1.3)假设cnt=70即计数50次此时南北绿灯显示05 东西红灯显示10;
- else if(cnt > 60 && cnt <= 65) //120-cnt介于 55与60之间
- {
- if(flag == 0)
- {
- XBYTE[PA] = 0x35;//0011 0101B PA1黄灯亮 PA3红灯亮
- display(0xff ,0xff, 0xfb, 0xf7, (cnt-60)/10,(cnt-60)%10, (cnt-60)/10,(cnt-60)%10);
- } //1111 1111B,1111 1111B 1111 1011B 1111 0111B 假设cnt=62 即计数120-62=58次,此时南北黄灯显示数字02 东西显示红灯02;
- if(flag == 1)
- {
- XBYTE[PA] = 0x35;//0011 0101B PA1黄灯亮 PA3红灯亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt-60)/10,(cnt-60)%10, (cnt-60)/10,(cnt-60)%10);
- }//1111 1110B,1111 1101B,1111 1011B,1111 0111B 假设cnt=62 即计数120-62=58次,此时南北红灯显示数字02,东西显示绿灯02;
- }
- else if(cnt <= 60 && cnt > 5) //120-cnt介于 60与115之间
- {
- XBYTE[PA] = 0x1e; //0001 1110B PA0红灯亮 PA5绿灯亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt)/10,(cnt)%10, (cnt-5)/10,(cnt-5)%10);
- }//1111 1110B,1111 1101B,1111 1011B,1111 0111B 假设cnt=40 即计数120-40=80次,此时南北红灯显示数字40,东西绿灯显示35;
- else if(cnt > 0 && cnt <= 5) //120-cnt 介于 115与120之间
- {
- if(flag == 0)
- {
- XBYTE[PA] = 0x2e;//0010 1110B PA0红灯亮 PA4黄灯亮
- display(0xfe ,0xfd, 0xff, 0xff, (cnt)/10,(cnt)%10, (cnt)/10,(cnt)%10);
- }//1111 1110B,1111 1101B,1111 1111B,1111 1111B 假设cnt=3即计数120-3=117次,此时南北红灯显示数字03,东西黄灯显示数字03
- if(flag == 1)
- {
- XBYTE[PA] = 0x2e;//0010 1110B PA0红灯亮 PA4黄灯亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt)/10,(cnt)%10, (cnt)/10,(cnt)%10);
- }//1111 1110B,1111 1101B,1111 1101B,1111 0111B 假设cnt=3即计数120-3=117次,此时南北红灯显示数字03,东西黄灯显示数字03
- }
- }
- }
- void display(int x, int y, int m, int n, int a, int b, int c, int d) //数码管
- {
- P1 = x; //P1.0
- PB = table[a]; //南北方向高位数码管显示数字
- delay(1); //调用延时函数
- P1 = y; //P1.1
- PB = table[b]; //南北方向低位数码管显示数字
- delay(1); //调用延时函数
-
- P1 = m; //P1.2
- PC = table[c]; //东西方向高位数码管显示数字
- delay(1); //调用延时函数
- P1 = n; //P1.3
- PC = table[d]; //东西方向低位数码管显示数字
- delay(1); //调用延时函数
- }
- void delay(int z) //延时子程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void mytimer0() interrupt 1 //定时器中断0
- {
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256; //定时50ms
- i++;
- if(i >= 10) //T=50ms*10=500ms
- {
- flag ++; //flag每0.5秒加1
- i = 0;
- }
- if(flag > 1)
- {
- flag=0;
- cnt --; //cnt每秒减1
- }
- …………限于本文篇幅 余下代码请从51hei下载附件…………
复制代码
下载:
NO.3.rar
(60.16 KB, 下载次数: 80)
|
评分
-
查看全部评分
|