1、交通灯 重庆大学本科学生课程设计任务书课程设计题目十字路口交通灯控制器设计学院光电工程学院专业光电信息工程年级2011设计要求:利用单片机设计一个十字路口交通灯控制器,要求如下:(1)用单片机定时器产生秒信号,控制十字路口的红、绿、黄灯交替亮灭,并利用LED数码管显示十字路口两个方向的剩余时间;(2)能用按键设置两个方向的通行时间(绿、红灯点亮时间)和暂缓通行时间(黄灯点亮时间);(3)控制器的工作符合一般交通灯控制要求。学生应完成的工作:1、 按照设计要求,完成芯片的选型与电路设计;2、 在Proteus ISIS 7中完成电路原理图绘制。 3、 利用C语言或汇编语言编写相关软件。4、 利用
2、Proteus ISIS 7进行仿真。5、 完成答辩与设计报告。目前资料收集情况(含指定参考资料):1、Protues教程(第2版),朱清惠等,清华大学出版社,2011。2、单片机应用及C51程序设计,陈涛,机械工业出版社,2008。3、单片机原理与C51程序设计基础教程,张欣等,清华大学出版社,2010。4、MSP430超低功耗单片机原理与应用,沈建华等,清华大学出版社,2013。4、选定芯片的数据手册(学生自行下载)。课程设计的工作计划:6月9日:下达任务、准备资料;6月10日6月14日:设计方案确定、芯片选择、原理图设计;6月15日6月17日:软件设计与仿真;6月18日6月19日:撰写课
3、程设计报告、准备答辩;6月20日:分组进行课程设计答辩;6月21日:整改报告并提交。任务下达日期 2013 年 6 月 8 日完成日期 2013 年 6 月 21日指导教师 杨利平 (签名)学 生 (签名)1、方案实现 通过AT89C51并接数码管与发光二极管来实现,其中8个数码管用来显示秒值,东、西、南、北各两个。12个发光二极管显示交通灯状态,东、西、南、北各三个,分为红、绿、黄三种颜色。正常状态通过普通的I/O口功能实现,特殊状态用外部中断(P3.2和P3.3)来实现。2、程序设计思路 首先东西方向绿灯亮,南北方向红灯亮,同时开始倒计时20s,在7段数码管上显示剩余时间(状态S1) ;
4、20s倒计时结束后,开始3s倒计时,并且东西方向绿灯开始闪烁,南北方向红灯亮 (状态S2); 3s倒计时结束后再开始2s倒计时,并且东西方向黄灯闪烁,南北还是红灯亮 (状态S3); 当2s倒计时结束后,开始20s倒计时,此时南北方向绿灯亮,东西方向红灯亮(状态S4) ; 接下来南北方向绿灯闪烁3s (状态S5); 再南北方向黄灯闪烁2s,(状态S6)接着开始循环。任何时候,按下按键就进入中断程序处理紧急情况,按下按键1,就能改变倒计时显示时间为30s,同时红绿灯状态保持不变,中断后自动返回原来状态 ;按下按键2,就能改变倒计时显示时间为10s,同时东西、南北红绿灯状态变为红色(禁止通行),不断
5、开按键就一直在中断中循环,断开按键后自动返回初始状态S1。3、硬件连线及原理图P2.1P2.6接LED发光二极管;P0、P1口各接七段数码管,分别显示倒计时的个位、十位; P3.2和P3.3分别接按键 图1 硬件原理图3.1复位电路 图2 手动复位电路 图3 自动复位电路 主要用于当程序运行出错或进入死循环时,复位清零。当采用的晶体频率为12MHz时,C=10F,R=8.2k;当采用的晶体频率为6MHz时,C=22F,R=1k. 3.2 时钟电路 图4 内部时钟电路 内部时钟电路构成稳定的自激振荡器,外接石英晶体时,电容C1和C2的值常选择为30pf左右;外接陶瓷谐振器时,C1和C2的值为47
6、pf。接入电容C1和C2有利于振荡器起振,对频率有微调作用。3.3八段LED数码管LED 灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如 dp,g,f,e,d,c,b,a全亮显示为,本次设计采用共阳极连接驱动代码,代码表如下表5所示。 表5 驱动代码表显示数值dp,g,f,e,d,c,b,a驱动代码011010000C0H111111001F9H210100100A4H310110000B0H41001100199H51001001092H61000001082H711111000F8H81000000080H91001000090H 图5 共阳极接法相
7、应在程序软件上,可以通过调用程序给定的秒值经过除法计算,算出需要显示的个位和十位,然后有DPTR调取LEDMAP的代码。3.4 定时器(1)AT89C1晶振频率为12MHz,则机器周期T=1us,定时器选择不同的工作方式下最大定时时间分别为:方式0: Tmax=8.192ms方式1: Tmax=65.536ms方式2、3: Tmax=0.256ms(2)定时器计数初值计算选择定时器0,工作方式1,设定时器初值为50ms,则根据下式计算 50000us=(65536-t)x1us求得计数初值 t=15536=0011110010110000B其中高8位装入TH0,即TH0=3CH;低8位装入TL
8、0,即TL0=0B0H。4、软件程序设计 本次实验设计的程序主要包含:主程序,两个中断程序,计时程序,显示程序,延时1s的程序。具体见以下叙述。4.1 主程序中,是顺次执行,从状态S1顺次执行到S6,然后再次循环。流程图如下: 图6 主程序流程图 定义I/O口:H_RED BIT P2.1 H_GREEN BIT P2.2 ;南北交通灯H_YELLOW BIT P2.3L_RED BIT P2.4 L_GREEN BIT P2.5 ;东西交通灯L_YELLOW BIT P2.6状态S1:东西方向绿灯亮,南北方向红灯亮STATE1: SETB H_RED CLR H_GREEN CLR H_YE
9、LLOW CLR L_RED SETB L_GREEN CLR L_YELLOW 状态S2:东西方向黄灯亮,南北方向红灯亮STATE2: SETB H_RED CLR H_GREEN CLR H_YELLOW CLR L_RED CLR L_GREEN SETB L_YELLOW RET4.2 显示程序 图7 显示程序流程图 该显示程序主要是为了实现倒计时的显示,先将存在SECOND内的数值通过除法运算取出个位与十位,然后通过查表指令在LEDMAP取出字形,并用两个7段SEG把高,低位显示出来。DISPLAY: MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#L
10、EDMAP ;取表首地址 MOVC A,A+DPTR ;查表 MOV P1,A ;显示十位 MOV A,B MOVC A,A+DPTR ;显示个位 MOV P0,A RETLEDMAP: DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H,80H,90H4.3 计时程序 图8 计时程序流程图 COUNT: LCALL DISPLAYWAIT1: JNB TF0,WAIT1 ;定时器50ms未到,则等待 CLR TF0 MOV TH0,#3CH ;定时器50ms到了,清定时器0溢出标志位 MOV TL0,#0B0H LCALL DISPLAY DJNZ R2,W
11、AIT1 ;是否到1s MOV R2,#20 DEC SECOND ;到1s,则秒值减1 DJNZ R3,WAIT1 ;20s是否倒计时减完,未完则返回 RET 4.4 中断程序两个中断程序分别靠双掷开关控制高低电位而实现,中断程序EXINT1和中断程序EXINT2及流程图如下: 图9 中断程序流程图中断初始设置 MOV IE,#10000101B ;INTO、INT1中断允许 MOV IP,#00000100B ;INT1中断优先 MOV TCON,#00000101B ;INTO、INT1为边沿触发 MOV SP,#80H ;设定堆栈指针 4.3 1s延时子程序1s延时程序主要用于中断是进
12、行调用其流程图及程序如下: 图10 延时程序流程图DELAY: MOV TMOD,#01H ;1s定时器延时子程序 MOV TH0,#3CH ;置初值 MOV TL0,#0B0H CLR TF0 SETB TR0 ;启动定时器 MOV R5,#20 LLLL0: JB TF0,LLLL1 ;查询计数溢出位TF0 AJMP LLLL0LLLL1: MOV TH0,#3CH ;重新设置初值 MOV TL0,#0B0H CLR TF0 DJNZ R5,LLLL0 RET也可以用软件方法实现1s延时:DELAY: MOV R5,#100 DD1: MOV R6,#20DD2: MOV R7,#248
13、DJNZ R7,$ DJNZ R6,DD2 DJNZ R5,DD1 RET5、仿真效果图附录: SECOND EQU 60H H_RED BIT P2.1 H_GREEN BIT P2.2 H_YELLOW BIT P2.3 L_RED BIT P2.4 ;定义IO端口 L_GREEN BIT P2.5 L_YELLOW BIT P2.6 ORG 0000H ;CPU复位入口 LJMP MAIN ORG 0003H ;INT0中断入口 AJMP EXINT1 ORG 0013H ;INT1中断入口 AJMP EXINT2 MAIN: MOV IE,#10000101B ;INTO、INT1中断
14、允许 MOV IP,#00000100B ;INT1中断优先 MOV TCON,#00000101B ;INTO、INT1为边沿触发 MOV SP,#80H ;设定堆栈指针 MOV TMOD,#01H ;设置定时器0为方式1 MOV TH0,#3CH MOV TL0,#0B0H ;设置定时器的初始值,定时50ms CLR TF0 ;清定时器0溢出标志 SETB TR0 ;启动定时器 START: CLR A MOV P1,A ; 首先关闭显示 MOV P0,A ;状态1,东西方向绿灯亮,南北方向红灯亮 MOV R2,#20 MOV R3,#21 MOV SECOND,#20 ; 20s初值 L
15、CALL STATE1 LCALL COUNT;状态2,东西方向绿灯闪,南北方向红灯亮 MOV R0,#01H ;标志位,东西方向绿灯闪 MOV R2,#2 MOV R3,#4 MOV R4,#10 MOV SECOND,#3 ;3s初值 LCALL DISPLAY LCALL STATE2 LCALL COUNT1;状态3,东西方向黄灯闪,南北方向红灯亮 MOV R0,#02H ;标志位,东西方向黄灯闪 MOV R2,#2 MOV R3,#3 MOV R4,#10 MOV SECOND,#2 ;2s初值 LCALL STATE3 LCALL COUNT1状态4,东西方向红灯亮,南北方向绿灯亮
16、 MOV R2,#20 MOV R3,#21 MOV SECOND,#20 ; 20s初值 LCALL STATE4 LCALL COUNT状态5,东西方向红灯亮,南北方向绿灯闪 MOV R0,#03H ;标志位,南北方向绿灯闪 MOV R2,#2 MOV R3,#4 MOV R4,#10 MOV SECOND,#3 ;3s初值 LCALL STATE5 LCALL COUNT1状态6,东西方向红灯亮,南北方向黄灯闪 MOV R0,#04H ;标志位,南北方向黄灯闪 MOV R2,#2 MOV R3,#3 MOV R4,#10 MOV SECOND,#2 LCALL STATE6 LCALL
17、COUNT1 LJMP START;*;计时程序;*COUNT: LCALL DISPLAYWAIT1: JNB TF0,WAIT1 ;定时器50ms未到,则等待 CLR TF0 MOV TH0,#3CH ;定时器50ms到了,清定时器0溢出标志位 MOV TL0,#0B0H LCALL DISPLAY DJNZ R2,WAIT1 ;是否到1s MOV R2,#20 DEC SECOND ;到1s,则秒值减1 DJNZ R3,WAIT1 ;20s是否倒计时减完,未完则返回 RET COUNT1: LCALL DISPLAYWAIT2: JNB TF0,WAIT2 CLR TF0 MOV TH0
18、,#3CH MOV TL0,#0B0H LCALL DISPLAY DJNZ R4,WAIT2 ;是否到500ms,未到则返回 CJNE R0,#01H,D1 CPL L_GREEN ;到了500ms,则闪东西方向绿灯D1: CJNE R0,#02H,D2 CPL L_YELLOW ;闪东西方向黄灯灯D2: CJNE R0,#03H,D3 CPL H_GREEN ;闪南北方向绿灯D3: CJNE R0,#04H,D4 CPL H_YELLOW ;闪南北方向黄灯 D4: MOV R4,#10 DJNZ R2,WAIT2 ;是否到1s MOV R2,#2 DEC SECOND DJNZ R3,WA
19、IT2 RET;*;LED显示状态;*STATE1: SETB H_RED ;东西方向绿灯亮,南北方向红灯亮 CLR H_GREEN CLR H_YELLOW CLR L_RED SETB L_GREEN CLR L_YELLOW RET STATE2: SETB H_RED ;东西方向绿灯闪,南北方向红灯亮 CLR H_GREEN CLR H_YELLOW CLR L_RED CLR L_GREEN CLR L_YELLOW RET STATE3: SETB H_RED ;东西方向黄灯闪,南北方向红灯亮 CLR H_GREEN CLR H_YELLOW CLR L_RED CLR L_GRE
20、EN SETB L_YELLOW RET STATE4: CLR H_RED ;东西方向红灯亮,南北方向绿灯亮 SETB H_GREEN CLR H_YELLOW SETB L_RED CLR L_GREEN CLR L_YELLOW RETSTATE5: CLR H_RED ;东西方向红灯亮,南北方向绿灯闪 SETB H_GREEN CLR H_YELLOW SETB L_RED CLR L_GREEN CLR L_YELLOW RETSTATE6: CLR H_RED ;东西方向红灯亮,南北方向黄灯闪 CLR H_GREEN SETB H_YELLOW SETB L_RED CLR L_G
21、REEN CLR L_YELLOW RET;*;显示程序;*DISPLAY: MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#LEDMAP ;取表首地址 MOVC A,A+DPTR ;查表 MOV P1,A ;显示十位 MOV A,B MOVC A,A+DPTR ;显示个位 MOV P0,A RET;*;中断程序;*EXINT1: PUSH ACC PUSH PSW ;保护现场 SETB RS0 ;设定PSW工作寄存器组1,保护R0-R7寄存器内容 CLR RS1 MOV R0,#30 ;使灯亮30sLOOP: MOV A,R0 MOV B,#10 DIV AB
22、 MOV DPTR,#LEDMAP ;取表首地址 MOVC A,A+DPTR ;查表显示 MOV P1,A MOV A,B MOVC A,A+DPTR MOV P0,A CALL DELAY ;调用1s延时子程序 DJNZ R0,LOOP ;没到30s就继续 MOV P1,#0C0H ;显示“00” MOV P0,#0C0H CALL DELAY ;延迟1s POP PSW ;恢复现场 POP ACC RETIEXINT2: PUSH ACC PUSH PSW SETB RS0 CLR RS1 MOV R1,#10 ;使灯亮10sLOOP1: PUSH P2 MOV P2,#12H ;紧急状态
23、,全部亮红灯 MOV A,R1 MOV B,#10 DIV AB MOV DPTR,#LEDMAP MOVC A,A+DPTR MOV P1,A MOV A,B MOVC A,A+DPTR MOV P0,A CALL DELAY ;调用1s延时子程序 DJNZ R1,LOOP1 ;没到10s就继续 MOV P1,#0C0H ;显示“00” MOV P0,#0C0H CALL DELAY ;延迟1s POP PSW POP ACC POP P2 RETI;*DELAY: MOV TMOD,#01H ;1s定时器延时子程序(硬件) MOV TH0,#3CH ;置初值 MOV TL0,#0B0H CLR TF0 SETB TR0 ;启动定时器 MOV R5,#20 LLLL0: JB TF0,LLLL1 ;查询计数溢出位TF0 AJMP LLLL0LLLL1: MOV TH0,#3CH ;重新设置初值 MOV TL0,#0B0H CLR TF0 DJNZ R5,LLLL0 RETLEDMAP: DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H,80H,90H END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1