500 likes | 643 Views
项目六 交通信号灯模拟控制. 任务一 交通信号灯的显示器控制及实现. 任务二 交通信号灯按键控制及实现. 任务一 交通信号灯的显示器控制与实现. ( 1 )硬件设备: 单片机开发系统、 PC 机等;. ( 2 )电路原理:电路原理如下图所示。. 南北方向信号灯. 东西方向信号灯. 具体设计要求:. ( 3 )任务要求. 该设计能控制东、西、南、北四个路口的红、黄、绿信号灯正常工作。 当东西方向放行、南北方向禁行时,东西方向绿灯亮 25s ,然后黄灯亮 5s ;南北方向红灯亮 30s 。
E N D
项目六 交通信号灯模拟控制 任务一 交通信号灯的显示器控制及实现 任务二 交通信号灯按键控制及实现
任务一 交通信号灯的显示器控制与实现 (1)硬件设备:单片机开发系统、PC机等; (2)电路原理:电路原理如下图所示。
南北方向信号灯 东西方向信号灯
具体设计要求: (3)任务要求 • 该设计能控制东、西、南、北四个路口的红、黄、绿信号灯正常工作。 • 当东西方向放行、南北方向禁行时,东西方向绿灯亮25s,然后黄灯亮5s;南北方向红灯亮30s。 • 当南北方向放行、东西方向禁行时,南北方向绿灯亮25s,然后黄灯亮5s;东西方向红灯亮30s。 利用单片机实现对交通能信号灯控制,并能通过显示器进行时间的显示。
(4)任务目的 1)交通信号灯的控制原理; 2)掌握显示器控制方法及编程实现; 3)提高知识综合应用能力。
(5)源程序设计 1) 程序中使用的工作单元定义如下: R1——秒数个位字形码寄存器; R2——秒数十位字形码寄存器; R5——控制定时时间的重复次数 R6——显示位寄存器的初始值(右边一位) 50H——30s显示计数器。 2) 定时器/计数器的参数计算 设系统时钟脉冲频率为6MHZ,定时器T0实现100ms定时,计数器的初始值为: (TH0)=3CH,(TL0)=0B0H 模式控制寄存器TMOD中的控制字为: (TMOD)=01H
主程序MAIN ORG 3000H MAIN: MOV DPTR,#7F00H ;8155芯片初始化 MOV A,#0BH ;PA、PC口均为输出 MOVX @DPTR,A MOV 50H,#1FH ;设置时间显示初值 MOV P1,#33H ;A线放行,B线禁行 MOV R7,#19H ;延时秒数 MAIN1:LCALL DISP ;调1s延时、及显示子程序 DJNZ R7,MAIN1 MOV P1,#35H ;A线警告,B线禁行 MOV R7,#05H ;延时秒数
MAIN2:LCALL DISP DJNZ R7,MAIN2 MOV 50H,#1FH ;设置时间显示初值 MOV P1,#1EH ;A线禁行,B线放行 MOV R7,#19H ;延时秒数 MAIN3:LCALL DISP DJNZ R7,MAIN3 MOV P1,#2EH ;A线禁行,B线警告 MOV R7,#05H ;延时秒数 MAIN4:LCALL DISP DJNZ R7,MAIN4 AJMP MAIN ;循环 延时、显示程序DISP: DISP:MOV R6,#01H ;设置显示位寄存器初值(右边一位) MOV TMOD,#01H ;定时器T0设置为定时方式的模式1 MOV R5,#0AH ;定时操作循环10次 DEL1:MOV TH0,#3CH ;定时100ms计数器的初始值 MOV TL0,#0B0H SETB TR0 ;启动定时器
DEL2:DEC 50H ;显示秒数减1 MOV A,50H MOV B,#0AH DIV AB ;拆分秒数 ADD A,#2BH MOVC A,@A+PC ;查表个位数的字形码 MOV R1,A ;个位数字形码送R1 MOV A,B ADD A,#25H MOVC A,@A+PC ;查表十位数的字形码 MOV R2,A ;十位数字形码送R2 MOV A,R6 ;位控码 MOV DPTR,#7F03H MOVX @DPTR,A MOV A,R1 ;送个位数显示
MOV DPTR,#7F01H MOVX @DPTR,A LCALL DELAY ;延时1ms MOV A,R6 RL A ;位控左移 MOV R6,A MOV DPTR,#7F03H MOVX @DPTR,A MOV A,R2 ;送十位数显示 MOV DPTR,#7F01H MOVX @DPTR,A LCALL DELAY ;延时1ms JNB TF0,$ ;检测100ms定时是否到 CLR TF0 DJNZ R5,DEL1 ;100ms的循环控制
RET ;返回 TABLE:DB C0H,F9H,A4H,B0H,99H DB 92H,82H,F8H,80H,90H 延时1ms的子程序: DELAY:MOV R7,#02H DEL1:MOV R6,#0F9H DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET END
(6)任务实现概述 本设计是在前续工作任务基础上的综合设计。其中应用了显示器(LED)控制的基本知识,显示器显示原理要从了解显示器基本结构开始。
1. LED显示器及其接口 显示器结构及分类 (a)符号与引脚 (b)共阴极连接 (c)共阳极连接
1. 单片机LED显示器接口 七段发光二极管各代码位的对应关系
1. 单片机LED显示器接口 七段字形代码
1. 单片机LED显示器接口 例1:显示数字“0”的字形码的确定方法。 共阳极接法中,要点亮的位为低电平,不点亮的位为高电平。 数字“0”的字形码为:C0H 共阴极接法中,要点亮的位为高电平,不点亮的位为低电平。 数字“0”的字形码为:3FH
1. 单片机LED显示器接口 静态显示器接口 位控端 段控端 LED显示器工作在静态方式时,共阴极或共阳极的公共端(位选线)连接在一起接地或接+5V,形成位控端; 每一位的段选线(a~dP)应与具有锁存功能的8位并行输出口相连,形成段控端。
1. 单片机LED显示器接口 动态显示器接口 段控:把所有显示器的同名段选线相互并接在一起,由同一个8位并行输出口控制 位控:各显示器的位选线则分别由不同输出口线控制
例2:LED显示器连接原理图如上页图,向显示缓冲区50H~56H输入要显示的数据1、2、3、4、5、6,使程序运行后显示“123456”。例2:LED显示器连接原理图如上页图,向显示缓冲区50H~56H输入要显示的数据1、2、3、4、5、6,使程序运行后显示“123456”。 源程序: ORG 2000H MOV DPTR,#7F00H ;8155的初始化 MOV A,#0DH ;设置8155控制字 MOVX @DPTR,A LOOP: LCALL DISP SJMP LOOP
DISP:MOV R1,#50H ;置显示缓冲区首地址, 由R1指向 MOV R2,#20H ;置位码寄存器R2 初值(左边第一位) DISP0:MOV A,R2 ;位码初值 MOV DPTR,#7F03H ;位控地址 MOVX @DPTR,A ;输出位码 MOV DPTR,#7F01H ;段控地址 MOV A,@R1 ;取欲显示数据 ADD A,#0DH ;加数据表首址偏移量
MOVC A,@A+PC ;查表取字型码 MOVX @DPTR,A ;输出字型码 ACALL DELAY ;延时1ms INC R1 ;修改指针 MOV A,R2 ;取位码 JB ACC.0,EXIT ;判断最低位 RR A ;不到,位码右移 MOV R2,A ;保存位码 AJMP DISP0 ;循环显示下一位 EXIT: RET DSEG: DB C0H,F9H,A4H,B0H,99H ;字形表 ;(0~F,P,U,R,Y)
DB 92H,82H,F8H,80H,90H DB 88H,83H,C6H,A1H,86H DB 8EH,8CH,C1H,CEH,91H ORG 1100H DELAY: MOV R7,#02H ;延时1ms子程序 DEL1: MOV R6,#0F9H DEL2: DJNZ R6,DEL2 DJNZ R7,DEL1 RET END
任务二 交通信号灯的按键控制与实现 (1) 任务要求 在定时交通信号灯控制的基础上,增加允许急救车优先通过的要求。当有急救车到达时,路口的信号灯全部变红,以便让急救车通过。 假定急救车通过时间为10s,急救车过后,交通灯恢复先前状态。
(2) 实现方法 设定以按键K代表有急救车到来,并以中断方式进行处理。在P3.2连接按键K。当按键K按下,表示急救车到来,此信号申请中断,各路口的状态均为红灯,显示时间为10s。
(3)任务目的 1)交通信号灯的控制原理; 2)掌握键盘控制方法及编程实现; 3)提高知识综合应用能力。
ORG 0003H ;外部中断0的入口地址 LJMP INTER0 MAIN:SETB EA ;开中断 SETB EX0 .... 中断服务程序: INTER0:PUSH 50H ;保护现场 PUSH P1 MOV P1,#36H ;两线都禁止 MOV R7,#0AH ;延时10s INT0:LCALL DISP ;调显示 DJNZ R7,INT0 POP P1 ;恢复现场 POP 50H RETI ;中断返回 (4)源程序设计
+5V 单片机 S P3.0 1. 键盘及接口 键盘的类型 触点式开关按键,如:机械开关式等 当按键S未被按下时,P3.0输入为高电平 当按键S按下时,P3.0输入为低电平 无触点开关按键,如:磁感应按键等
键输入原理:按键以开关状态设置功能或输入数据。键输入原理:按键以开关状态设置功能或输入数据。 当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设的功能。
由于机械开关触点的弹性作用,按键在闭合和断开的瞬间均伴随有一连串的抖动。由于机械开关触点的弹性作用,按键在闭合和断开的瞬间均伴随有一连串的抖动。 !为了保证键识别的准确性,需要进行去抖动处理 键抖动 去抖动电路
键盘的结构 独立式按键 独立式按键是直接用I/O口线构成的单个按键电路
例3. 如下图所示,P1口连接8位LED,P3.0连接按键K。当按键K按下时,8位LED被点亮。
源程序: ORG 1000H SETB P3.0 ;先置按键为断开状态, 即高电平(1) MOV C,P3.0 ;将P3.0的1状态送CY位 CPL C ;取反,使CY清零 ORL C,P3.0 ;判断是否有键按下 LP: JNB C ,LED0 ;当CY=0,键被按下 JMP LP ;无键按下,继续检测 LED0: MOV P1,#00H ;键被按下,点亮8位LED SJMP $ END
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 +5V 单片机 矩阵式按键 在键位数较多时,通常将键盘排列成行列矩阵形式来减少所占用I/O线的数目
判别有无键按下 • 扫描获取闭合键的行、列值 • 用计算法或查表法得到键值 • 判断闭合键释放否,如没释放则继续等待 • 保存闭合键号 键盘扫描子程序一般包括以下内容:
··· 00H 01H 02H 06H 07H ··· 08H 09H 0AH 0EH 0FH ··· 10H 12H 16H 17H 11H ··· 18H 19H 1AH 1EH 1FH 例4:4×8键盘编码方式 键号按从左到右、从下到下的顺序编排,各行的首键号依次是00H、08H、10H、18H;如列线按0~7的顺序,则键码的计算公式为: 键码=行首键号+列号
开始 Y 有键按下吗? N 调延时 调延时 N 有键按下吗? Y 行扫描 计算键码 N 按键释放吗? Y 键码送A 返回 程序流程图
源程序: KEY1:MOV A,#01H ;8155初始化, PA口输出、PC口输入 MOV DPTR,#7F00H MOVX @DPTR,A ACALL KS1;调用判断有无键闭合的子程序 JNZ LK1 ACALL DELAY ;延时 AJMP KEY1
LK1: ACALL DELAY ; ACALL KS1 ;再判断有无键被按下 JNZ LK2 ;有键按下,转LK2 ACALL DELAY ;延时 AJMP KEY1 LK2: MOV R2, #0FEH ;扫描初值送R2 MOV R4,#00H ;扫描列号送R4
LK4:MOV DPTR,#7F01H ;建立PA口地址 MOV A,R2 MOVX @DPTR,A ;扫描初始值送PA口 INC DPTR INC DPTR ;指向PC口 MOVX A,@DPTR ;读PC口的状态 JB ACC.0,LONE ;ACC .0=1,第0行无键被按下, 转LONE MOV A,#00H ;装0行行首键号 AJMP LKP
LONE: JB ACC.1,LTWO ;ACC.1=1,第一行无键 被按下,转LTWO MOV A,#08H ;装第一行的行首键号 AJMP LKP LTWO: JB ACC.2,LTHR ;ACC.2=1,第二行无键 被按下,转LTHR MOV A,#10H ;装第二行的行首键号 AJMP LKP
LTHR: JB ACC.3,NEXT ;ACC.3=1,第三行无键 被按下,转NEXT MOV A,#18H ;装第三行的行首键号 LKP: ADD A,R4 ;计算键码 PUSH ACC ;保护键码 LK3: ACALL DELAY ;延时 ACALL KS1 ;测试键是否仍被按下, 若被按下再延时 JNZ LK3 POP ACC RET
NEXT: INC R4 ;扫描列号加1(扫描下一列) MOV A,R2 JNB ACC.7 KND ;第七位为0,则扫描完, 转KND RL A ;循环右移一位 MOV R2,A AJMP LK4 ;进行下一列扫描 KND: AJMP KEY1 ;扫描完毕,开始新的一次扫描
KS1: MOV DPTR,#7F01 MOV A,#00H MOVX @DPTR,A ;PA口送0——扫描口 INC DPTR INC DPTR ;指向PC口 MOVX A,@DPTR ;读PC口状态 CPL A ANL A,#0FH ;屏蔽高位 RET
DELAY: MOV R7,#14H ;延时10ms的子程序: DEL1 : MOV R6,#0F9H DEL2 : DJNZ R6,DEL2 DJNZ R7,DEL1 RET END
例5: 8051单片机的P1口连接8位LED,当按键第0行第0列键被按下时,8位LED被点亮。 ORG 1000H MAIN: MOV A,#0BH ;8155初始化 MOV DPTR,#7F00H MOVX @DPTR,A ACALL KS1 ;判定是否有键按下 JNZ LK1 ;有键按下,转延时 ACALL DELAY AJMP MAIN
LK1: ACALL DELAY ACALL KS1 ;延时之后再判定是否 有键按下(去抖) JNZ LK2 ;有键按下,确定键码 ACALL DELAY AJMP MAIN LK2: MOV R2,#0FEH ;定义0行0列键 MOV R4,#00H MOV DPTR,#7F01H ;建立PA口地址 MOV A,R2 MOVX @DPTR,A ;扫描初始值送PA口 INC DPTR
INC DPTR ;指向PC口 MOVX A,@DPTR ;读PC口的状态 JB ACC.0,LONE ;ACC .0=1,第0行无键被按下, 转LONE MOV A,#00H ;装0行行首键号 ADD A,R4 PUSH ACC LK3: ACALL DELAY ACALL KS1 JNZ LK3 POP ACC
LED0:MOV P1,#00H ;键被按下,点亮8位LED SJMP $ KS1: MOV DPTR,#7F01H MOV A,#00H MOVX @DPTR,A INC DPTR INC DPTR ;指向PC口 MOVX A,@DPTR ;读PC口状态 CPL A ANL A,#0FH RET
DELAY: MOV R7,#14H ;延时10ms的子程序: DEL1: MOV R6,#0F9H DEL2: DJNZ R6,DEL2 DJNZ R7,DEL1 RET END