基于I/O 8LED 温度显示 设计

来源:百度知道 编辑:UC知道 时间:2024/06/03 17:14:16
这是实验作业 现在忙考研没时间做 这是我在网上找的 不知道是不是 帮忙给我看看啊 谢谢了诶!!

这个LED显示部分由于74ls164接在了RXD端,也就是要用串行口来发送温度数据到LED.
所以在主程序中要 开串行口中断允许,以下是串行口中断子程序,并假设要 显示的温度已经存到了某个存储器中。。这里 假设温度已经存到了TEM1中,其中TEM1里存的是温度的整数位,TEM0里 存的是温度的小数位。
TRANS:CLR TI ;清中断标志
PUSH A
PUSH PSW
MOV A,TEM1 ;以下程序判断温度时不时在40~90之间,若不在直接退出,否则显示温度
CJNE A,#40,NEXT ;将温度先和40比较
NEXT:JC RETURN ; 小于40直接退出
CJNE A,#90,NEXT1 ;大于40就和90比较
JNC RETURN ;大于90直接退出
CJNE R0,#0,LL1 ;R0是标志位,R0=0,发送小数位。R0=1,发送温度的个位。R0=2,发送温度的十位
MOV DPTR,#TAB ;R0=0,发小数部分
MOV A, TEM0 ;找小数部分的笔段码
MOVC A,@A+DPTR
MOV SBUF,A ;发送
INC R0 ;标志加1
JMP RETURN ;返回
LL1:
MOV A,TEM1 ;下5行为分开整数部分的十位和个位
MOV B,#10 ;十位存在R1中
DIV AB ;个位存在R2中
MOV R1,A
MOV R2,B
CJNE R0,#1,LL2 ;标志位为1发送整数的个位,个位已经

试试看:

TEM0 equ 30H
TEM1 equ 31H

org 0000h

;虚拟的主程序
mov TEM0, #8
mov TEM1, #2 ;假设已经测得温度是24度
LCALL TRANS ;输出显示
SJMP $

;这个LED显示部分由74ls164接在了RXD端,要用串行口来发送温度数据到LED.
;假设温度(两位数字)已经预先存到了TEM1和TEM0里, 其中TEM0是个位,
;查出它们的七段码, 在串行口输出即可

TRANS:
PUSH ACC ;保护现场
PUSH DPL
PUSH DPH

MOV DPTR, #TAB ;七段码首地址
MOV A, TEM1 ;取十位
MOVC A, @A+DPTR ;查出笔段码
MOV SBUF, A ;串行输出
JNB TI, $ ;TI=0, 就是没有发送完, 原地转移等待
CLR TI ;清标志

MOV A, TEM0 ;取个位
MOVC A, @A+DPTR ;查出笔段码
MOV SBUF, A ;串行输出
JNB TI, $ ;TI=0, 就是没有发送完, 原地转移等待
CLR TI ;清标志

POP DPH ;恢复现场
POP DPL
POP ACC
RET ;两个字节发送完毕,返回主程序
TAB:
D