基于STC89C51的交通信号灯控制程序
这两天手边能钻研的只有一套普中仪器的51开发仪,就根据开发仪上有的电子元件实现了一个交通信号灯拟真。
关于STC89C516
有关这颗芯片的资料并不是特别多,总的来说这颗芯片算是低配版本的STC89C52,DIP-40封装,程序区仅有4KB,不适合大型程序。
芯片引脚图:
在本个实验中需要用到GPIO-P0口(作为数码管显示信号)、P1口(作为LED控制信号)、P2口低三位(联合74LS138作为数码管控制信号)。
程序设计思路
因为动态数码管显示控制需要刷新,故在主程序里面需要实现数码管的刷新;同时参考到现实情况绿灯在最后时间内会闪烁提示,故而在程序实现中采用了分段循环的设计。
源程序
在另外一台电脑上,后续几天更新。
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 code CHARSET[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void __delay_kicks(u16 kick){
while(kick--);
return;
}
int main(void){
u16 count = 0;
u16 count2 = 19;
u16 i,c0;
u8 c1,c2,c3,step;
step = 0;
while(1){
c1 = count % 10;
c2 = count / 10;
c2 = c2 % 10;
c3 = count / 100;
c3 = c3 % 10;
for (i = 0; i < 50; i++){
c0 = i / 10;
P2 = 0x07;
P0 = CHARSET[c0];
__delay_kicks(195);
P2 = 0x06;
P0 = CHARSET[c1] + 0x80;
__delay_kicks(195);
P2 = 0x05;
P0 = CHARSET[c2];
__delay_kicks(195);
P2 = 0x04;
P0 = CHARSET[c3];
__delay_kicks(195);
P2 = 0x03;
if (count2 <= 9){
P0 = CHARSET[count2];
}else{
P0 = 0x40;
}
__delay_kicks(195);
}
count++;
count2--;
if(count2 <= 0){
if(step == 0){
step = 1;
count2 = 25;
}else if(step == 1){
step = 2;
count2 = 3;
}else if(step == 2){
step = 0;
count2 = 19;
}
}
if(step == 0 && count2 > 3){
P1 = ~(0x30);
}else if(step == 0 && count2 <= 3){
P1 = ~(0x50);
}else if(step == 1){
P1 = ~(0x84);
}else if(step == 2){
P1 = ~(0x88);
}
for (i = 50; i < 100; i++){
c0 = i / 10;
P2 = 0x07;
P0 = CHARSET[c0];
__delay_kicks(195);
P2 = 0x06;
P0 = CHARSET[c1] + 0x80;
__delay_kicks(195);
P2 = 0x05;
P0 = CHARSET[c2];
__delay_kicks(195);
P2 = 0x04;
P0 = CHARSET[c3];
__delay_kicks(195);
P2 = 0x03;
if (count2 <= 9){
P0 = CHARSET[count2];
}else{
P0 = 0x40;
}
__delay_kicks(195);
}
if(step == 0 && count2 > 9){
P1 = ~(0x30);
}else if(step == 0 && count2 > 3){
P1 = ~(0x10);
}else if(step == 0 && count2 <= 3){
P1 = ~(0x50);
}else if(step == 1 && count2 > 5){
P1 = ~(0x84);
}else if(step == 1 && count2 <= 5){
P1 = ~(0x80);
}else if(step == 2){
P1 = ~(0x88);
}
}
}
最终效果
视频:
21013101-基于STC89C516的交通信号灯拟真
腾讯微云-红绿灯展示
视频下载(如果上面那个链接失效请选择这个):腾讯微云