电子与信息工程学院
课 程 设 计 报 告
(2010— 2011学年 第 2 学期)
课程名称: 创新课题课程设计
班 级: 电子0801
学 号: 15
姓 名: 奚俊明
指导教师: 张畅
2011年 03月
1、目的
1.运用所学理论知识及实验方法解决实际问题,加强分析问题和解决问题的能力
2.培养构造一个控制系统框架的能力
3.能综合运用所学专业知识使之对所设计系统具有独立调试的能力和故障处理的能力
2、内容和要求
任务1:交通灯
(1)基本要求:以单片机为核心设计一个完整的交通灯模拟系统。所谓模拟就是以每组有绿,红,黄色3支共两组发光二极管表示交通信号灯,数码管2只共两组以递减的方式表示各色信号灯的时间。
在双干线路口上,交通信号灯的变化是定时的。假定:
⑴. 放行线,绿灯亮放行25秒,黄灯亮警告5秒,然后红灯亮禁止。
⑵. 禁止线,红灯亮禁止30 秒,然后绿灯亮放行。
使两条路线交替地成为放行线和禁止线,就可以实现定时交通控制。假定以P1口线接6支发光二极管(即交通信号灯),因为电路中有反相器的关系,所以口线输出高电平则“信号灯”熄灭,口线输出低电平则“信号灯“亮。
(2)进阶要求一:在基本要求的基础上,要求红绿灯时间可通过按键设置,例如红灯60秒,绿灯52秒,黄灯8秒。提示:时间设置一定是要遵循以下规律:红灯时间=绿灯时间+黄灯时间;
任务2:秒表
要求:至少包括4个功能:时间清零;启动计时;暂停计时;继续计时;计时最小单位0.1 秒,最大计时时间999.9秒
3.过程(如实际程序开发、电子制作,详细说明有关原理、开发过程、调试过程、结果)
一.交通灯的设计
需实现的效果如下:复位后,首先按照黄灯5秒 绿灯25秒正常运行,然后能通过按键进入设置黄绿灯的时间,再通过按键进入正常交通灯的过程,若重新设置黄绿灯的时间再通过按键进入设置黄红绿时间,依次循环
总设计原理:交通灯的设计主要是两个循环,一个是设置黄绿灯时间模块循环,另一个是交通的正常运行模块循环,要实现能自由改变时间,就要在每个循环里查询按键开关口,有按键后就进入另个一个循环
所需硬件子电路有:
电源电路模块:
下载电路模块:
(1)max232简介:
由于电脑串口rs232电平是-10v +10v,而一般的单片机应用系统的信号电压是ttl电平+5v,max232就是用来进行电平转换的,该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平,低电源电流:典型值是8mA。
max232接单片机的串行通信口的连接图
单片机最小系统模块:
时钟电路在单片机的外部通过XTAL1,XTAL2这两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器。本系统采用的为11.0592MHz的晶振,微调电容为30pF。
1、8155驱动数码管显示电路模块
在交通灯系统中,四位数码管是用来显示交通灯倒计时时间的,一路显示放行线时间,一路显示禁止线时间
四位数码管的电路如图:
四位八段数码管,属共阴逆序,高电平有效,所以不带小数点的0-f的段码如下:
{0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH};
PROTEUS
四位数码管的显示使用了并行扩展芯片8155,8155与单片机SST89E58RD的接口如图
8155简介
8155是多功能的可编程外围接口芯片,内部资源有256B的RAM,2个8位、1个6位的I/O口和1个14位的“减1”计数器。其地址按片外RAM统一编址(16位)。CE、IO/M接单片机的高8位地址。I/O口(即片内寄存器)地址:CE=0、IO/M=1,低3位选择寄存器。
8155的高8位数据地址线与单片机的P0口相连,CE与AD15相连,IO/M与AD8相连
数码管的八位段选与PB口相连,四位位选与PA口相连。
用C语言初始化8155和显示程序如下:
#define PA8155 XBYTE[0x7101]
#define PB8155 XBYTE[0x7102]
#define COM8155 XBYTE[0x7100]
COM8155=0x03;
2、发光二极管模块
用两组分别为红黄绿共六盏LED灯来模拟实际的交通信号灯,时间上遵循红灯时间等
于绿灯时间加黄灯时间。LED灯是低电平有效,硬件电路图如图
EMBED PBrush
LED的控制是在定时器0的中断中实现的,每一秒时间到后,会根据实时时间(current_time)与红黄绿时间比较,来确定相应的两盏灯亮
3.进阶一的实现(即实现交通灯时间的自由修改)
在程序运行的过程中,要实现绿灯和黄灯时间的修改,我们需要使用一个外部中断,在中断中实现要修改的灯的颜色,选定颜色后,再扫描两个IO口来实现时间的加减
具体是扫描P3.4口实现加,扫描P3.5口实现减
主程序:
/*****以下是单片机与8155控制线的接线说明******
8155 MCU(1)
数据口: D0~D7 P00~P07
片选CE: 8155CE P27
IO/M: 8155IO/M P20
*****以上是单片机与8155控制线的接线说明******/
#include
#include
#include
#include
//12M 晶振 50MS
#define STL0 0X0AF
#define STH0 0X3C
//定义8155端口地址
#define PA8155 XBYTE[0x7101]
#define PB8155 XBYTE[0x7102]
#define COM8155 XBYTE[0x7100]
/************************段码说明***********************
段码 D7 D6 D5 D4 D3 D2 D1 D0
段名 a b c d e f g dp共阴逆序
*************************段码说明**********************/
unsigned char code Table1[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //0~9的段码
unsigned char Dis_BUF[4]={0,1,2,3};//显存
unsigned char Red_Sec=30; //30秒
unsigned char Yellow_Sec=5; //5秒
unsigned char key_flag=0;
unsigned char One_Second_Flag=0;
unsigned char Red_Sec_Counter=30;
unsigned char Led_State_Flag=0;
sbit Red_H=P1^0;
sbit Yellow_H=P1^1;
sbit Green_H=P1^2;
sbit Red_L=P1^3;
sbit Yellow_L=P1^4;
sbit Green_L=P1^5;
//定义按键位置
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^2;
/****************************************************
函数名称:delay
功能: 延时函数
参数: unsigned int i
返回值:无
****************************************************/
void delay(unsigned int itime) //延时函数
{
while(itime--);
}
/****************************************************
函数名称:BCD_TO_BUF
功能: 分解红灯黄灯时间,对应四个数码管
参数:red_sec_counter,yellow_sec_counter
返回值:无
****************************************************/
void BCD_TO_BUF(unsigned char rlight,unsigned char ylight)
{
Dis_BUF[0]=rlight%10;
Dis_BUF[1]=rlight/10;
Dis_BUF[2]=ylight%10;
Dis_BUF[3]=ylight/10;
}
/****************************************************
函数名称:Disp_LED
功能: 显示函数,将红黄灯时间显示在数码管上
参数: *Bufptr(四位数组显存Dis_BUF)
返回值:无
****************************************************/
void Disp_LED(unsigned char *Bufptr)
{
unsigned char disi;
unsigned char BitCT=0X10;
for(disi=0;disi<4;disi++)
{
PA8155=BitCT; //选中个位数码管
PB8155=Table1[*Bufptr++]; //取段码
BitCT=_crol_(BitCT,1); //左移一位
delay(200);
}
}
/****************************************************
函数名称:Time0()
功能: 计时器
参数: 无
返回值:无
****************************************************/
void Time0() interrupt 1
{
TL0=STL0; //TL0=0XAF
TH0=STH0; //TH0=0X3C
//50ms
One_Second_Flag++;
if(One_Second_Flag>19)
{
One_Second_Flag=0;
if(Red_Sec_Counter>0)
Red_Sec_Counter--;
else
Red_Sec_Counter=Red_Sec;
}
}
/****************************************************
函数名称:keyturn()
功能:key3切换key_flag
参数: 无
返回值:无
****************************************************/
void keyturn() interrupt 0
{
EA=0;
if(!key3)
{
delay(500);
if(!key3)
{
key_flag++;
}
}
if(key_flag>2)
{key_flag=0;}
EA=1;
}
/****************************************************
函数名称:LED_STATE(unsigned char ledflag)
功能: 四种状态
参数: 无
返回值:无
****************************************************/
void LED_State(unsigned char ledflag)
{
switch(ledflag)
{
case 0: //H方向:红灯亮,其他灯灭;L方向:绿灯亮,其他灯灭;
Red_H=0;
Yellow_H=1;
Green_H=1;
Red_L=1;
Yellow_L=1;
Green_L=0;
break;
case 1: //H方向:红灯亮,其他灯灭;L方向:黄灯亮,其他灯灭;
Red_H=0;
Yellow_H=1;
Green_H=1;
Red_L=1;
Yellow_L=0;
Green_L=1;
break;
case 2: //H方向:绿灯亮,其他灯灭;L方向:红灯亮,其他灯灭;
Red_H=1;
Yellow_H=1;
Green_H=0;
Red_L=0;
Yellow_L=1;
Green_L=1;
break;
case 3: //H方向:黄灯亮,其他灯灭;L方向:红灯亮,其他灯灭;
Red_H=1;
Yellow_H=0;
Green_H=1;
Red_L=0;
Yellow_L=1;
Green_L=1;
break;
}
}
/****************************************************
函数名称:set_key
功能: 产生新的时间
参数: 无
返回值:新时间
****************************************************/
unsigned int set_key (unsigned char sec)
{
if(!key1)
{
delay(20000);
sec++;
}
if(!key2)
{
delay(20000);
sec--;
}
return sec;
}
//主函数
void main()
{
TL0=STL0;
TH0=STH0;
TMOD=0x01;//选择定时器功能,工作方式1(即16位计数)
EA=1;
ET0=1;//允许定时器0中断
EX0=1;
IT0=1;//边沿触发
TR0=1;//启动定时器
P1=0xff;
LED_State(Led_State_Flag);
COM8155=0x03; //初始化8155控制口
while(1)
{
if(Red_Sec_Counter==Yellow_Sec)
{
if((Led_State_Flag==0)||(Led_State_Flag==2))
{
Led_State_Flag=(Led_State_Flag+1)%4;
LED_State(Led_State_Flag);
}
}
else if(Red_Sec_Counter==0)
{
if((Led_State_Flag==1)||(Led_State_Flag==3))
{
Led_State_Flag=(Led_State_Flag+1)%4;
LED_State(Led_State_Flag);
}
}
switch(key_flag)
{
case 0:
switch(Led_State_Flag)
{
case 0: //H方向:红灯亮,其他等灭;L方向:绿灯亮,其他等灭;
BCD_TO_BUF(Red_Sec_Counter,Red_Sec_Counter-Yellow_Sec);
break;
case 1: //H方向:红灯亮,其他等灭;L方向:黄灯亮,其他等灭;
BCD_TO_BUF(Red_Sec_Counter,Red_Sec_Counter);
break;
case 2: //H方向:绿灯亮,其他等灭;L方向:红灯亮,其他等灭;
BCD_TO_BUF(Red_Sec_Counter-Yellow_Sec,Red_Sec_Counter);
break;
case 3: //H方向:黄灯亮,其他等灭;L方向:红灯亮,其他等灭;
BCD_TO_BUF(Red_Sec_Counter,Red_Sec_Counter);
break;
}
break;
case 1:
Red_Sec=set_key(Red_Sec);
BCD_TO_BUF(Red_Sec,0);
break;
case 2:
Yellow_Sec=set_key(Yellow_Sec);
BCD_TO_BUF(0,Yellow_Sec);
break;
}
Disp_LED(Dis_BUF);
}
}
程序流程图:
N
Y
Y
N
Y
N
Y
N
主流程图
程序出现的问题及修改:
1.当设置好黄绿灯时间后,进入交通灯状态时,一开始数码管显示的