51单片机实训项目一(基于51单片机的智能交通灯)

功能要求

1)东西方向显示绿灯时,南北方向显示红灯,持续10秒钟后,绿灯变为黄灯并持续3秒钟;

2)然后东西方向显示红灯,南北方向显示绿灯,持续10秒钟后,绿灯变黄灯并持续3秒钟,如此反复。

需求分析

需求一:不同方向上不同的灯亮起

利用开发板上搭载的8个led灯实现不同方向上不同颜色的灯,前4个灯的前三个表示东西方向上的红绿黄三个颜色,后四个灯的后三个表示南北方向上的红绿黄三个颜色

规定

1000 0010 表示东西方向上红灯,南北方向上绿灯

1000 0001 表示东西方向上红灯,南北方向上黄灯

需求二:根据时间改变灯的亮灭

利用定时器产生精准的时间,当到达我们规定的时间时改变灯的状态

具体实现

需求一

通过按一定编码顺序给led灯赋能,实现不同方向上特定颜色的灯亮起,同时让一个方向上只亮特定的那一个灯。

一共有4个状态(前面表示东西方向的颜色,后面表示南北方向的颜色)

红 绿 (0111 1101)

红 黄 (0111 1110)

绿 红 (1011 1011)

黄 红 (1101 1011)

这时候我们使用一个数组来存储这个编码。

a[]={0x7d,0x7e,0xd7,0xe7};(这里使用16进制比较方便)

当我们需要红绿时

P2=a[0]即可完成。

需求二

首先先选择定时器的模式为模式一

TMOD=0X01;

然后清空定时器标识位和打开定时器

TF0=0;

TR0=1;

设置定时器的初值为每1毫秒进入一次中断,这样1000次后就是1秒钟

TH0=64536/256;

TL0=64536%256;

因为我们需要使用中断,所以要打开中断允许

EA=1;

ET0=1;

这样我们的定时器就设置完毕了,接下来我们来编写中断服务函数

首先我们设置一个标识变量,当我们进入一次中断时这个标识变量加一,当标识变量到1000时清零并且秒钟的标识加一证明过了一秒钟。之后我们只需要在每次进入中断时对秒钟进行查询与比较,然后对灯进行赋能即可完成在特定的时间改变灯的状态。

代码

#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
	uchar a[]={0x7d,0x7e,0xd7,0xe7};
	uint xx=0;
		uint yy=0;
void main()
{
	TMOD=0X01;
	TF0=0;
	TR0=1;
	
	TH0=64536/256;
	TL0=64536%256;
	
	ET0=1;
	EA=1;
	PT0=1;
	while(1)
	{
		
	}
}
void timer0_into() interrupt 1
{
	TH0=64536/256;
	TL0=64536%256;
	xx++;
	if(xx==1000)
	{
		xx=0;
		yy++;
		if(yy<=10)
	{
		P2=a[0];
	}
	if(yy>10&&yy<=13)
	{
		P2=a[1];
	}
	if(yy>13&&yy<=23)
	{
		P2=a[2];
	}
	if(yy>23&&yy<26)
	{
		P2=a[3];
	}
	if(yy==26)
		yy=0;
	}
	
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值