基于STC89C51的交通信号灯控制程序

基于STC89C51的交通信号灯控制程序

这两天手边能钻研的只有一套普中仪器的51开发仪,就根据开发仪上有的电子元件实现了一个交通信号灯拟真。

关于STC89C516

有关这颗芯片的资料并不是特别多,总的来说这颗芯片算是低配版本的STC89C52,DIP-40封装,程序区仅有4KB,不适合大型程序。
芯片引脚图:
STC89C516引脚图
在本个实验中需要用到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的交通信号灯拟真

腾讯微云-红绿灯展示
视频下载(如果上面那个链接失效请选择这个):腾讯微云

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值