单片机交通灯实习报告 - 图文 下载本文

2.3硬件连接

图2-2 交通灯硬件连线图

第三章 软件设计

3.1程序流程图 开始

调用

状态0

调用 状态1 状态2 调用 状态3 调用 控制数码动态输出 调用 外部中断

图2-3 交通灯程序设计流程图

- 11 -

3.2主程序设计

主程序为四种状态的循环,用R7控制每种状态的显示时间,用PC口输出二极管,定义各个变量的意义,对相关变量赋值,同时进行子程序的调用来显示数码管。 dongge data 40H;东西方向数码管显示个位

dongshi data 41H;东西方向数码管显示十位 nange data 42H;南北方向数码管显示个位 nanshi data 43H;南北 方向数码管显示十位 deng data 44H;方向灯的数据 CX DATA 45H

PA_8255 EQU 0FFFCH PB_8255 EQU 0FFFDH PC_8255 EQU 0FFFEH CON_8255 EQU 0FFFFH ORG 0000H AJMP MAIN ORG 0013H AJMP INT_1 ORG 0025H MAIN: SETB EA SETB EX1 CLR IT1

MOV SP,#60H

MOV DPTR,#CON_8255 MOV A,#80H MOVX @DPTR,A MOV dongshi,#2 MOV dongge,#0 MOV nanshi,#2 MOV nange,#5

MOV R7,#20;控制状态转换 zhuangtai0:MOV deng,#0F6H;状态0 MOV A,deng

MOV DPTR,#PC_8255 MOVX @DPTR,A LCALL jianyi

LCALL shumashuchu DJNZ R7,zhuangtai0 MOV dongshi,#0 MOV dongge,#5 MOV nanshi,#0 MOV nange,#5 MOV R7,#5

zhuangtai1:MOV deng,#0F5H;状态1 MOV A,deng

MOV DPTR,#PC_8255 MOVX @DPTR,A LCALL jianyi

LCALL shumashuchu

- 12 -

DJNZ R7,zhuangtai1 MOV dongshi,#2 MOV dongge,#5

MOV nanshi,#2

MOV nange,#0 MOV R7,#20

zhuangtai2:MOV deng,#0EBH;状态2 MOV A,deng

MOV DPTR,#PC_8255 MOVX @DPTR,A LCALL jianyi

LCALL shumashuchu DJNZ R7,zhuangtai2 MOV dongshi,#0 MOV dongge,#5 MOV nanshi,#0 MOV nange,#5 MOV R7,#5

zhuangtai3:MOV deng,#0DBH;状态3 MOV A,deng

MOV DPTR,#PC_8255 MOVX @DPTR,A LCALL jianyi

LCALL shumashuchu DJNZ R7,zhuangtai3 LJMP MAIN

3.3子程序的设计

1.减一程序

主程序设置好了各个变量的数值,各个状态的转换,下面到子程序是实现对数码管的显示和倒计时。

首把东西南北四个数码管的显示数据放到50H开始的地址里,然后对东西和南北的组合数据进行减1操作,这样每次调用即把数据存起来以便数码输出,又实现每调用一次就减一的操作,实现倒计时,此功能程序命名jianyi,如下所示:

jianyi:MOV A,dongshi MOV 50H,A MOV A,dongge MOV 51H,A JNZ donggewei MOV dongge,#0AH MOV A,dongshi DEC A

MOV dongshi,A donggewei: DEC dongge MOV A,nanshi MOV 52H,A MOV A,nange MOV 53H,A JNZ nangewei MOV nange,#0AH

- 13 -

MOV A,nanshi DEC A

MOV nanshi,A nangewei:DEC nange MOV R2,#4

MOV R0,#50H;转换成数码管所对应的数字字表 zhuanhuan:MOV DPTR,#TABLE1 MOV A,@R0

MOVC A,@A+DPTR MOV @R0,A INC R0

DJNZ R2,zhuanhuan RET

2.对数码管输出程序

前面减一操作已经把未减前的数据放到了50H开始的地址里了,现在就是要把他们取出来输出,由于是动态输出,所以用A口和B口来配合控制,A口对数码管送数据,B口来控制位选,同时加上延时,就可以搞定了。程序如下:

shumashuchu: MOV R4,#60;R4用来控制1s输出 shuma: CLR A

MOV R2,#4 MOV A,#0FEH MOV R0,#50H

Xunhuan :MOV DPTR,#PB_8255 MOVX @DPTR,A RL A

MOV R1,A MOV A,@R0

MOV DPTR,#PA_8255 MOVX @DPTR,A INC R0 MOV A,R1 MOV R6,#10

yanzi:MOV R3,#100;延时16ms LOOP:NOP NOP NOP DJNZ R3,LOOP DJNZ R6,yanzi

DJNZ R2,xunhuan DJNZ R4,shuma RET

3.中断程序

采用外部1中断,因为用到子程序,而主程序也要用到,所以对子程序的变量压栈 其他思想和主程序想同。

- 14 -