C51十字交通灯设计---基于keil + Proteus

C51十字交通灯设计

    1.实验准备:软件:Keil uVision4/5、Proteus 8

                         硬件:风标电子试验箱及十字交通灯扩展板

    2.实验题目:设计一个十字路口交通灯控制器。用单片机控制LED灯模拟指示。模拟东西方向的十字路口交通信号控制情况, 东西向通行时间为80s,南北向通行时间为60s,缓冲时间为3s。本项目为典型的LED显示和中断定时电路。利用定时器T0 产生每10ms一次的中断,每100次中断为1s。对两个方向分别显示红、绿、黄灯,已经相应的剩余时间即可。值得注意是,需要意识到,A方向红灯时间 B方向绿灯时间+黄灯缓冲时间这一常识。

    3.实验说明:就我本人而言,实验本身较难的部分是定时器做中断的部分,代码部分需要对定时器初始化和定时器做中断进行 深入研究,其次便是数码管显示的问题了,本人已将相应说明注释在代码里,代码能够成功运行项目,大家可以借鉴性参考,编写自己的代码;至于proteus仿真方面,也能成功运行,我会将相应的仿真图片贴到本文中,供大家参考学习。

    4.实验代码

//接线说明   南北红绿黄灯分别接P^0-2
//          东西红绿黄灯分别接P1^3-5
//          数码管SA-SH接P3接口用于段选
//           COM1-4接P2用于位选

#include "reg52.h"
#define uchar unsigned char

	
uchar code table[11] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; //0123456789 off 
uchar table1[4];      //中间变量数组,用于传值

unsigned char t;
unsigned char SN = 80;
unsigned char EW = 60;
int num;

sbit nredled=P1^0;
sbit ngreenled=P1^1;
sbit nyellowled=P1^2;

sbit eredled=P1^3;
sbit egreenled=P1^4;
sbit eyellowled=P1^5;

void SMG_init(void)            //数码管初始化函数
{
	table1[3]=table[0];
	table1[2]=table[0];
	table1[1]=table[0];
	table1[0]=table[0];
}

void display(void)            //数码管显示函数
{

		P2 = 0x01;            //数码管位选
		P3 = table[t/10];      //除法运算,用于显示十位数字
		P3 = 0xff; //ÏûÒþ
	
		P2=0x02;;
		P3 = table[t%10];     //取余运算,用于显示个位数字
		P3 = 0xff;
		
		P2=0x04;;
		P3 = table[t/10];
		P3 = 0xff;
		
		P2=0x08;
		P3 =table[t%10];
		P3 = 0xff;		
}
void LED1(void)
{
	while(t>3)
	{
			nredled=0;          //南北红灯亮
			egreenled=0;		//东西绿灯亮
			ngreenled=1;
			eredled=1;
			nyellowled=1;
			eyellowled=1;
		  display();
	}
		SMG_init();
}
void LED2(void)
{
		while(t>0)
		{			
			display();
			nredled=1;
			egreenled=1;
			eyellowled=0;		//东西黄灯亮
			nyellowled=0;		//南北黄灯亮
			ngreenled=1;
			eredled=1;
    }	
		SMG_init();
		t=60;
}
void LED3(void)
{
		while(t>0)
		{	
			display();
			eyellowled=1;
			nyellowled=1;	
			ngreenled=0;          //南北绿灯亮
			eredled=0;			  //东西红灯亮	 
			nredled=1;
			egreenled=1;
		}
		SMG_init();
}
void T0_time(void) interrupt 1    //定时器T0做中断
{
    TMOD=0x01;
    TH0=(65536-45872)/256;        
	TL0=(65536-45872)%256;
    num++;
    if(num==20)                   //每1s产生一次中断                          
    {    					
			num=0;	
			t--;
		}
}
void init(void)
{
	TMOD=0x01;      //定时器工作方式寄存器TMOD,定时器设置为模式1
    TH0=(65536-45872)/256;  //定时器初值寄存器设置初值
    TL0=(65536-45872)%256;
    EA=1;         //全局中断允许位,置1中断可用
    ET0=1;       //中断允许控制寄存器IE,ET0为定时器0的中断允许位
    TR0=1;       //定时器控制寄存器TCON,TR0为定时器0运行控制位,置1启动定时器0
		num=0;
	  
}
void main()
{
	while(1)
	{
		init();
		t = 80;
		P3=0xff;
		LED1();	
		LED2();  
		LED3();
		SMG_init();
  }
}

    5.实验视频及相关仿真文件均打包在以下链接中,供大家免费下载

            链接:https://pan.baidu.com/s/1rjVzJ5KgiS4tU7zG_vh0CA 
            提取码:w23p

观察十字路口红绿灯工作流程,设计交通灯。 1、初始时:南北向、东西向直行左转均为红灯 2、南北向直行: ①南北向直行绿灯亮,延时若干秒 ②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒 ③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮 3、南北向左转: ①南北向左转绿灯亮,延时若干秒 ②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒 ③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮 4、东西向直行: ①东西向直行绿灯亮,延时若干秒 ②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒 ③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮 5、东西向左转: ①东西向左转绿灯亮,延时若干秒 ②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒 ③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值