《基于LCD12864的交通信号灯单片机课程设计报告.doc》由会员分享,可在线阅读,更多相关《基于LCD12864的交通信号灯单片机课程设计报告.doc(51页珍藏版)》请在三一办公上搜索。
1、湖南大学电气与信息工程学院本科生单片机课程设计 题目:基于LCD12864的交通信号灯 学 院:电气与信息工程学院专业:电气工程及其自动化班级:学号:姓名:指导老师:设计时间: 2012年6月 29日 交通灯的历史1868年12月10日,信号灯家族的第一个成员就在伦敦议会大厦的广场上诞生了,由当时英国机械师德哈特设计、制造的灯柱高7米,身上挂着一盏红、绿两色的提灯-煤气交通信号灯,这是城市街道的第一盏信号灯。1914年,在美国的克利夫兰市才率先恢复了红绿灯,不过,这时已是“电气信号灯”。稍后又在纽约和芝加哥等城市,相继重新出现了交通信号灯。随着各种交通工具的发展和交通指挥的需要,第一盏名副其实
2、的三色灯(红、黄、绿三种标志)于1918年诞生。它是三色圆形四面投影器,被安装在纽约市五号街的一座高塔上,由于它的诞生,使城市交通大为改善。中国最早的马路红绿灯,则是于1928年出现在上海的英租界。目 录第一部分 开发板部分硬件介绍3一、板上资源分布3二、ADuC848简要介绍5三、LCD显示模块6第二部分 交通信号灯的设计8一、题目任务设计要求8二、系统原理分析及流程框图8三、具体程序实现10四、具体操作步骤18五、设计心得体会19六、参考文献21附录一:开发板硬件图22附录二:单片机历史23第一部分 开发板硬件部分介绍一、板上资源分布图1.1 板上资源分布1、2、3:单片机P0、P2、P3
3、口引出接口(有限流保护电阻); 4:上排图形点阵LCD12864的接口、下排LCD1602的接口; 5、6:两路16位ADC输入、可作差分输入; 7、8:12位DAC输出、对DAC输出进行比例放大或者跟随的运放; 9:单片机AduC848; 10:无源蜂鸣器、由单片机PWM模块输出信号控制; 11:8位数码管; 12:SPI接口; 13:RS232串口(通过串口在线下载、单步、断点、运行到某一行等方式调试程序); 14:步进电机(5V、70欧姆、6线4相)接口; 15:8路LED,从左至右为LED70,分别被P0.7P0.0控制; 16:复位按键和下载按键; 17、18:IIC总线上的EEPR
4、OM AT24C08和RTC DS1307; 19:IIC接口; 20:PS/2接口; 21:红外接收头; 22:功能选择和配置插针; 23:4X4矩阵式键盘或4个独立按键; 24:直流电源输入; 此外还有红外二极管(由单片机PWM模块输出信号控制)、USB电源输入接口。二、ADuC848的简要介绍1、8051-based core、5V供电电压; 2、可以通过串口在线下载程序和单步、断点、运行到某一行等方式调试程序; 3、16位8通道-ADC,片内有1.25V参考电压、buffer和PGA; 4、12位电压输出DAC、Dual 16-BIT - DAC; 5、32kbyte程序存储器、4kb
5、yte用户信息Flash存储器、256RAM+2048XRAM(byte); 6、PLL(12.58 MHz max)(片外只需接32.768kHz晶振); 7、316位定时/计数器、看门狗定时器; 8、11中断源(2优先级)、11位堆栈指针; 9、24I/O+8模拟或数字输入; 10、UART、 SPI和I2C、高速115200波特率发生; 11、Power supply monitor、上电复位、Dual 200A激励电流源。12、单片机引脚分布 三、 LCD显示模块 LCD显示信号连接图如下图所示。图1.7 LCD信号连接关键网络名和引脚名解释: (1)DISCTRL04:显示控制信号。
6、(2)D0D7、DB0DB7:数据总线。(3)E:LCD使能信号。(4)RS:数据、指令选择信号。(5)RW:读、写选择信号。(6)CS1、CS2:LCD12864由两部分组成,CS1和CS2为选择信号。板上接口4的上排位LCD12864的接口,下排位LCD1602的接口,排针和排母左对齐插入。第二部分 交通信号灯的设计一、 题目任务设计要求1、 题目设计及目的(1)设计一智能交通信号灯。(1)了解交通灯管理的基本工作原理(2)熟悉ADuC848的工作原理和应用编程(3)熟悉ADuC848并行接口的各种工作方式和应用(4)熟悉AT89C51计数器/定时器的工作方式和应用编程外部中断的方法(5)
7、掌握LCD显示问题的解决 2、题目设计要求(1)了解实际交通灯的变化规律(以十字路口为例)(2)要求用LCD显示字符“红、黄、绿”(或字母r、y、g)代替相应的信号灯(3)要求有东西、南北四组信号灯显示,并显示对应的时间(4)时间要求倒计时显示,计时时间到,对应的信号准确切换(5)信号灯按一定的规律闪烁,实现简单的交通管理(6)能实现紧急事件处理(例如救护车的通行等),可用蜂鸣器报警和特殊数字显示(7)可根据交通流量智能调整各路段的通行时间(8)显示北京时间,可调整二、系统原理分析及程序流程框图1、交通灯通常指由红、黄、绿三种颜色灯组成用来指挥交通的信号灯。绿灯亮时,准许车辆通行,黄灯亮时,已
8、越过停止线的车辆可以继续通行;红灯亮时,禁止车辆通行。下图为一种红绿灯的显示状态图状态一:红红绿绿设东西向为主干道,东西向绿灯定为20s. 状态二 红红黄黄 设定黄灯时间为5s。状态三 绿绿红红 南北向为副干道,南北向绿灯设为10s 状态四 黄黄红红南北向黄灯也设为5s.紧急状态:红红红红此时为紧急状态,所有灯为红灯,所有车辆禁止通行,触发紧急状态由紧急按钮触发,再次触发,则解除紧急状态,回到原来状态。2、 车流量处理。首先根据两条道路的车流量划分为主干道和副干道,主干道和副干道的绿灯时间设置不一样,主干道的绿灯时间设置的较长,红灯时间等于另一条道路的绿灯时间与黄灯时间之和。其次,考虑有车流高
9、峰时期,在本次设计中,设置北京时间18:00:0020:00:00为车流量高峰时期,在此时期,亮灯时间会变成另一个设定值,具体设置可依据实践情况设置,本次设计中将主干道,副干道绿灯实践均延长10s.当在此时期之外时,亮灯时间为正常设定时间。3、倒计时显示。 东西南北四个方向各有一个倒计时显示,倒计时数字表示当前亮灯的剩余时间。因为相对的方向显示相同,因而本次设计中只两个倒计时显示,一个表示南北方向,一个表示东西方向。计时的快慢通过改变对频率的计数实现。4、北京时间显示。 本次设计中,12864LCD显示屏第一行显示北京时间的时、分、秒,时间可调。北京时间功能采用T0计时器中断来实现。ADuC8
10、48的core clock频率默认为1.572864MHz,定时器0的时钟为core clock,1572864=65536*24。故将定时器0设置为16位计数模式,且初值为0,无需在定时器溢出中断中给定时器赋初值(中断溢出就开始执行中断程序,计数器为加法计数器,从0加到65536)。每65536个core clock周期将产生一次中断,在中断处理程序中累计中断次数,当有24次中断产生时即为1秒,进行计时。5、主程序流程图 开始设置定时方式,初始化运行过程NKey是否有输出YY是否Key=16紧急状态NY北京时间调节是否Key=13N5、 交通灯显示流程图 开始状态一N是否green0=0Y状
11、态二N是否red1=0Y状态三N是否green1=0Y状态四N是否red0=0Y三、具体程序实现#include#includeds1307.h#includejuzhenkeyboard.h#includesmg12864.h#define unchar unsigned char#define unint unsigned intsbit buzzer=P26;unchar green2=50,30;unchar yellow2=5,5;unchar red2=55,35;unchar time7=1,2,1,1,1,1,1;unint timeflag=0;unchar state=0;
12、unchar state_buffer;unchar zhugandao=20;unchar fudao=10;unchar key=0;unchar weizhi=0;bit jinjiflag=0;bit set_flag=0;unint i;unchar j;void jiaotong_con(void)switch(state) case 0: displayascall(1,2,shuzi16); displayascall(2,2,shuzi16); displayascall(3,2,shuzi16); displayascall(4,2,shuzi16); displayasc
13、all(5,2,shuzi16); displayascall(6,2,shuzi16); displayascall(9,2,shuzi16); displayascall(10,2,shuzi16); displayascall(11,2,shuzi16); displayascall(14,2,shuzi16); displayascall(15,2,shuzi16); displayascall(16,2,shuzi16); displayascall(1,4,shuzi16); displayascall(2,4,shuzi16); displayascall(3,4,shuzi16
14、); displayascall(4,4,shuzi16); displayascall(5,4,shuzi16); displayascall(6,4,shuzi16); displayascall(9,4,shuzi16); displayascall(10,4,shuzi16); displayascall(11,4,shuzi16); displayascall(12,4,shuzi16); displayascall(13,4,shuzi16); displayascall(14,4,shuzi16); displayascall(15,4,shuzi16); displayasca
15、ll(16,4,shuzi16); displayascall(1,3,shuzi16); displayascall(2,3,shuzi16); displayascall(3,3,shuzi16); displayascall(4,3,shuzi16); displayascall(7,3,shuzi16); displayascall(8,3,shuzi16); displayascall(11,3,shuzi16); displayascall(14,3,shuzi16); displayascall(15,3,shuzi16); displayascall(16,3,shuzi16)
16、; displayhanzi(3,3,table1); displayhanzi(5,3,table1); displayhanzi(4,2,table0); displayhanzi(4,4,table0); displayshuzi(12,3, green0);displayshuzi(12,2, red1); green0-; red1-; if(green0=0) green0=zhugandao;green1=fudao;red0=fudao+5;yellow0=5;yellow1=5; state=1; /转黄红 break; case 1: displayascall(1,2,s
17、huzi16); displayascall(2,2,shuzi16); displayascall(3,2,shuzi16); displayascall(4,2,shuzi16); displayascall(5,2,shuzi16); displayascall(6,2,shuzi16); displayascall(9,2,shuzi16); displayascall(10,2,shuzi16); displayascall(11,2,shuzi16); displayascall(14,2,shuzi16); displayascall(15,2,shuzi16); display
18、ascall(16,2,shuzi16); displayascall(1,4,shuzi16); displayascall(2,4,shuzi16); displayascall(3,4,shuzi16); displayascall(4,4,shuzi16); displayascall(5,4,shuzi16); displayascall(6,4,shuzi16); displayascall(9,4,shuzi16); displayascall(10,4,shuzi16); displayascall(11,4,shuzi16); displayascall(12,4,shuzi
19、16); displayascall(13,4,shuzi16); displayascall(14,4,shuzi16); displayascall(15,4,shuzi16); displayascall(16,4,shuzi16); displayascall(1,3,shuzi16); displayascall(2,3,shuzi16); displayascall(3,3,shuzi16); displayascall(4,3,shuzi16); displayascall(7,3,shuzi16); displayascall(8,3,shuzi16); displayasca
20、ll(11,3,shuzi16); displayascall(14,3,shuzi16); displayascall(15,3,shuzi16); displayascall(16,3,shuzi16); displayhanzi(3,3,table2); displayhanzi(5,3,table2); displayhanzi(4,2,table0); displayhanzi(4,4,table0);displayshuzi(12,3, yellow0-);displayshuzi(12,2, red1); /green0-; red1-; if(red1=0) red1=zhug
21、andao+5;green0=zhugandao;green1=fudao;red0=fudao+5;yellow0=5;yellow1=5; state=2; break; case 2: displayascall(1,2,shuzi16); displayascall(2,2,shuzi16); displayascall(3,2,shuzi16); displayascall(4,2,shuzi16); displayascall(5,2,shuzi16); displayascall(6,2,shuzi16); displayascall(9,2,shuzi16); displaya
22、scall(10,2,shuzi16); displayascall(11,2,shuzi16); displayascall(14,2,shuzi16); displayascall(15,2,shuzi16); displayascall(16,2,shuzi16); displayascall(1,4,shuzi16); displayascall(2,4,shuzi16); displayascall(3,4,shuzi16); displayascall(4,4,shuzi16); displayascall(5,4,shuzi16); displayascall(6,4,shuzi
23、16); displayascall(9,4,shuzi16); displayascall(10,4,shuzi16); displayascall(11,4,shuzi16); displayascall(12,4,shuzi16); displayascall(13,4,shuzi16); displayascall(14,4,shuzi16); displayascall(15,4,shuzi16); displayascall(16,4,shuzi16); displayascall(1,3,shuzi16); displayascall(2,3,shuzi16); displaya
24、scall(3,3,shuzi16); displayascall(4,3,shuzi16); displayascall(7,3,shuzi16); displayascall(8,3,shuzi16); displayascall(11,3,shuzi16); displayascall(14,3,shuzi16); displayascall(15,3,shuzi16); displayascall(16,3,shuzi16); displayhanzi(3,3,table0); displayhanzi(5,3,table0); displayhanzi(4,2,table1); di
25、splayhanzi(4,4,table1);displayshuzi(12,3, red0);displayshuzi(12,2, green1); green1-; red0-; if(green1=0) red1=fudao+5;green0=zhugandao;green1=fudao;yellow0=5;yellow1=5; state=3; break; case 3: displayascall(1,2,shuzi16); displayascall(2,2,shuzi16); displayascall(3,2,shuzi16); displayascall(4,2,shuzi
26、16); displayascall(5,2,shuzi16); displayascall(6,2,shuzi16); displayascall(9,2,shuzi16); displayascall(10,2,shuzi16); displayascall(11,2,shuzi16); displayascall(14,2,shuzi16); displayascall(15,2,shuzi16); displayascall(16,2,shuzi16); displayascall(1,4,shuzi16); displayascall(2,4,shuzi16); displayasc
27、all(3,4,shuzi16); displayascall(4,4,shuzi16); displayascall(5,4,shuzi16); displayascall(6,4,shuzi16); displayascall(9,4,shuzi16); displayascall(10,4,shuzi16); displayascall(11,4,shuzi16); displayascall(12,4,shuzi16); displayascall(13,4,shuzi16); displayascall(14,4,shuzi16); displayascall(15,4,shuzi1
28、6); displayascall(16,4,shuzi16); displayascall(1,3,shuzi16); displayascall(2,3,shuzi16); displayascall(3,3,shuzi16); displayascall(4,3,shuzi16); displayascall(7,3,shuzi16); displayascall(8,3,shuzi16); displayascall(11,3,shuzi16); displayascall(14,3,shuzi16); displayascall(15,3,shuzi16); displayascal
29、l(16,3,shuzi16); displayhanzi(3,3,table0); displayhanzi(5,3,table0); displayhanzi(4,2,table2); displayhanzi(4,4,table2);displayshuzi(12,3, red0);displayshuzi(12,2, yellow1-); red0-; if(red0=0) green0=zhugandao;green1=fudao;red0=fudao+5;red1=zhugandao+5;yellow0=5;yellow1=5;state=0; break; case 4: dis
30、playascall(1,2,shuzi16); displayascall(2,2,shuzi16); displayascall(3,2,shuzi16); displayascall(4,2,shuzi16); displayascall(5,2,shuzi16); displayascall(6,2,shuzi16); displayascall(9,2,shuzi16); displayascall(10,2,shuzi16); displayascall(11,2,shuzi16); displayascall(14,2,shuzi16); displayascall(15,2,s
31、huzi16); displayascall(16,2,shuzi16); displayascall(1,4,shuzi16); displayascall(2,4,shuzi16); displayascall(3,4,shuzi16); displayascall(4,4,shuzi16); displayascall(5,4,shuzi16); displayascall(6,4,shuzi16); displayascall(9,4,shuzi16); displayascall(10,4,shuzi16); displayascall(11,4,shuzi16); displaya
32、scall(12,4,shuzi16); displayascall(13,4,shuzi16); displayascall(14,4,shuzi16); displayascall(15,4,shuzi16); displayascall(16,4,shuzi16); displayascall(1,3,shuzi16); displayascall(2,3,shuzi16); displayascall(3,3,shuzi16); displayascall(4,3,shuzi16); displayascall(7,3,shuzi16); displayascall(8,3,shuzi
33、16); displayascall(11,3,shuzi16); displayascall(14,3,shuzi16); displayascall(15,3,shuzi16); displayascall(16,3,shuzi16); displayhanzi(3,3,table0); displayhanzi(5,3,table0); displayhanzi(4,2,table0); displayhanzi(4,4,table0); displayascall(12,3,shuzi16); displayascall(13,3,shuzi16); displayascall(12,
34、2,shuzi16); displayascall(13,2,shuzi16); break; default:break;void main(void)PLLCON&=0xf8;/设置频率为12.58MHzI2CCON=0xE8;/配置IIC为软件主发送模式TMOD = 0x01; TH0 = 0x0EC; TL0 = 0x78; EA = 1; ET0 = 1; TR0 = 1;inital();clear();/SwitchRTC(0);/SetTime(time);SwitchRTC(1);green0=zhugandao;green1=fudao;red0=fudao+5;red1=
35、zhugandao+5;yellow0=5;yellow1=5;state=0;while(1)if(time2=18&time2=20) zhugandao=30; fudao=20;else zhugandao=20; fudao=10; key=get_keyvalue(); if(key=16)jinjiflag=!jinjiflag;if(jinjiflag=1)state_buffer=state;elsestate=state_buffer; if(jinjiflag=1) for(i=0;i10000;i+) buzzer=!buzzer; for(j=0;j120;j+);
36、state=4; if(key=13) set_flag=!set_flag; if(set_flag) weizhi=0x01; else weizhi=0x00; if(set_flag & key!=0) if(key=4)weizhi=1; if(weizhi=0x00)weizhi=0x20;else switch(weizhi) case 0x01:switch(key)case 1:time0=time0/10*10+1;break;case 5:time0=time0/10*10+2;break;case 9:time0=time0/10*10+3;break;case 2:t
37、ime0=time0/10*10+4;break;case 6:time0=time0/10*10+5;break;case 10:time0=time0/10*10+6;break;case 3:time0=time0/10*10+7;break;case 7:time0=time0/10*10+8;break;case 11:time0=time0/10*10+9;break;case 8:time0=time0/10*10;break;default:break;break;case 0x02:switch(key)case 1:time0=time0%10+10;break;case
38、5:time0=time0%10+20;break;case 9:time0=time0%10+30;break;case 2:time0=time0%10+40;break;case 6:time0=time0%10+50;break;case 8:time0=time0%10;break; default:break;break;case 0x04:switch(key)case 1:time1=time1/10*10+1;break;case 5:time1=time1/10*10+2;break;case 9:time1=time1/10*10+3;break;case 2:time1
39、=time1/10*10+4;break;case 6:time1=time1/10*10+5;break;case 10:time1=time1/10*10+6;break;case 3:time1=time1/10*10+7;break;case 7:time1=time1/10*10+8;break;case 11:time1=time1/10*10+9;break;case 8:time1=time1/10*10;break; default:break;break;case 0x08:switch(key)case 1:time1=time1%10+10;break;case 5:time1=time1%10+20;break;case 9:time1=time1%10+30;break;case 2:time1=time1%10+40;break;case 6:time1=time1%10+50;break;cas