51单片机|keilc51|实例|定时器中断|简易的交通灯设计


1.实验要求

编写程序,模拟交通灯,实现以下状态。

状态1:东西方向绿灯亮4s,南北方向红灯亮4s;

状态2:东西方向绿灯闪烁2s,南北方向红灯继续亮2s;

状态3:东西方向绿灯灭,黄灯亮2s,南北方向红灯继续亮2s;

状态4:南北方向红灯灭,绿灯亮4s,东西方向黄灯灭,红灯亮4s;

状态5:南北方向绿灯闪烁,东西方向红灯继续亮2s;

状态6:南北方向绿灯灭,黄灯亮2s,东西方向红灯继续亮2s。


2.实验原理

51单片机的定时计数器有4种工作方式,2种工作模式。

两种工作模式:

1、定时器模式:是对单片机的系统时钟信号经片内12分频后的内部脉冲信号(机器周期)计数。由于时钟频率是定值,所以可根据对内部脉冲信号的计数值可计算出定时时间,即定时时间等于机器周期乘以计数值。通过指令给计数器装入一个初值,即可设置不同的定时时间。

 2、计数器模式:是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数,每个机器周期的S5P2对外部输入引脚T0或T1进行采样。若前一机5器周期采样为高电平,后一机器周期采样为低电平,则在下一个机器周期S3P1期间,计数器加1。确认一次负跳变需两个机器周期,即24个时钟周期,因此外部输入的计数脉冲的最高频率为系统时钟频率的1/24。


3.Keil c51编程

#include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int 
	
//定义全局变量:t0为0.5s定时函数的变量;t1为 0.5s*n  (级联时间)定时函数的变量
unsigned char code_play[]={0xf3,0xfb,0xeb,0xde,0xdf,0xdd};
uchar t0 , t1;

//***0.5s标准定时函数***
void Delay_0_5s()
{
	for(t0=0;t0<2;t0++)
	{
		TH1 = 15536/256;//设定初值
		TL1 = 15536%256;
		TR1 = 1;//启动T1
		while(!TF1);//查询计数是否溢出,即50ms时间到,TF=1
		TF1 = 0;//50ms时间到,将定时器溢出标志位TF1清零	
	}
}


//*** 0.5s*n(时间级联)函数
void Delay_0_5_ns(uchar t)
{
	for(t1=0;t1<t;t1++)
	{
		Delay_0_5s();
	}
}


//***主函数
void main()
{
	uchar k;
	TMOD = 0x10;//T1工作方式1(一般固定)
	EA = 1;
	
	//{东西绿亮,南北红亮(1);闪烁(2);东西黄亮,南北红亮(3);东西红亮,南北绿亮(4);闪烁(5);东西红亮,南北黄亮(6)

	while(1)
	{
		//状态1:东西绿亮,南北红亮,4s
		P1 = code_play[0];
		Delay_0_5_ns(8);
		
		//状态2:东西方向绿灯闪烁2s,南北方向红灯继续亮2s(定义闪烁亮灭分别为0.5s)
		for(k=0;k<2;k++)
		{
			P1 = code_play[0];
			Delay_0_5_ns(2);
			
			P1 = code_play[1];
			Delay_0_5_ns(2);			
		
		}
		
		//状态3:东西黄亮,南北红亮,2s
		P1 = code_play[2];
		Delay_0_5_ns(4);	

		//状态4:东西红亮,南北绿亮,4s
		P1 = code_play[3];
		Delay_0_5_ns(4);

		//状态5:南北方向绿灯闪烁,东西方向红灯继续亮2s
		for(k=0;k<2;k++)
		{
			P1 = code_play[3];
			Delay_0_5_ns(2);
			
			P1 = code_play[4];
			Delay_0_5_ns(2);
		}
		//状态6:东西红亮,南北黄亮,2s
		P1 = code_play[5];
		Delay_0_5_ns(4);
	}
}

代码说明:

1.将每个状态用数组形式列出,后面更方便。

2.一般定时器1(16位),采用方式1,要设定初始值。


4.Proteus仿真

仿真图如下:


5.问题及总结

1.编程过程中创建了字符串 code[] ,编译出错

原因: code 为Keil中关键字

补充知识:我们知道,在单片机中一般都有两块存储区域,ROM和RAM,程序代码存储在ROM中,程序要用的变量存储在RAM中 。而 “code”的作用就是将其修饰过的变量存储在ROM中而非RAM 。
在单片机中,RAM空间都比较小,是比较宝贵的。“code”的意义就是将一些初始化后值一直保持不变的变量(如 固定的常数、表格、常量数组、只读常量等)放置于ROM区,从而节省了RAM空间

2.LED始终不亮

原因:

  • 与LED灯串联的电阻过大,例如10k过大,可以修改电阻为300、500欧姆。

  • 电路未能形成真正的连通,电路元件之间(特别是标签导线)要用导线连接

 3.keil中全局替换功能

快捷键: Ctrl + H

说明:Replace为替换当前;Replace为替换所有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzztutu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值