单片机课程设计——交通灯
一、课程设计主要内容
1.1 题目
交通灯设计
1.2摘要
近年来,随着我国国民经济的快速发展,我国机动车辆发展迅速。而城镇道路建设由于历史等各方面因素相对滞后,交通拥挤和堵塞想想时常发生。如何利用当今计算机和自动控制技术,有效地疏导交通提高城镇交通路口的通行能力,减少交通事故是很值得的研究课题。目前,国内的交通灯一般设计在十字路口,在醒目位置用红绿黄三种颜色的指示灯再加上一个倒计时的显示计时器来控制行车。
1.3关键词
交通灯、51单片机、延时程序
二、设计要求
1、分析单片机实验板原理图,明确每个部件的用途。
2、学会单片机地址分配的方法及实现电路。
3、调试硬件电路系统。
3、要求编写一套软件,实现用4个按键设定交通灯显示、切换功能。
4、写出至少3000字的课程设计总结报告及提供程序清单。
三、设计方案
该交通灯是采用STC89C52RC芯片作为主控芯片,我们购买了普中的开发板。用到了开发板上面的数码管模块、用户定义按键模块、I/O口外接等几部分完成了交通灯的基本逻辑设计。按键可以设置交通灯的模式和数码管的倒计时时间。

四、参考电路设计
4.1.1数码管的设计
根据商家提供的原理图,可知P0口是数码管的段选,P22、P23、P24连接三八译码器来实现数码管的位选,再通过Keil5编写程序控制,就可以实践对每一个数码管显示数字的控制。

4.1.2对应程序
/*******************P0口控制段选信号*************************/
#define duan P0
/*****************3-8译码器控制位选信号**********************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/*****************通用共阳!!!!!!数码管0-F编码**********************/
u8 code wei1[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/***********************数码管显示函数,显示的是miao************************/
void display(u8 a,u8 b)
{
duan=wei1[b];
LSA=0;LSB=0;LSC=0; //0-1
Delay(30);
LSA=0;LSB=0;LSC=0;
duan=wei1[a]; //数组里面是编号的0-F数码管编码
LSA=1;LSB=0;LSC=0; //1-2
Delay(30);
LSA=1;LSB=0;LSC=0;//3--8译码器位选
duan=wei1[b];
LSA=0;LSB=1;LSC=0; //2-3
Delay(30);
LSA=0;LSB=1;LSC=0;
duan=wei1[a];
LSA=1;LSB=1;LSC=0; //3-4
Delay(30);
LSA=1;LSB=1;LSC=0;
duan=wei1[b];
LSA=0;LSB=0;LSC=1;//4-5
Delay(30);
LSA=0;LSB=0;LSC=1;
duan=wei1[a];
LSA=1;LSB=0;LSC=1;//5-6
Delay(30);
LSA=1;LSB=0;LSC=1;
duan=wei1[b];
LSA=0;LSB=1;LSC=1; //6-7
Delay(30);
LSA=0;LSB=1;LSC=1;
duan=wei1[a];
LSA=1;LSB=1;LSC=1; //7-8
Delay(30);
LSA=1;LSB=1;LSC=1;
}

4.2.1独立按键的设计
开发板上面有四个独立按键可以供用户自定义,我定义的是:
sbit key_j=P3^0; //紧急模式按键定义----板子上第二个按键
sbit key_set=P3^1; //设置按键----板子上第一个按键
sbit key_jia=P3^2; //加值按键
sbit key_jian=P3^3; //减值按键

图2 独立按键模块
4.2.2对应程序
/*********************按键检测处理**************************/
void scan()
{
//紧急按键按键
if(key_j==0)
{
delayms(7); //延时等待
if(key_j==0) //再次判断按键按下
{
set_f=0; //设置标记变量set_f=0; 防止和其他显示情况有冲突set_f=1/2
j_f=~j_f; //切换紧急模式和正常模式0-1取反,定义变量时j_f=0
c++;
miao=miao1+miao2; //关系到设置按键模式1,如果倒计时到40时按下按键,倒计时会程序变成60
}
while(!key_j);
delayms(7); //延时等待
while(!key_j);
} //等待按键松开
//设置按键按下
if(key_set==0)
{
delayms(7); //延时消抖
if(key_set==0) //再次判断按键按下
{
//退出紧急模式显示的0000 0000j_f=0;
j_f=0; //如果在紧急模式,退出紧急模式,免得显示冲突
if(set_f==0) //进入设置,紧急按键按下set_f=0,定义变量时set_f=0,设置按键会清set_f=0
{
TR0=0;} //关闭定时器,定时器停止定时,数码管停在那里,显示的数字不变,但是我们看不见,因为set_f很快会切换显示模式
set_f++; //只要按下设置按键,设置变量+1
c++;
if(set_f==3) //设置完成,退出设置,定时器重新开倒计时,数码管开始动
{
set_f=0; //返回模式1,显示miao的情况
//if(y_f==0&&j_f==0) 如果非紧急y_f==0是恒成立的!!!
//if(j_f==0)
TR0=1; //开启定时器,数码管继续停止前的数计时,28停止了就从28开始
}
}
while(!key_set); //等待按键松开
delayms(7);
while(!key_set);
}
//加值键
if(key_jia==0&&set_f!=0) //必须显示miao1或者miao2
{
delayms(7);
if(key_jia==0)
{
if(set_f==1) //设置东西通行时间,miao1++
{
led1=0; //南北直行绿灯,所有的灯都点亮
led2=0; //南北黄灯
led3=0; //南北转弯绿灯
led4=0; //南北红灯
led5=0; //东西直行绿灯
led6=0; //东西黄灯
led7=0; //东西转弯绿灯
led8=0; //东西红灯
if(miao1<99) //最大值可设置15S
{
miao1++; }//东西通行时间+1S,数码管变化,miao1=20
miao=miao1+miao2; //miao=60,miao1=20,miao2=40
if(num21<569)//LED交通灯闪烁也要变化
{
num21=num21+20;}
num2=num21;
}
if(set_f==2) //设置东西通行时间,miao2++
{
led1=0; //南北直行绿灯
led2=0; //南北黄灯
led3=0; //南北转弯绿灯
led4=0; //南北红灯
led5=0; //东西直行绿灯
led6=0; //东西黄灯
led7=0; //东西转弯绿灯
led8=0; //东西红灯
if(miao1<99) //最大可设置15S
{
miao2++;} //东西通行时间+1S,miao2=40
miao=miao1+miao2; //数码管显示miao,miao=60,miao1=20,miao2=40
if(num41<968)
{
num41=num41+20;}
num4=num41;
}
}
while(!key_jia);
delayms(7);
while(!key_jia);//消抖
}
//减值键
if(key_jian==0&&set_f!=0)
{
delayms(7);
if
1万+





被折叠的 条评论
为什么被折叠?



