标题:
简易交通灯[c语言+仿真图]完整注释
[打印本页]
作者:
森小胖
时间:
2017-5-2 23:58
标题:
简易交通灯[c语言+仿真图]完整注释
简易交通灯【c语言+仿真图】完整注释
0.png
(36.26 KB, 下载次数: 75)
下载附件
2017-5-3 03:02 上传
0.png
(64.4 KB, 下载次数: 99)
下载附件
2017-5-3 03:02 上传
单片机源程序:
#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)
2017-5-2 23:57 上传
点击文件名下载附件
简易交通灯【c语言+仿真图】完整注释
下载积分: 黑币 -5
作者:
没心没肺挺好丶
时间:
2017-12-10 10:29
没有黑币啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1