|
这是六月份做的设计实现的功能是十字路口的交通灯在设定时间进行红绿黄的切换,并设有数码管显示时间
主要用到的工具是Protues,原理图绘制以及最终仿真都是在上面进行
程序撰写用到的是keil,附件中有具体的原理图文件及实现的程序
1、进行东西方向、南北方向秒计时倒数(分红绿灯)
2、实现时间的LED数码管显示
3、具有手动输入的时间调整功能
4、具有黄灯3秒计时功能
设计流程图
明确电路实现的功能
↓
分模块画出电路
↓
将各模块连接起来
↓
使用Keil C51编写控制程序
↓
将程序Hex文件导入Proteus实现仿真
↓
将仿真结果与设计要求进行对比
↓
改进
设计所需器件:
(1)共阴数码管4个(两位)
(2)红黄绿LED灯各4个
(3)AT89C51芯片1块
(4)晶振1个
(5)电阻2个
(6)电容3个
(7)按键4个
(8)排阻1个
实现的程序如下:
#define shuma P0
#include "reg52.h"
#define ON 0
#define OFF 1
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit NS_G=P1^5; // 南北绿灯
sbit NS_Y=P1^4; // 南北黄灯
sbit NS_R=P1^3; // 南北红灯
sbit EW_G=P1^2; // 东西绿灯
sbit EW_Y=P1^1; // 东西黄灯
sbit EW_R=P1^0; // 东西红灯
sbit LED_D1=P2^3; // 南北方向数码管位控制
sbit LED_C1=P2^2; // 南北方向数码管位控制
sbit LED_B1=P2^1; // 东西方向数码管位控制
sbit LED_A1=P2^0; // 东西方向数码管位控制
u8 count;
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void Delay10us(u8 z)
{
u8 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//显示0~9的值
void display1(u8 num1,u8 num2) //控制东西方向数码管显示
{
shuma=table[num1];
LED_A1=ON;
Delay10us(1);
LED_A1=OFF;
shuma=table[num2];
LED_B1=ON;
Delay10us(1);
LED_B1=OFF;
}
void display2(u8 num3,u8 num4) //控制南北方向数码管显示
{
shuma=table[num3];
LED_C1=ON;
Delay10us(1);
LED_C1=OFF;
shuma=table[num4];
LED_D1=ON;
Delay10us(1);
LED_D1=OFF;
}
void main()
{
count=0;
Timer0Init();//初始化计数器
NS_R=OFF; //南北方向红灯关闭
EW_R=OFF; //东西方向红灯关闭
while(1)
{
if(count==46) //重新计数
{
count=0;
}
if(count<20)
{
display1((20-count)/10,(20-count)%10);//东西方向绿灯(20s)
display2((23-count)/10,(23-count)%10);//南北方向红灯(23s)
EW_G=ON;
NS_R=ON;
EW_R=OFF;
NS_Y=OFF;
}
else if(count<23)
{
display1((23-count)/10,(23-count)%10);//东西方向黄灯(3s)
display2((23-count)/10,(23-count)%10);//南北方向红灯倒计时(3s)
EW_Y=ON;
NS_R=ON;
EW_G=OFF;
}
else if(count<43)
{
display1((46-count)/10,(46-count)%10);//东西方向红灯(23s)
display2((43-count)/10,(43-count)%10);//南北方向绿灯(20s)
EW_R=ON;
NS_G=ON;
EW_Y=OFF;
NS_R=OFF;
}
else
{
display1((46-count)/10,(46-count)%10);//东西方向红灯倒计时(3s)
display2((46-count)/10,(46-count)%10);//南北方向黄灯(3s)
NS_Y=ON;
EW_R=ON;
NS_G=OFF;
}
}
}
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
count ++;
}
}
仅供有需要的师兄学习参考,请不要有其他用途,谢谢!
|
|