山东科技大学电工电子实验教学中心
创新性实验结题报告 实验项目名称 _基于Proteus的温度检测_ 组长姓名 娄猛__ 学号 _2*01417 手机 159*917 成员姓名 ____ 学号 _ _ 成员姓名 ____ 学号 _ _ 专 业 电子信息工程_ 班级 _ 09级 指导教师及职称 ____吕常智______ 开课学期 至_学年_1_学期 提交时间 年1月日
一、实验摘要
根据 DS18B20 的 1-wire 的通信原理,利用单片机汇编(或 C)语言实现一个温度测试并显示的电路,在 Proteus 平台上进行电路设计,并且载入单片机程序进行仿真验证。
|
二、实验目的
掌握虚拟仿真软件 Proteus 的应用,了解温度传感器 DS18B20 的 1-wire 的通信原理,学会采用 Proteus 虚拟仿真软件工具,利用单片机汇编(或 C)语言实现一个温度测试并显示的电路,并且在 Proteus 软件上仿真测试,进行验证,综合实验系统的使用方法,熟悉创新性实验报告的撰写方法。
|
三、实验场地及仪器、设备和材料:
实验场地: 院实验室318、424 仪器设备: 计算机一台 软件: Proteus软件 |
(1)DS18B20特点: DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制 功能将无法使用。主要首先提供以下功能命令之一: <1> 读ROM,<2>ROM匹配,<3>搜索ROM,<4>跳过ROM,<5>报警检查。这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。 若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。一个控制功能 指挥指示DS18B20的演出测温。测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。温度报警触发器 TH和TL都有一字节EEPROM 的数据。如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。在片上还载有配置字节以理想的解决温度数字转换。写TH,TL指令 以及配置字节利用一个记忆功能的指令完成。通过缓存器读寄存器。所有数据的读,写都是从最低位开始。
DS18B20部分命令设置: 命令 | | | | | 这条命令允许总线控制器不用提供 64 位ROM 编码就使用存储器操作命令,在单点总线情况下右以节省时间。如果总线上不止一个从机,在 Skip ROM命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突(漏极开路下拉效果相当于相与)。 | | | 这个命令向 DS1820 的暂存器中写入数据,开始位置在地址 2。接下来写入的两个字节将被存到暂存器中的地址位置 2 和3。可以在任何时刻发出复位命令来中止写入。 | | | 这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后 DS1820保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而 DS1820 又忙于做时间转换的话,DS1820 将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。 | | | 这个命令读取暂存器的内容。读取将从字节 0 开始,一直进行下去,直到第 9(字节 8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。 | | | 这条命令的流程图和 Search ROM 相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS1820才会响应这条命令。报警条件定义为温度高于TH或低于TL。只要 DS1820 不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。 |
DS18B20读写时序图: 说明: 主机要生成一个写时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15μs内允许数据线拉到高电平。 主机要生成一个写 0 时间隙,必须把数据线拉到低电平并保持 60μs。 初始化过程“复位和存在脉冲”: 说明: DS1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写0、写 1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。 和 DS1820 间的任何通讯都需要以初始化序列开始,一个复位脉冲跟着一个存在脉冲表明 DS1820 已经准备好发送和接收数据(适当的 ROM 命令和存储器操作命令)。
DS18B20温度值格式表: 说明: 这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面 5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FE6FH,-55℃的数字输出为FC90H 。 (2)数码显示: 采用数码管动态显示,通过位控线选择数码管,同时单片机通过查表送出段选送显示的段码,利用人的视觉暂留特点达到显示的目的。 (3)复位电路: 复位电路采用手动复位,实现单片机系统复位。 (4)震荡电路; 为单片机提供恒定可靠的震荡周期。 (5)驱动电路: 由于单片机的驱动能力有限,考虑到数码管的特点,实际应加上驱动电路,以提供合适的电流。 (6)测温开关 给单片机信号,给予其开始测温,关闭测温指示。 (7)Proteus 虚拟仿真 在keil中编写单片机程序,生成相应的.Hex文件,将文件复制到一个文件夹下,在Proteus里添加单片机并设置程序的路径,找到该文件,仿真时就会调用该程序文件。
| 2、实验内容 根据设计要求设计硬件电路,根据各项指标选择合适的原件,在Proteus原理图中画出原理图。本设计采用六个八段数码段动态显示,硬件电路主要有单片机,复位电路,数码显示,震荡电路,驱动电路,测温开关电路,传感器电路等组成。开机显示“HELLO”友好界面,测温控制开关开始关闭测温,当开关闭合时,处于测温状态,显示的温度值即为真实温度,开关打开时为关闭状态,数码管组显示“OFF”与最后一次测量值的交替显示,警示测温中断,开关再次合上时又进行正常测温。考虑到成本问题单片机选用AT89C52,该单片机为一8位单片机,详细介绍再次就不过多陈述,具体参数参考技术资料。单片机程序采用汇编语言,在Keil环境下编译。
| 3、实验步骤 (1)根据功能设计硬件电路 <1>数码管显示及其驱动电路: 本设计采用的是6位8段共阳数码管,如下图所示,ABCDEFG个DP分别是数码管的八个段,123456是对应的六个线选线,由于单片机的灌电流能力也不是很强,直接驱动几个数码管有点困难,因此加上了373锁存器,跟7407同向驱动芯片。373锁存p0(开漏输出)口输出的段选信号,P2口是线选信号输出口。P2口虽然内部有上拉电阻,但是由于7407是集电极开路六组驱动器,没有上拉不能输出高电平所以还要加上拉电阻。7407的驱动能力比较强,高电平时输出最大电流可达41mA,而输入高电平电流只需40uA即可,能够满足该六位数码管正常显示。
<2>振荡电路 该振荡电路外部由两个电容C1,C2跟晶振X1组成,如下图连接接地,并接到单片机的XTAL1跟XTAL2引脚上。由于51单片机内部有一个用于构成振荡器的可控高增益反向放大器,两个引脚XTAL1,XTAL2分别是该放大器的输入端跟输出端。按下图所示,就可构成一个自激振荡器,匹配电容根据晶振的要求选取,一般选用20~30pF瓷片电容即可。
<3>复位电路 下图是一个简单手动复位与上电复位的综合复位电路。R2,R3构成手动复位电路,R2一般取1~5KΩ。在实际电路中,当R3=200Ω,R2=800Ω时,按下按键实现可靠复位电压为4V.即Urst=U*R2/(R2+R3)。由于仿真软件的问题,当R2大于1K时,上电后RST引脚不能实现低电平,因此不能满足复位的条件,采用800Ω电阻时能够实现。但实际电路中R2取到1K才能实现可靠的上电复位。(相关公式:Urst=5*e^(-t/τ), τ=R2*C,当复位电压大于等于3V时是可靠复位电压。带入上式,t=τ*ln(5/3) ≈0.15τ,当R2=1KΩ,C=22uF时,t≈11.2ms.即复位时间约为11.2ms。为保证可靠复位,复位时间大于10ms即可。) <4>测温开关: 测温开关的实现时利用检验其是否存在的原理进而转换显示状态,故可以设置在DS18B20跟单片机相连的路径之间(接在P3.3引脚),开关断开,单片机就会检测不到传感器,转换到关闭测温状态,开关闭合,单片机又能检测到传感器,自动转到测温显示状态。由于DS1820 的单总线端口(I/O 引脚)是漏极开路式的,一个多点总线由一个单线总线和多个挂于其上的从机构成。在发出任何涉及拷贝到 E2存储器或启动温度转换的协议之后,必须在最多 10μs之内把 I/O 线转换到强上拉,因此单线总线需要一个约 5KΩ的上拉电阻。 实际电路如下图所示:
(2)设计单片机程序,画出流程图 通过单线总线端口访问 DS1820 的协议如下: • 初始化 • ROM 操作命令 • 存储器操作命令 • 执行/数据 程序组成: 主程序 子程序: HELLO与OFF开关显示、DS18B20初始化、重写DB18B20、读温度、温度数值转换等。
主程序流程图: HELLO与OFF开关显示流程图:
DS18B20初始化流程图: 重写DB18B20流程图:
读温度流程图: 温度数值转换流程图:
(3)编写程序 根据硬件电路编写程序,程序见实验结果部分的程序清单。 (4)仿真调试 在Keil编译环境下编译汇编程序,设置晶振12MHz,生成.Hex文件。打开用Proteus画好的原理图,双击单片机,设置震荡频率12MHz,与硬件电路相对应,浏览找到生成的该程序的.Hex文件作为其程序。设置完成,打开仿真按钮,进行仿真调试,打开闭合测温开关观察现象,调节DS18B20的温度调节部分调节温度,观察数码显示温度值。 |
五、实验结果与分析 1、实验现象、数据记录 当仿真开始时,显示开机界面“HELLO”: 测温时,当测试零下温度时显示零下温度值: 当测试零上温度时显示正的温度值: 当测温开关打开时,显示“OFF”与最后一次测温值交替显示界面:
2、对实验现象、数据及观察结果的分析与讨论: 开机时显示“HELLO”问候,采用200次动态扫描显示,显示完之后自动转到下面的初始化及测温程序,传感器存在时,进行正常测温,零上温度入上面图示,显示零上温度,无效位消隐,实现方法是每次遍历存储空间,将无效位的段选置空,有效的位用数据填充,小数点另加到倒数第二个数码管的小数点处。当测试零下温度时,数值转换要取反加1,还要在前面加负号,考虑到负数最多显示两位,故将负号固定在倒数第四位,省去了判断的麻烦。当测温开关断开时,由于检测不到DS18B20的存在,故程序转到显示“OFF”界面,由于要不断地检测存在位,所以要循环检测,循环显示,由于时序的原因,会使OFF与最后一次测温结果交替显示。开关闭合,又能检测到标志位,程序自动进入正常测温序列。 | 3、主要关键和创新点: 在Proteus仿真环境下,使用DS18B20进行一路测温,测温精度达到到0.5摄氏度开机显示友好界面“HELLO”问候,当测温关闭时,会显示“OFF”提醒,闭合开关,又可以进行正常测温。本设计通过检查存在标志位的方法进行了测温开关的控制,避免了使用中断进行控制,从而避免了中断导致的测温时序混乱,测温不准的结果。 |
程序清单:
- ;===================================
- ;FLAG1: 标志位,为"1"时表示检测到DS18B20
- ;FLAG2: 标志位,为“1”时测温,为0时关闭
- ;DQ: DS18B20的数据总线接脚
- ;===================================
- ;RAM
- ByteCnt data 31H ;数据字节计数器
- TEMPER_H EQU 35H ;温度高八位
- TEMPER_L EQU 36H ;温度低八位
- TEMPER_NUM EQU 37H ;保存读出的温度数据
- ZhengShu EQU 38H ;存放整数部分数据
- Show_Dat EQU 40H ;存储要显示的数据
- ;BIT
- FLAG1 EQU 20H ;标志位,为"1"时表示检测到DS18B20
- DQ BIT P3.3 ;;DS18B20的数据总线接脚
- ;===================================
- ORG 00H ;;给定主函数起始位置
- LJMP MAIN ;;跳至主函数
- ORG 000BH ;;定时器T0中断服务程序入口
- LJMP INT_T0 ;;跳至T0中断
- ;===================================
- ;MAIN
- ;主程序
- ;===================================
- MAIN: NOP
- MOV R3,#0C8H ;显示200次
- MOV 50H,#0 ;显示缓冲单元
- MOV 51H,#1
- MOV 52H,#2
- MOV 53H,#3
- MOV 54H,#4
- MOV 55H,#5
- CALL HELLO ;;调用开机显示界面
- NOP
- MOV SP,#0E0H ;;设堆栈指针
- MOV TMOD,#01H ;T0工作在16位定时器
- MOV TH0,#0F8H ;定时2ms初值
- MOV TL0,#50H
- SETB ET0 ;允许定时器0中断
- CLR EA ;关闭全局中断
- SETB TR0 ;打开定时器0
- MOV R0,#40H ;该地址是存储要显示的数据区首址
- AGAIN: MOV @R0,#0FFH ;;存储区初始化,置1
- INC R0
- CJNE R0,#48H,AGAIN ;;遍历
- MAIN_1: CALL INIT_1820 ;;初始化18B20
- CALL RE_CONFIG ;;重新写DS18B20
- CALL GET_TEMPER ;;读温度
- MOV Show_Dat+1,#0FFH ;;存储区初始化,置1
- MOV Show_Dat+2,#0FFH
- MOV Show_Dat+3,#0FFH
- LCALL Temper_chng ;;数值转换
- MOV R5,#01H ;;第一个位选
- MOV R0,#40H ;;显示首址
- SETB EA ;;开全局中断
- LCALL DELAY ;;延时
- CLR EA ;;关全局中
- JMP MAIN_1 ;;返回主函数
- ;===================================
- ;INIT_1820
- ;DS18B20初始化程序
- ;===================================
- INIT_1820:
- SETB DQ ;;先拉高总线,准备拉低
- NOP ;;等待1us电平转换状态完毕
- CLR DQ ;;释放总线
- MOV R0,#6BH ;为延时送初值
- MOV R1,#03H ;;为延时送初值
- TSR1: DJNZ R0,TSR1 ;延时约700us (480~960)
- MOV R0,#6BH ;;为延时送初值
- DJNZ R1,TSR1
- SETB DQ ;释放总线
- NOP ;;延时
- NOP
- NOP
- MOV R0,#20H ;;为延时送初值
- TSR2: JNB DQ,TSR3 ;有存在信号跳转
- DJNZ R0,TSR2 ;延时约70us,70us后如果数据线没有存在脉冲(低电平)说明DS18B20不存在
- LJMP TSR4 ;;转到清除标志操作
- TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
- LJMP TSR5 ;;准备延时
- TSR4: CLR FLAG1 ;清标志位,表示DS18B20不存在
- LJMP TSR7 ;;准备释放总线继续等
- TSR5: MOV R0,#05CH ;;送延时初值
- TSR6: DJNZ R0,TSR6 ;延时200us
- TSR7: SETB DQ ;释放总线
- RET
- ;===================================
- ; RE_CONFIG
- ; 重新写DS18B20暂存存储器设定值
- ;===================================
- RE_CONFIG:
- JB FLAG1,RE_CONFIG1 ;若DS18B20存在,转RE_CONFIG1
- MOV R3,#0C8H ;显示200次
- MOV 60H,#0 ;显示缓冲单元
- MOV 61H,#1
- MOV 62H,#2
- MOV 63H,#3
- MOV 64H,#4
- MOV 65H,#5
- CALL OFF
- RET
- RE_CONFIG1:
- MOV A,#0CCH ;发SKIP ROM命令
- LCALL WRITE_1820
- MOV A,#4EH ;发写暂存存储器命令
- LCALL WRITE_1820
- MOV A,#30H;TH(上限)中写入00H
- LCALL WRITE_1820
- MOV A,#00H ;TL(下限)中写入00H
- LCALL WRITE_1820
- MOV A,#1FH ;选择9位温度分辨率
- LCALL WRITE_1820
- RET
- ;===================================
- ; 读出转换后的温度值
- ; 数据存储到TEMPER_H和TEMPER_L中
- ; 包含告警搜索
- ;===================================
- GET_TEMPER:
- SETB DQ ;定时入口
- LCALL INIT_1820 ;初始化1820
- JB FLAG1,TSS2
- RET ;若DS18B20不存在则返回
- TSS2: MOV A,#0CCH ;跳过ROM匹配
- LCALL WRITE_1820 ;;调写DS18B20的程序
- MOV A,#44H ;发出温度转换命令
- LCALL WRITE_1820
- LCALL INIT_1820
- MOV A,#0CCH ;跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ;发出读温度命令
- LCALL WRITE_1820
- LCALL READ_18200
- MOV TEMPER_NUM,A ;将读出的温度数据保存
- MOV A,#0ECH ;告警搜索
- CALL WRITE_1820
- RET
- ;===================================
- ; READ_1820
- ; 读DS18B20的程序,从DS18B20中读出一个字节的数据
- ; 读出的数据在A中
- ;===================================
- READ_1820:
- MOV R2,#8 ;一个字节8位
- RE1:
- CLR C ;清零进借位
- SETB DQ ;数据线拉高
- NOP ;延时
- NOP
- CLR DQ ;数据线拉低
- NOP ;延时
- NOP
- NOP
- SETB DQ;数据线拉高产生读时间隙
- MOV R3,#3 ;;为延时6us送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延时约6us
- MOV C,DQ ;读入数据
- MOV R3,#23 ;为延时50us送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延时约50us
- SETB DQ ;数据线拉高
- NOP
- RRC A
- DJNZ R2,RE1
- RET
- ;===================================
- ;WRITE_1820:
- ; 写DS18B20的程序
- ;===================================
- WRITE_1820:
- MOV R2,#8 ;;8位
- CLR C ;;清空C
- WR1: CLR DQ ;数据线拉低产生写时间隙
- MOV R3,#6 ;;为延时送数
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延时约6us(要求小于15us)
- RRC A ;;循环右移
- MOV DQ,C ;数据送到数据线
- MOV R3,#23 ;为延时送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延时约25us(要求15us-60us)
- SETB DQ ;数据线拉高
- NOP ;延时1.085us(要求连续写2 位间的间隙大于1us)
- DJNZ R2,WR1 ;判断是否写完没写完接着写下一位
- SETB DQ ;;写完拉高
- RET
- ;===================================
- ; READ_18200
- ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
- ; 数据存储到TEMPER_H和TEMPER_L中
- ;===================================
- READ_18200:
- MOV R4,#2 ;将温度高位和低位从DS18B20中读出
- MOV R1,#36H ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
- RE00:
- MOV R2,#8 ;;8位
- RE01:
- CLR C ;;清进借位
- SETB DQ ;;拉高
- NOP
- NOP
- CLR DQ ;;拉低
- NOP
- NOP
- NOP
- SETB DQ ;;释放总线
- MOV R3,#3 ;;为延时送数
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延时约6us
- MOV C,DQ ;;读数据
- MOV R3,#23 ;;为延时送数
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延时约50us
- SETB DQ ;数据线拉高
- NOP
- RRC A ;;移位保存
- DJNZ R2,RE01;;判断8位是否读完
- MOV @R1,A ;;将低位数据保存
- DEC R1 ;;转到存储高位数据地址
- DJNZ R4,RE00;判断两个字节是否读完
- RET
- Temper_chng:
- MOV DPTR,#TAB ;字形码表头地址
- MOV R0,#Show_Dat ;显示首地址赋给R0
- MOV A,TEMPER_L ;;温度低八位
- ANL A,#0FH ;取温度低四位
- CJNE A,#0H,NEXT ;判断小数部分数据
- MOV @R0,#0C0H ;小数为0
- LJMP NEXT1
- NEXT: MOV @R0,#92H ;小数为5
- NEXT1: INC R0 ;;下一个地址
- MOV A,TEMPER_L ;整数移位到低四位
- RR A
- RR A
- RR A
- RR A
- ANL A,#0FH ;保留低四位
- MOV ZhengShu,A
- MOV A,TEMPER_H ;整数部分移位到高四位
- RL A
- RL A
- RL A
- RL A
- ANL A,#0F0H ;保留高四位
- ADD A,ZhengShu ;相加得到整数部分数据
- MOV ZhengShu,A ;存储整数部分
- ;===================================
- ;判断正负数 ,正数可以直接进行转换,负数取反加1并且加负号
- ;===================================
- PUSH ACC ;;保存A
- ANL A,#80H ;;取符号位
- JZ NEXT12 ;;符号位为零,跳转至正数处理部分
- POP ACC
- CPL A ;;取反
- ADD A,#01H ;;加1
- PUSH ACC
- MOV R0,#Show_Dat ;显示首地址赋给R0
- MOV A,TEMPER_L;;温度低八位
- ANL A,#0FH ;;取温度低四位
- CPL A ;;取反
- ADD A,#01H ;;加1
- CJNE A,#0H,NEXT13 ;判断小数部分数据
- MOV @R0,#0C0H ;小数为0
- INC R0 ;;移到下一位
- MOV A,#0BFH ;加负号
- MOV Show_Dat+3,A ;;送回
- POP ACC
- LJMP NEXT2
- NEXT13: MOV @R0,#92H ;小数为5
- INC R0
- MOV A,#0BFH ;加负号
- MOV Show_Dat+3,A ;送回
- POP ACC
- DEC A
- LJMP NEXT2
- NEXT12: POP ACC
- NEXT2: MOV B,#10 ;16进制转成十进制
- DIV AB
- MOV R6,A ;;得高位
- MOV A,B
- MOVC A,@A+DPTR
- MOV @R0,A;将段码送到相应的地址空间
- INC R0 ;;转移到下一个地址
- MOV A,R6
- CJNE A,#0,NEXT2 ;;判断是否转换完
- MOV A,Show_Dat+1 ;加小数点
- CLR C ;清除进借位
- SUBB A,#80H ;;加点
- MOV Show_Dat+1,A ;;送回
- RET
- TAB: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
- ;;共阳数码管对应的字符表:0,1,2,3,4,5,6,7,8,9, 负号:0BFH
- TAB1: DB 0C0H,0C7H,0C7H,86H,89H,0FFH
- ;;"HELLO"
- TAB2: DB 0FFH,8EH,8EH,0C0H,0FFH,0FFH
- ;;"OFF"
- ;===================================
- DELAY:
- MOV R3,#10 ;;为延时送初值
- DELAY2: MOV R7,#200 ;;为延时送初值
- DELAY1: MOV R4,#250 ;;为延时送初值
- DJNZ R4,$
- DJNZ R7,DELAY1
- DJNZ R3,DELAY2
- RET
- ;===================================
- INT_T0: MOV TH0,#0F8H ;重赋2ms的定时器时间常数
- MOV TL0,#50H
- MOV P0,#0FFH ;高电位灭码
- MOV P2,R5 ;送当前显示数码管的位选信号
- MOV A,@R0 ;;取数
- MOV P0,A ;送字形代码
- INC R0 ;显示数据缓冲器指针加1,为下一个显示数据作准备
- CJNE R0,#48H,NEXT3 ;判断是否8个数据全部送完,未送完则不用调整显示缓冲指针
- MOV R0,#40H ;送完则调整显示缓冲指针
- NEXT3: MOV A,R5 ;将目前的位选暂存信号左移,为下一个数码管显示作准备
- RL A ;左移
- MOV R5,A ;;下一个位选
- RETI
- ;===========显示开关界面
- ;===================================
- HELLO: MOV R0,#50H ;显示缓冲首址
- MOV R2,#2H ;位控初始码(先亮最低位)
- LOOPs: MOV A,#0H ;共阴灭码
- MOV P2,A
- MOV A,R2 ;送位控信号
- MOV P2,A
- MOV A,@R0 ;从显示缓冲中取数
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR ;查出字形代码
- MOV P0,A ;送显示字符段代码
- MOV R7,#0FFH
- DJNZ R7,[ DISCUZ_CODE_7 ]nbsp; ;1ms延时,稳定显示信息
- INC R0 ;取下一个数
- MOV A,R2
- JB ACC.6,EXIT1 ;判断是否送到最高位?
- RL A
- MOV R2,A ;得到下一个位控信号
- AJMP LOOPs
- EXIT1: DJNZ R3,HELLO;是否显示完200次
- RET
- OFF: MOV R0,#60H ;显示缓冲首址
- MOV R2,#2H ;位控初始码(先亮最低位)
- LOOPs2: MOV A,#0H ;共阴灭码
- MOV P2,A
- MOV A,R2 ;送位控信号
- MOV P2,A
- MOV A,@R0 ;从显示缓冲中取数
- MOV DPTR,#TAB2
- MOVC A,@A+DPTR;查出字形代码
- MOV P0,A ;送显示字符段代码
- MOV R7,#0FFH
- DJNZ R7,[ DISCUZ_CODE_7 ]nbsp; ;1ms延时,稳定显示信息
- INC R0 ;取下一个数
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整论文下载(word格式 可编辑):
基于单片机的DS18B20测温系统的设计.doc
(1.17 MB, 下载次数: 21)
|