交通灯控制系统软件源程序文本概要.docx
- 文档编号:5653545
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:22
- 大小:24.23KB
交通灯控制系统软件源程序文本概要.docx
《交通灯控制系统软件源程序文本概要.docx》由会员分享,可在线阅读,更多相关《交通灯控制系统软件源程序文本概要.docx(22页珍藏版)》请在冰豆网上搜索。
交通灯控制系统软件源程序文本概要
;▲设计思路:
硬件设计原理见原理图,设计思路略;系统软件设计思路如下。
;分三个独立模块,主程序依次循环调用三个模块(显示模块、时间计算模块、键盘扫描与时间设置模块),
;使用两个中断(内部定时器T0中断、外部中断INT1),在主程序循环调用三个模块的进程中嵌套调用各中断服务程序。
;各模块之间通过相应的控制变量来建立联系,并确定分支运行的路径,控制变量全部由地址传值;
;模块之间传递的数据(特别是显示的数据:
如计算结果、键盘修改或设置时间显示数据等,变化后的数据存入51H~54H、
;76H~79H和7CH~7FH字节单元,显示只从这些单元中取数据)由同一个地址传值。
;定时0.05s,(216-X)*10-6=0.05,X=15536(3CB0H),加上执行中断服务程序花去的平均时间约222个时钟周期(相当于定
;时脉冲19个)。
因此,定时计数器的计数初值为15536+19=15555(3CC3H)。
;#程序开始段,主程序和中断服务程序地址初始化
RESET:
ORG0000H;系统复位后,程序开始执行地址(主程序起始地址)
LJMPMAIN
ORG000BH;T0中断服务程序地址
LJMPT00
ORG0013H;INT1中断服务程序地址
LJMPINT11
;#主程序段
ORG100H
MAIN:
MOVPSW,#00H;程序状态字清0,默认工作寄存器区0,此步可以不作(系统复位后自动清0)
MOVR1,#7EH;内部RAM单元个数,不含0区的R0和R1以及SFR
MOVR0,#02H;从0区的R3开始清0
CLRAM:
INCR0;清零内部RAM
MOV@R0,#00H
DJNZR1,CLRAM
MOVSP,#10H;工作寄存器区0和1区会使用,堆栈从2区开始
MOVTMOD,#01H;定时器T0初始化,定时模式,不受外部INT0
(1)控制,计数器设置为方式1,16位计数器
MOVTL0,#0C3H;定时器/计数器低8位值,时钟频率12MHz
MOVTH0,#3CH;计数器高8位值
MOVSCON,#00H;串行口控制寄存器设置。
工作于方式0(移位寄存器方式),禁止接收数据,中断清0
MOV7FH,#0D0H;时钟显示初始值:
12:
00,7FH字节单元存放LED1值0(分钟个位),P1(11010000,段选码和控制位选)
MOV7EH,#0E0H;7EH字节单元存放LED2值0(分钟“十位”),P1(11100000,段选码和控制位选)
MOV7DH,#0C2H;7DH字节单元存放LED3值2(小时“个位”),P1(11000010,段选码和控制位选)
MOV7CH,#0C1H;7CH字节单元存放LED4值1(小时“十位”),P1(11000001,段选码和控制位选)
MOV50H,#00H;50H存放时钟模式和交通灯模式下的秒钟数值
MOV7BH,#02H;7BH字节单元存放时钟模式LED3控制位选参数,RXD(00000010,交通灯不亮)
MOV7AH,#01H;7AH字节单元存放时钟模式LED4控制位选参数,RXD(00000001,交通灯不亮)
MOV79H,#0C6H;79H存放第1组交通灯(绿1,红2)时间LED4显示位6,P1(11000110,段选码),值变化
MOV78H,#0C0H;78H存放第1组交通灯(绿1,红2)时间LED3显示位0,P1(11000000,段选码),值变化
MOV77H,#0E6H;77H存放第2组交通灯(绿2,红1)时间LED2显示位6,P1(11100110,段选码和控制码),值变化
MOV76H,#0D0H;76H存放第2组交通灯(绿2,红1)时间LED1显示位0,P1(11010000,段选码和控制码),值变花
MOV75H,#32H;75H存放第1组交通灯点亮(绿1,红2),LED3显示控制参数,RXD(00110010,控制位选)
MOV74H,#31H;74H存放第1组交通灯点亮(绿1,红2),LED4显示控制参数,RXD(00110001,控制位选)
MOV73H,#05H;第1组交通灯绿变红
(2)时“黄1”闪(4),红绿灯息,LED4显示,RXD(00000101),下画线位变
MOV72H,#06H;第1组交通灯绿变红
(2)时“黄1”闪(4),红绿灯息,LED3显示,RXD(00000110),下画线位变
MOV51H,78H;第1组交通灯时间显示中“个位”(LED3)初值,不变化
MOV52H,79H;第1组交通灯时间显示中“十位”(LED4)初值,不变化
MOV53H,76H;第2组交通灯时间显示中“个位”(LED1)初值,不变化
MOV54H,77H;第2组交通灯时间显示中“十位”(LED2)初值,不变化
MOV71H,#8AH;71H存放第2组交通灯点亮(绿2,红1),RXD(LED3:
10001010,8AH,LED4:
10001001,89H)
MOV70H,#42H;第2组交通灯绿变红
(2)时"黄2"闪(4),红绿灯息,RXD(LED3:
01000010)下画线位变
MOV60H,#41H;第2组交通灯绿变红
(2)时"黄2"闪(4),红绿灯息,RXD(LED4:
01000001),下画线位变
MOV6FH,#00H;记录定时器中断的次数,每次读取后清0,初值为0,每增加1即增加0.5秒
MOV6EH,#00H;记录定时器中断的次数,控制交通灯“黄”灯闪烁
CLR0AH;K2键,控制系统工作模式:
0AH=0(工作于时钟模式,默认),0AH=1(工作于交通灯控制模式)
CLR0BH;哪组交通灯显示控制参数:
0BH=0(第1组交通灯显示),0BH=1(第2组交通灯显示)
CLR0CH;交通灯“黄”灯是否“闪”:
0CH=0(不闪),0CH=1(闪)
CLR0DH;检验定时器是否中断,0DH=1(中断),0DH=0(无中断),每次取走定时器中断次数后清0
CLR0EH;交通灯时间计算中间控制变量
CLR0FH;时间设置中间控制变量,与回车控制量12H共同起回车的控制作用
CLR10H;方向键K4,控制参量:
10H=0(显示数据减小1/按一次数据键),10H=1(数据增大)
CLR11H;K4键,时间设置模式/正常工作模式切换,11H=0(正常工作模式),11H=1(时间设置模式)
CLR12H;K2键,作为时间某一位设置结束(回车)控制,12H=1(回车标志)与11H同时使用
CLR13H;第1,2组交通灯设置位控制,13H=0(第1位),13H=1(第2位)
CLR14H;时钟时间设置位控制,14H=0(小时十位),14H=1(小时个位)
CLR15H;时钟时间设置位控制,15H=0(分钟十位),15H=1(分钟个位)
CLR16H;时钟时间设置位控制,16H=0(设置小时),16H=1(设置分钟)
CLR17H;4位时间设置结束标志位,17H=1,表示设置四位时间结束
MOVR2,#00H;R2用于暂存交通灯时间的个位数据,中间变量
MOVR3,#01H;R3用于存放显示控制参数,R3=1(显示),R3=0(不显示)
MOVR4,#00H;R4用于存放计算时间的暂存器
MOVR5,#00H;R5用于暂存交通灯时间的十位数据,中间变量
MOVR6,#00H;R6用于暂存交通灯时间设置过程中变化的数据,中间变量
MOVR7,#00H;定时中断用中间变量
MOVA,#00H;清A
MOVSBUF,A;数据发送缓冲器清0
SETBEA;EA=1,CPU开放中断
SETBET0;ET0=1,允许定时器/计数器溢出中断
SETBEX1;EX1=1,允许外部中断1中断
SETBP3.2;清“:
”闪烁
SETBTR0;TR0=1,允许T0计数
PROC0:
LCALLKEYS;键盘扫描子程序
LCALLTIME;时间计算子程序
LCALLDISP;显示子程序
AJMPPROC0
;#键盘扫描与时间设置模块
;4个键主要完成:
①功能转换,②时间设置,③系统复位(不需要软件干预)
;K1—系统复位键(RESET);
;K2—①时钟模式/交通灯模式切换,在非设置情况下有效;②时间设置过程中作为某位时间设置的结束标志(*INT1,回车);
;K3—调整显示数据按键(P1.6);
;K4—①正常工作时作为进入时间设置模式的按键,②设置过程中作为数据调整方向键(P1.7);
;设置顺序从高位到低位,从小时到分钟;交通灯从第1组到第2组分别设置;只有进入设置模式,K3、K4键才有效;
;下段程序为进入时间设置模式、改变数据变化方向
KEYS:
JNBP1.7,KEYS0;P1.7=0(按了K4键),转移,判断工作模式或数据方向;否则(没按K4键),操作如下
LJMPKEYS000;没按K4键,转移到判断是否“已是时间设置模式(11H=1)”
KEYS0:
LCALLDELAY;延时,消除抖动
JNBP1.7,KEYS02;P1.7=0(确是按了K4键),转移,判断工作模式或数据方向;否则(没按K4键),操作如下
KEYS000:
JB11H,KEYS1;没按K4键,是“已是时间设置模式(11H=1)”,转移;否则,不作任何操作(如下)
LJMPKEYSO;不作任何操作
KEYS02:
JBP1.7,KEYS03
LCALLDELAY
AJMPKEYS02
KEYS03:
SETBP3.2;清“:
”闪烁
SETBP1.7;清出P1.7的键位
JB11H,KEYS00;11H=1,转移(调整数据方向);11H=0,置时间设置模式,操作如下
SETB11H;置时间设置模式
CLR0BH;从第1组交通灯第1位开始设置
LJMPKEYS1
KEYS00:
JB10H,KEYS01;调整数据变化方向,原方向控制参量为1,转移到清0;
SETB10H;原方向控制参量为0,置1
LJMPKEYS1
KEYS01:
CLR10H;原方向控制参量为1,则清0
;时间设置
KEYS1:
JNBP1.6,KEYS100;P1.6=0,有数值调整键(K3)输入,转移到KEYS100;否则,不进行任何操作
LJMPKEYSO;不进行任何操作
KEYS100:
LCALLDELAY;延时,消除抖动
JNBP1.6,KEYS10;P1.6=0(确是按了K3),转移(进行时间调整);否则,不进行任何操作(如下)
LJMPKEYSO
KEYS10:
JBP1.6,KEYS04
LCALLDELAY
AJMPKEYS10
KEYS04:
SETBP1.6;清出P1.6的键位
JB0AH,KEYSA;判断是哪种工作模式,0AH=1(交通灯,转移到KEYS1A),0AH=0(时钟,进行如下操作)
LJMPKEYSB;时钟时间设置开始
KEYSA:
LJMPKEYS1A;交通灯时间设置
KEYSB:
JB16H,KEYS20;小时/分钟判断,16H=1(分钟,转移),16H=0(小时设置,进行如下操作)
MOVPSW,#00H;小时设置,工作寄存器0区
JB14H,KEYS40;14H=1,转移,设置小时的个位;否则设置小时的十位(如下)
JB12H,KEYS40;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,进行设置位调整
MOVA,#00H;清A
MOVR6,#00H;清R6
MOVB,#00H;清B
MOVA,7CH;取出小时“十位”数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为十位显示数据
LCALLKSETBIT
MOV7CH,R6;回存小时“十位”数据
CLR12H;清“回车”控制位
LJMPKEYSO;返回
KEYS40:
SETB14H;置控制参量,使转移到设小时个位;
JNB0FH,KEYS41
CLR0FH
JB12H,KEYS20;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,进行设置位调整
KEYS41:
MOVA,#00H;清A
MOVR6,#00H;清R6
MOVB,#00H;清B
MOVA,7DH;取出小时“个位”数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为“个位”显示数据
LCALLKSETBIT
MOV7DH,R6;回存小时“个位”数据
CLR12H;清“回车”控制位
SETB0FH
LJMPKEYSO;返回
KEYS20:
SETB16H;分钟设置,置控制参量,使转移到设分钟;
MOVPSW,#00H;工作寄存器0区
JB15H,KEYS50;15H=1,转移,设置分钟的个位;否则设置分钟的十位(如下)
JNB0FH,KEYS51
CLR0FH
JB12H,KEYS50;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,进行设置位调整
KEYS51:
MOVA,#00H;清A
MOVR6,#00H;清R6
MOVB,#00H;清B
MOVA,7EH;取出分钟“十位”数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为分钟“十位”显示数据
LCALLKSETBIT
MOV7EH,R6;回存分钟“十位”数据
CLR12H;清“回车”控制位
SETB0FH
LJMPKEYSO;返回
KEYS50:
SETB15H;置控制参量,使转移到设置分钟“个位”
JNB0FH,KEYS54
CLR0FH
JB12H,KEYS55;12H=0,没有回车(不作设置位的调整操作如下);12H=1,有回车,进行设置位调整
KEYS54:
MOVA,#00H;清A
MOVR6,#00H;清R6
MOVB,#00H;清B
MOVA,7FH;取出分钟“个位”数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为分钟“个位”显示数据
LCALLKSETBIT
MOV7FH,R6;回存分钟“个位”数据
SETB0FH
SETB17H
CLR12H;清“回车”控制位
KEYS55:
LJMPKEYSO;返回
;时钟设置结束,交通灯设置开始
KEYS1A:
JB0BH,KEYS1B;哪组交通灯,0BH=1(2组,转移到KEYS1B),0BH=0(1组,进行如下操作)
MOVPSW,#00H;第1组交通灯设置,工作寄存器0区
JB13H,KEYS1C;13H=1,转移,设置第1组交通灯的第2位;否则设置第1组交通灯的第1位(如下)
JB12H,KEYS1C;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,进行设置位调整
MOVA,#00H;清A
MOVB,#00H;清B
MOVR6,#00H;清R6
MOVA,79H;第1组交通灯的第1位显示数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为第1位显示数据
LCALLKSETBIT;设置第1组交通灯的第1位(如下)
MOV79H,R6;回存第1位数据到显示存储单元
MOV52H,R6;回存第1位数据LED4
CLR12H;清回车控制
LJMPKEYSO;返回
KEYS1C:
SETB13H;置控制参量,使转移到设置交通灯的第2位;
JNB0FH,KEYS1D
CLR0FH
JB12H,KEYS1B;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,进行设置位调整
KEYS1D:
MOVA,#00H;清A
MOVB,#00H;清B
MOVR6,#00H;清R6
MOVA,78H;第1组交通灯的第2位显示数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为第2位显示数据
LCALLKSETBIT;设置第1组交通灯的第2位(如下)
MOV78H,R6;回存第2位数据到显示存储单元
MOV51H,R6;回存第2位数据LED3
CLR12H;清回车控制
SETB0FH
LJMPKEYSO;返回
KEYS1B:
SETB0BH;第2组交通灯设置,置控制参量,转移到第2组交通灯设置
MOVPSW,#00H;工作寄存器0区
JNB0FH,KEYS1B0
CLR0FH
JB13H,KEYS1E;13H=1,转移,设置第2组交通灯的第2位;否则设置第2组交通灯的第1位(如下)
JB12H,KEYS1E;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,进行设置位调整
KEYS1B0:
MOVA,#00H;清A
MOVB,#00H;清B
MOVR6,#00H;清R6
MOVA,77H;第2组交通灯的第1位显示数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为第1位显示数据
LCALLKSETBIT;设置第2组交通灯的第1位(如下)
MOV77H,R6;回存第1位数据到显示存储单元
MOV54H,R6;回存第1位数据LED2
CLR12H;清回车控制
CLR13H;清控制参量
SETB0FH
LJMPKEYSO;返回
KEYS1E:
SETB13H;置控制参量,使转移到设置交通灯的第2位
JNB0FH,KEYS1E0
JB12H,KEYSO;12H=0,没有回车(不作设置位的调整,操作如下);12H=1,有回车,结束
KEYS1E0:
MOVA,#00H;清A
MOVB,#00H;清B
MOVR6,#00H;清R6
MOVA,76H;第2组交通灯的第2位数据
MOVB,A;原始数据暂存于B
ANLA,#0FH;屏蔽掉高四位
MOVR6,A;R6为第2位显示数据
LCALLKSETBIT;设置第2组交通灯的第2位(如下)
MOV76H,R6;回存第2位数据到显示存储单元
MOV53H,R6;回存第2位数据LED1
CLR12H;清回车控制
SETB0FH
SETB17H;置设置结束标志
KEYSO:
SETBP1.6
SETBP1.7
RET;返回
;时间设置每位数据变化子程序,R6—入口(只是位显示数据)/出口(显示数据和控制位)
KSETBIT:
MOVPSW,#00H;工作寄存器0区
JB10H,KSETBTZ;判断数据变化的方向,10H=0(减小,如下),10H=1(增加,转移到KSETBTZ)
CJNER6,#00H,KSETBTY;是否为0,不为0(转移);为0,操作如下
MOVR6,#09H;如果为0,则置为9
AJMPKSETBTO
KSETBTY:
DECR6
AJMPKSETBTO
KSETBTZ:
CJNER6,#09H,KSETBTX;是否为9,不为9(转移,不作任何变化);为9,操作如下
MOVR6,#00H;如果为9,则置为0
AJMPKSETBTO
KSETBTX:
INCR6
KSETBTO:
MOVA,#00H;清A
MOVA,B;取出原始数据
ANLA,#0F0H;屏蔽低4位,保留高4位(即:
控制位和键位)
ORLA,R6;加入低4位
MOVR6,A;赋值给出口R6
RET;返回
;键盘扫描与时间设置模块结束
;#时间计算模块
TIME:
JNB11H,TIME1;检验工作模式,11H=0(正常工作模式,转移,计算时间),11H=1(时间设置,不作任何时间计算)
MOV50H,#00H;清秒钟数据0
LJMPTIMEO
;下面根据当前的显示模式,决定哪一存储单元改变数据,并进行时、分、秒之间的进位
TIME1:
JB0AH,TIME2;0AH=1转移到交通灯模式,0AH=0进行下面的时钟模式调整时间
MOVPSW,#00H;工作寄存器0区
MOVA,#00H;A清0
MOVR4,A;清R4
MOVA,50H;从50H中取出秒钟的当前数值
CJNEA,#60,TIME1O;当前秒钟是否到60秒,没到,不作任何操作,转移;相等,进位到分钟,操作如下
MOV50H,#00H;秒钟存储单元清0
INC7FH;分钟“个位”存储单元加1
MOVA,7FH;取出分钟个位存储单元数值
ANLA,#0FH;屏蔽控制位的值,保留分钟“个位”时间值进行操作(00001111)
CJNEA,#10,TIME1O;判断分钟“个位”是否到10分,没到,不作任何操作,转移;相等,进位到分钟的十位,操作如下
MOV7FH,#0D0H;分钟“个位”数据清0+LED1、LED2显示控制码及P1口键码初值(11010000)
INC7EH;分钟“十位”数据加1
MOVA,7EH;取出分钟十位存储单元数值
ANLA,#00FH;屏蔽控制位的值,保留分钟“十位”时间值进行操作(00001111)
CJNEA,#6,TIME1O;判断分钟“十位”是否到6,没到,不作任何操作,转移;相等,进位到小时的个位,操作如下
MOV7EH,#0E0H;分钟“十位”存储单元清0+LED1、LED2显示控制码及P1口键码初值(11100000)
INC7DH;小时“个位”数据加1
MOVA,7DH;取出小时“个位”数值
ANLA,#0FH;屏蔽控制位的值,保留小时“个位”值进行操作(00001111)
MOVR4,A;小时“个位”暂存于R4
MOVA,7CH;取出小时“十位”存储单元数值
ANLA,#0FH;屏蔽控制位的值,保留小时“十位”值进行操作(00001111)
CJNEA,#2,TIME1A;小时“十位”是否到2,没到,转移(判断“个位”是否到10);相等,操作如下(判断是否需要转天)
MOVA,R4;小时“个位”给A,便于比
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯 控制系统 软件 源程序 文本 概要