基于51单片机的简易交通灯仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。

AT89C52的主要特点如下:

内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。

RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。

外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。

通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。

定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0

串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。

低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。

宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。

主程序:

#include<reg51.h>
#include<intrins.h>	   //包含库文件
sbit smg1=P3^6;		   //定义南北方向数码管低位
sbit smg2=P3^7;		   //定义南北方向数码管高位
sbit N_green=P2^0;	   //定义北向绿灯端口
sbit N_red=P2^1;	   //定义北向红灯端口
sbit N_yellow=P2^2;	   //定义北向黄灯端口	   

sbit S_green=P2^7;	   //定义南向绿灯端口
sbit S_red=P2^6;	   //定义南向红灯端口
sbit S_yellow=P2^5;	   //定义南向黄灯端口

sbit W_green=P1^0;	   //定义西向绿灯端口
sbit W_red=P1^1;	   //定义西向红灯端口
sbit W_yellow=P1^2;	   //定义西向黄灯端口   

sbit E_green=P1^7;	   //定义东向绿灯端口
sbit E_red=P1^6;	   //定义东向红灯端口
sbit E_yellow=P1^5;	   //定义东向黄灯端口


int js=0,djs=30;                       //初始倒计时时间
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};	  //共阴极数码管段值
/************以下为函数声明*************/
void jtd();
void jtda();
void jtdb();
void djsxs();
void yj();
void jj();
void jtday();
void jtdby();

/*****************************************************/
/*             函数名:delayms				    	 */
/*           功能:产生毫秒级延时					 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
 {
  for(i=150;i>0;i--); 
 }
}
/*****************************************************/
/*             函数名:Timer0_init()			 	 */
/*             功能:定时器0初始化					 */
/*****************************************************/
void Timer0_init()
{
      js=0;
	  TMOD=0x01;	  	//定义定时器0工作模式	
      TH0=0x4c;			//赋初值高位
	  TL0=0x00;			//赋初值低位
      TR0=1;			//启动定时器
	  ET0=1;			//开中断
	  EA=1;				//开全局中断
}
/*****************************************************/
/*        函数名:timer0() interrupt 1 using 1	     */
/*             功能:定时器0中断服务函数    		 */
/*****************************************************/
void timer0() interrupt 1 using 1	
{
	    TF0=0;
	 	TH0=0x4c;
		TL0=0x00;		  //重新赋高地位初值
		js++;
		if(js==22) 
		  { js=0;
		    djs--;
		   }
}
/*****************************************************/
/*                 函数名:djsxs11()	             */
/*                功能:数码管动态显示      		 */
/*****************************************************/
void  djsxs11()		 //此函数注视同djsxs22()
{	int b1,b2;
 	b1=djs/10;		 //将倒计时时间的高位赋予b1
	b2=djs%10;		 //将倒计时时间的低位赋予b2
	P0=table[b1];
    smg1=0;
    delayms(3);
    smg1=1;			 //显示b1

	P0=table[b2];
	smg2=0;
	delayms(3);
	smg2=1;			//显示b2
}


/*****************************************************/
/*                 函数名:qm()	                     */
/*        功能:使所有的交通信号灯全部熄灭           */
/*****************************************************/
void qm()
{
N_green=1;
N_red=1;
N_yellow=1;		   

S_green=1;
S_red=1;
S_yellow=1;

W_green=1;
W_red=1;
W_yellow=1;		   

E_green=1;
E_red=1;
E_yellow=1;
}
/*****************************************************/
/*                 函数名:jtdb()	                 */
/*       功能:交通灯东西方向绿灯亮,红灯灭          */
/*             交通灯南北方向红灯亮,绿灯灭          */
/*****************************************************/
void jtdb()
{
qm();									 //所有信号灯灭
W_green=0;								 //西向绿灯亮
E_green=0;								 //东向绿灯亮
N_red=0;								 //北向红灯亮
S_red=0;									 //南向红灯亮
while(1)
{
	if(djs>5)							 //当倒计时时间大于5秒时,执行
		{
	     djsxs11();							  //数码管时间显示
        }
    if(djs<=5) 						      //当倒计时时间小于5秒时,执行
		{
	 	 jtdby();							  //调用函数
		}
}
}
/*****************************************************/
/*                 函数名:jtdby()	                 */
/*       功能:交通灯东西方向黄灯亮,红灯灭          */
/*             交通灯南北方向红灯亮,绿灯灭          */
/*****************************************************/
void jtdby()
{
qm();									  //所有信号灯全灭
W_green=1;								  //西向绿灯灭
E_green=1;								  //东向绿灯灭
W_yellow=0;								  //西向黄灯亮
E_yellow=0;								  //东向黄灯亮
N_red=0;								  //北向红灯灭
S_red=0;								  //南向红灯灭
while(1)
{
djsxs11();								  //数码管时间显示
if(djs<0) 								  //当倒计时时间小于0秒时,执行
  {
    djs=30;
	jtda();								  //调用jtda()函数
  }
}
}

/*****************************************************/
/*                 函数名:jtda()	                 */
/*       功能:交通灯南北方向绿灯亮,红灯灭          */
/*             交通灯东西方向红灯亮,绿灯灭          */
/*****************************************************/
void jtda()
{
qm();									  //所有信号灯灭
N_green=0;								  //北向绿灯亮
S_green=0;								  //南向绿灯亮
W_red=0;								  //西向红灯亮
while(1)
{
if(djs>5)								  //当倒计时时间大于5秒时,执行
{
		djsxs11();						  //数码管时间显示
}
if(djs<=5) 						  //当倒计时时间小于5秒时,执行 
{
	jtday();				  //调用函数
}
}
}

/*****************************************************/
/*                 函数名:jtday()	                 */
/*       功能:交通灯南北方向黄灯亮,红灯灭          */
/*             交通灯东西方向红灯亮,绿灯灭          */
/*****************************************************/
void jtday()
{
qm();									  //所有信号灯全灭
N_green=1;								  //北向绿灯灭
S_green=1;								  //南向绿灯灭
N_yellow=0;								  //北向黄灯亮
S_yellow=0;								  //南向黄灯亮
W_red=0;								  //西向红灯亮
E_red=0;								  //东向红灯亮
while(1)
{
		djsxs11();						  //数码管时间显示
		if(djs<0) 						  //当倒计时时间小于0秒时,执行
			{
			  djs=30;
			  jtdb();					  //调用jtdb()函数
			}
	}
}

/*****************************************************/
/*                 函数名:main()	                 */
/*                 功能: 主函数					 */
/*****************************************************/
void main()
{
Timer0_init();							   //定时器0初始化
jtda();									   //调用jtda()函数
}

设计文件:

链接:https://pan.baidu.com/s/1noAGBg4DJRgOMiGZyIe3TA?pwd=skxu

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值