基于AT89C51的交通灯十字路口系统的仿真实现(正常交通)

一、 课程设计目的

  1. 熟悉AT89C51单片机各引脚的用法
  2. 学会使用protues仿真原理图的设计和C51语言keil软件编程完成设计的交通灯控制系统
  3. (1)通过使用《单片机原理与应用》课程的基础理论知识和设计方法,进一步加深对课程所讲理论知识的理解;
    (2)通过查阅资料,阅读程序,提高使用单片机分析问题、解决问题的能力;
    (3)通过实际动手进行硬件设计及软件程序设计,达到理论联系实际、灵活应用单片机解决实际问题的目的。

二、 课程设计内容
1、电路设计
①交通灯系统整体设计构想:系统东西通行时间都为13秒,包含黄灯闪烁3秒,南北通行14秒。这样一直循环。交通灯运行流程图如下:在这里插入图片描述

②仿真图里所用到的元件

表1 元器件清单

元器件名称数量
单片机AT89C511个
电阻 R13个
发光二极管 红、黄、绿各4个
电容 C1 、C23个
晶振X11个
共阴极数码管 2位8段共阴极4个
排阻 RP1 11
按钮1个
74H573 锁存器1个
其他

2、电路各部分组成
①本设计单片机最小系统:晶振电路、复位电路、单片机组成。
②红绿灯电路
③数码管电路

3.仿真截图

在这里插入图片描述 --------------------------------------南北主干道绿灯通行时间10秒--------------------------------------------------

在这里插入图片描述
-------------------------------------------南北主干道黄灯准备倒数3秒--------------------------------------------------

4、主函数和部分功能代码

sbit dula=P3^6;	  //段选锁存器锁存端
sbit wela=P3^7;	  //位选锁存器锁存端
sbit EW=P1^4;   //东西黄灯
sbit SN=P1^1;	//南北黄灯

char time1=11;  //初值南北时间
char time2=14;  //初值东西时间
char huang=3;  //黄灯时间
char time11=13,time22=10; //变换后南北,东西时间

//共阴极数字显示编码
uchar code table[]={0x3f,0x06,0x5b,0x4f,
	               0x66,0x6d,0x7d,0x07,
	               0x7f,0x6f};
uchar code wei[]={0xfd,0xfe,0xf7,0xfb,
				  0xdf,0xef,0x7f,0xbf}; //位选
 
void delay(uint x)
{
		uint i,j;
		for(i=x;i>0;i--)			//定时x毫秒
			for(j=110;j>0;j--);
}

void display(uint ge1,uint shi1,uint ge2,uint shi2)	//数码管显示
{
	//显示北
	wela=1; //打开位选锁存器
	P0=wei[0];	//送入位选码(北个位)
	wela=0; //关闭位选锁存器
	P0=0;  //消影
	dula=1; //打开段选锁存器
	P0=table[ge1]; //送入段选
	dula=0;	//关闭段选锁存器
	delay(1);

	wela=1; //打开位选锁存器
	P0=wei[1];	//送入位选码(北十位)
	wela=0; //关闭位选锁存器
	P0=0;
	dula=1; //打开段选锁存器
	P0=table[shi1]; //送入段选
	dula=0;	//关闭段选锁存器
	delay(1);

	//显示东西
	wela=1; //打开位选锁存器
	P0=wei[2];	//送入位选码(东个位)
	wela=0; //关闭位选锁存器
	P0=0;
	dula=1; //打开段选锁存器
	P0=table[ge2];
	dula=0;	//关闭段选锁存器
	delay(1);

	wela=1; //打开位选锁存器
	P0=wei[3];	//送入位选码(东十位)
	wela=0; //关闭位选锁存器
	P0=0;	
	dula=1; //打开段选锁存器
	P0=table[shi2];
	dula=0;	//关闭段选锁存器
	delay(1);
}

void main()
{
	P1=0x0c;  //刚开始南北通,东西禁行
	TMOD=0x01;
	TH0=(65535-10000)/256;
	TL0=(65535-10000)%256;   //初值
	EA=1;	   //打开总中断
	ET0=1;	   //定时器0允许中断
	TR0=1;	   //定时器0开始计时
	EX0=1;	   //外部中断0允许位
	IT0=1;	   //外部中断0触发方式(下降沿)
	while(1)
	{
		if(flag)
		{
			
			flag=0;
		}	
		if(!p)
		{
			shi1=time1/10;	//南北十位
			ge1=time1%10;	//南北个位
			shi2=time2/10;	//东西十位
			ge2=time2%10;	//东西个位	
			display(ge1,shi1,ge2,shi2); //显示函数
		}
    	if(p)
			dis();	 //不显示函数
		
	}  
}	  
void ext0() interrupt 0
{
	flag=1;
	status=P2;	
}
void timer() interrupt 1   //定时中断程序
{
	TH0=(65535-20000)/256;
	TL0=(65535-20000)%256;		//重新赋初值

	temp++;
	if(temp==20)   //说明过去了1秒
	{
		temp=0;   //清零,重新计算
		//东西方向南北方向时间自减
		time1--;
		time2--;

		if(zhuangtai_flag==0) zhuangtai1();
		if(zhuangtai_flag==1) zhuangtai2();
		if(zhuangtai_flag==2) zhuangtai3();
		if(zhuangtai_flag==3) zhuangtai4();
	}
		
}

资源文件夹包含:proteus仿真+原理图;keil编写的C语言程序;详细设计说明书。
资源链接:
加我QQ:1271370903

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值