IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51单片机模拟交通信号灯控制系统设计 -> 正文阅读

[嵌入式]51单片机模拟交通信号灯控制系统设计

51单片机模拟交通信号灯控制系统设计

设计要求:

1.LED灯模拟十字路口交通灯控制

2.正常情况下双方向轮流通行

3.特殊情况时,A方向通行

4.紧急情况时,AB方向都不通行

本任务涉及定时控制东、南、西、北四个方向上的12盏交通信号灯,且出现特殊和紧急情况时,能及时调整交通灯的指示状态。 采用12个LED发光二极管模拟红、黄、绿交通灯,用单片机的P1口控制发光二极管的亮灭状态;而单片机的P1口只有8个控制端,如何控制12个二极管的亮灭呢? 观察LED状态表,可以发现,在不考虑左转弯行驶车辆的情况下,东、西两个方向的信号灯显示状态是一样的,所以,对应两个方向上的6个发光二极管只用P1口的3根I/O端口线控制即可。同理,南、北方向上的6个发光二极管可用P1口的另外3根I/O端口线控制。 当I/O端口线输出高电平时,对应的交通灯熄灭;反之,当I/O端口线输出低电平时,对应的交通灯点亮。

?实验原理图如下:

实验程序如下:

#include <REGX52.H>
#define uchar unsigned char

uchar t0,t1;	//关于定时器延时变量

/*******************************************************************************
* 函 数 名         : delay0_5s1
* 函数功能		   : 用T1的工作方式1编写延时0.5秒子函数,采用12MHz晶振
* 输    入         : 无
* 输    出         : 无
***+****************************************************************************/

void delay0_5s1()
{
	for(t0=0;t0<10;t0++)		
	{
		TH1 = (65536-50000)/256;
		TL1 = (65536-50000)%256;
		TR1 = 1;
		while(!TF1);
		TF1 = 0;
	}
}

/*******************************************************************************
* 函 数 名         : delay_t1
* 函数功能		   : 延时函数,延时时间=0.5秒 乘上 输入值t
* 输    入         :  t 调节延时时间
* 输    出         : 无
***+****************************************************************************/

void delay_t1(uchar t)	
{
	for(t1=0;t1<t;t1++)
	{
		delay0_5s1();
	}
}

/*******************************************************************************
* 函 数 名         : int_0
* 函数功能		 		: 外部中断0,紧急情况中断,东西南北禁止通行
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void int_0() interrupt 0
{
	uchar i,j,k,I,m;		//保护现场锁存数据
	EA=0;		//关闭总中断允许,该时间不能被中断
	i=P0;		//把P0口中断前的数据保存到 i
	j=t0;		//把中断前的定时t0数据保存给 j
	k=t1;		//把中断前的定时t1数据保存给	k
	I=TH1;	//把中断前的定时器初值数据保存给 I 和 m
	m=TL1;
	EA=1;		//开启总中断
	P0=0xf6;		//给P0赋值实现的结果,东西南北都是红灯亮其他灯灭
	delay_t1(10);		//延时5秒后恢复中断前数据
	EA=0;
	P0=i;								//恢复现场恢复数据
	t0=j;
	t1=k;
	TH1=I;
	TL1=m;
	EA=1;
}

/*******************************************************************************
* 函 数 名         : int_1
* 函数功能		   : 外部中断1,特殊情况中断,只允许南北通行
* 输    入         : 无
* 输    出         : 无
***+****************************************************************************/

void int_1() interrupt 2
{
	uchar i,j,k,I,m;		
	i=P0;				//保护现场锁存数据
	j=t0;
	k=t1;
	I=TH1;
	m=TL1;
	EA=1;
	P0=0xf3;
	delay_t1(10);		
	EA=0;
	P0=i;				//恢复现场恢复数据
	t0=j;
	t1=k;
	TH1=I;
	TL1=m;
	EA=1;
}

/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 数码管倒计时30秒显示,南北方向绿灯常亮26秒后,闪烁3秒,在变黄灯亮3秒。
									黄灯灭后,东西方向绿灯常亮26秒后,闪烁3秒,在变黄灯亮3秒。循环显示							
* 输    入         : 无
* 输    出         : 无
***+****************************************************************************/

void main()
{
	uchar k;
	TMOD = 0X10;	//定时器T1设置工作模式1	
	EA 	= 1;	//开总中断运许
	IT0 = 0;	//外部中断0设置为负跳变触发方式
	EX0 = 1;	//开启外部中断0中断允许位
	PX0 = 1;  //外部中断0中断优先级高
	IT1 = 0;	//外部中断1设置为负跳变触发方式
	EX1 = 1;	//开启外部中断1中断允许位
	PX1 = 0;  //外部中断1中断优先级低于外部中断0
	
	while(1)
	{
		P0=0xf3;	//1111 0011南北通行
		delay_t1(48);	//延时24秒
		for(k=0;k<3;k++)	//绿灯闪烁3秒
		{
			P0=0xf7;
			delay_t1(1);	//0.5秒延时
			P0=0xf3;	//1111 0111 南北绿灯熄灭,东西红灯常亮
			delay_t1(1);
		}
			P0=0xf5;	//1111 0101 南北黄灯亮3秒,东西红灯常量
			delay_t1(6);

			P0=0xde;	//1101 1110 南北红灯亮起,东西绿灯亮
			delay_t1(48);
			for(k=0;k<3;k++)
		{
			P0=0xfe;
			delay_t1(1);	
			P0=0xde;
			delay_t1(1);
		}
			P0=0xee;	
			delay_t1(6);
	}
}

?注意事项:

    1. 所遇到的问题:

问题1、定时器延时时间不准确比正常时间更快。for(t0=0;t0<2;t0++)

问题2、外部中断0的中断函数int_0 ()结束后,返回值出现误差。

问题3、紧急情况不能打断特殊情况中断

    1. 解决的方法:

问题1、最后发现是定时器延时函数delay0_5s1的程序设置错误, for(t0=0;t0<10;t0++) ,中间误差0.4秒时间。

问题2、原因在于int_0 ()函数中在写保护及恢复数据时没有对中断进行

关闭及打开导致,可能程序在写保护的时候就被紧急情况中断了,导致 写保护没能全部完成。加上EA总中断开关即可。

问题3、该问题分很多原因,原程序出现该问题在于没有对外部中断进行, 中断优先级设置,只需要在main主函数里面的加上:

PX0 = 1; ?//外部中断0中断优先级高

PX1 = 0; ?//外部中断1中断优先级低于外部中断0

还有一种更高级的带数码管显示倒计时时间的交通灯,但我的实验要求作业是这样所以没写那个,需要的可以关注私信,我写一下。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:27:08  更:2022-12-25 11:28:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:41:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码