单片机控制交通灯V1.0
要求:
(1)、十字路口南北、东西方向各装有绿、黄、红指示灯,南北通行时间为15s,东西通行时间为10s,当由绿灯变为红灯前的3s内,绿灯灭而黄灯亮。
(2)、通行时间各由两位7段LED显示器指示,且为倒时间指示(即从15或10逐次减一,禁止通行时显示器灭)。
(3)、当某方向显示红灯时,容许人工干预强行改变两个方向的指示灯颜色,以让救护车之类的车辆通行,但发出改变通行命令后有3s时间使显示绿灯的方向改变显示黄灯,并以每秒10次的频率闪烁,以示警告。
小结:本实验用ISIS 7 Professional、Keil uVision2仿真,由于是学单片机以来做的第一个实验,在南北、东西两个方向四个数码管倒计时那里控制得不好,用动态描扫实现,闪烁比较明显,希望在后面的理论学习中找到更好的实现方法。
参考源程序:
#include"reg52.h"
#define uchar unsigned char #define uint unsigned int
sbit one=P3^4; //数码段位选控制 sbit two=P3^5; sbit three=P3^6; sbit four=P3^7;
sbit d_lu=P0^1; sbit d_huang=P0^2; sbit d_hong=P0^3;
sbit x_lu=P2^1; sbit x_huang=P2^2; sbit x_hong=P2^3;
sbit n_lu=P2^4; sbit n_huang=P2^5; sbit n_hong=P2^6;
sbit b_lu=P0^4; sbit b_huang=P0^5; sbit b_hong=P0^6;
uint fangxiang=0; uint m,n,k;
code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//7段LED对应于数字'0','1'...'9' void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void delayMs(uint timer_num, uint fxang) { uchar aa,bb,j; TMOD=0x10; //设定T1为方式1 TR1=1; //启动定时器工作 fangxiang=fxang; for(j=0;j<10;j++) //每隔100ms中断一次,中断10次为1s { TH1=0x3c; //定初值 TL1=0xb0; |