导读:用计算机连接“单片机综合仿真实验仪”来看内部存储器的值判断输入的温度值。 就看TEMPER_L、TEMPER_H、TEMPER_NUM这三个字节的值。 看来你都不会用仿真功能。 不是VIEW,而是debug。首先,你用的是“仿真实验仪”,先
用计算机连接“单片机综合仿真实验仪”来看内部存储器的值判断输入的温度值。
就看TEMPER_L、TEMPER_H、TEMPER_NUM这三个字节的值。
看来你都不会用仿真功能。
不是VIEW,而是debug。首先,你用的是“仿真实验仪”,先理解了什么叫仿真再说。
单片机在上电运行的时候,程序执行很快的,在晶振在12m的情况下,执行一条指令也就两三微秒的时间。程序刚编写出来的时候,百分之六七十会有逻辑错误(注意编译器只能检查程序的语法问题)或者程序不符合实际的部分需要。所以要用debug(调试)功能。简单的说就是用计算机控制单片机程序一步一步的执行,或者执行到某个地方看数据的值。程序写完了编译好了就点debug下拉菜单的之一个选线,之后这个菜单的下面有会亮的的选项中有四个是调试常用的“RUN、STEP、STEP OVER。STOP RUNING”,如果选RUN,就是计算机通知仿真仪正常执行程序,这时程序执行得很快,啥也看不到,点STEP就是点一下鼠标,计算机就通知仿真仪执行一条程序。STEP OVER跟前一个功能差不多,区别在于STEP是不管主程序还是子程序每条指令都执行,STEP OVER只执行主程序里的指令,遇到主程序调用子程序的时候,子程序只是一步执行过去。STOP RUNING就是停止RUN。
你可以用STEP或者STEP OVER一步一步执行到接收温度值的那部分程序,然后看左边Project Workspace会给显示那三个字节的信息的。
这跟微机原理里的DEBUG调试差不多的。
这就叫做单片机的仿真。
查书吧 具体的 我就能给你说一下之一道题的做法
以之一片为例
看138的真值表 y0 输出为0 假设CBA分别为001 那么地址就是
001 0000 0000 0000------001 1111 1111 1111
其他片类似
至于其他的程序啥的 找找书上类似的吧
DS18B20温度传感器、LCD1602液晶显示的代码
;XRF多功能51单片机开发板
;DS18B20测温程序(液晶显示,可测量0-99度)
;
;
TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区
TEMPER_H EQU 35H ;
TEMPER_NUM EQU 60H;温度值存储
TEMPER_GE EQU 61H
TEMPER_SHI EQU 62H
TEMPER_SAVE EQU 63H
FLAG1 BIT 00H
FLAG2 BIT 01H
RS BIT p20;液晶控制接口
RW BIT p21
E BIT p22
DQ BIT p35;单总线口
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#70H
LCALL GET_TEMPER
LCALL TEMPER_COV
LCALL LCDDISP
lcall d100ms
lcall d100ms
LJMP MAIN
NOP
;
;读出转换后的温度值
;
GET_TEMPER:
SETB DQ ; 定时入口
BCD: LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回
S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC命令
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL D100MS
CBA:LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC:LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;
;读DS18B20的程序,从DS18B20中读出一个字节的数据
;
READ_1820:
MOV R2,#8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;
;写DS18B20的程序
;
WRITE_1820:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;;
;将从DS18B20中读出的温度数据进行转换
;;
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A ;得到低四位
MOV A,TEMPER_L
JNB ACC3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM ;得到高四位,再与低四位相或得到值
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
;;
;将16进制的温度数据转换成压缩BCD码
;;
BIN_BCD:
MOV A,TEMPER_NUM
MOV B,#10
DIV AB
MOV TEMPER_SHI,A
MOV TEMPER_GE,B
RET
;
;DS18B20初始化程序
;;
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#250
TSR1:
DJNZ R0,TSR1 ; 延时520us
SETB DQ
MOV R0,#25H ;96US-25H
TSR2:
DJNZ R0,TSR2
JNB DQ,TSR3;如D0为低则复位成功,DS18B20存在
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH ;200US
TSR6:
DJNZ R0,TSR6 ; 延时
TSR7:
SETB DQ ;拉高总线
RET
;
;数码显示程序
;
;
;液晶显示程序
;
LCDDISP:
mov p1,#01h;清屏
call enrw
mov p1,#38h;设为8位,5*7字 型两行
call enrw
mov p1,#0Ch
call enrw
mov p1,#06h
call enrw
mov p1,#80h
call enrw
mov dptr,#yjtab
call rwram
mov p1,#0C0h
call enrw
mov dptr,#yjtab1
call rwram
W_TEM:
mov p1,#0CCh
call enrw
MOV DPTR,#ASCII
MOV A,TEMPER_SHI
MOVC A,@A+DPTR
MOV P1,A
setb rs
clr rw
clr e
call D500us
setb e
MOV DPTR,#ASCII
MOV A,TEMPER_GE
MOVC A,@A+DPTR
MOV P1,A
setb rs
clr rw
clr e
call D500us
setb e
RET
enrw:clr rs
clr rw
clr e
call D500us
setb e
ret
rwram:mov r1,#00h
a1: mov a,r1
movc a,@a+dptr
call rwram2
inc r1
cjne a,#00h,a1
ret
rwram2:mov p1,a
setb rs
clr rw
clr e
call D500us
setb e
ret
;R
;延时子程序
;
D500us:
MOV R6,#250;延时500us
DJNZ R6,$
RET
DELAY1:MOV R7,#20H
DJNZ R7,$
RET
D100MS: MOV R6,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R6,D2
RET
yjtab: db ' XRF MCS-51 ',00h
yjtab1:db 'temperature:`C',00h
ASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
end