基于51单片机的电流测量系统设计.docx
目录1 前言12 电流测量系统总体设计13 电流测量系统硬件设计23.1 转换电路设计23.2 数据采集电路设计23.3 数据显示电路设计44 电流测量系统子程序设计64.1 AD 转换和数据采集程序设计64.2 16 进制转换为BCD 码程序设计84.3 字形查表程序设计104.4 I 2C 通信程序设计115 电流测量系统性能分析及调试136 设计心得14参考文献15附录一 电流测量系统总体电路设计15附录二 电流测量系统设计总程序171 前言武汉理工大学电子系统设计与调试课程设计说明书单片机微型计算机简称单片机,又称为微控制器(MCU),它以体积小、功能全、性价比高等诸多优点而独具特色,在各种嵌入式应用领域独占鳌头。51 系列单片机是目前国内应用最广泛的一种 8 位单片机之一。作为一位工科信息类专业的学生,在学过 51 单片机原理之后很有必要用实践来巩固理论知识的学习。通过理解 51 单片机原理、焊接 51 单片机硬件、弄懂与之相匹配的外围连接芯片和电路、熟悉使用 Keil uVision3 编程器和 STC_ISP_V3.1 下载器、编程调试实现任务要求、撰写设计报告等一系列工作的完成锻炼实际动手能力。STC89C51 开发板使用通用异步串口、USB 供电线;支持串口下载和单步调试;带有ZLG7290B,IIC 总线通信的键盘扫描和数码管显示芯片,自带 8M 晶振,最多可扫描 64 个键盘和 8 个数码管;8 位 LED 灯接 P1 口;TLC549,8 位串行 A/D;TLC5615,10 位串行 D/A。可做中断、定时、串口通信、流水灯、数码显示等单片机基本实验,也可以进行数据采集、制作波形发生器、制作电子钟等多项扩展实验。本次单片机课程设计我所做的项目是基于单片机的电流采集系统,主要用到 A/D 转换和数码管显示。2 电流测量系统总体设计需要采集的数据是直流电流,由于 TLC549 是逐次比较型 8 位串行 CMOS A/D 转换器, 只能输入电压信号,故在数据采集之前先要把直流电流信号转化为直流电压信号。通过适当的外围电路就可以实现了。输入电压经过 TLC549 进行数据转换和数据采集,采集结果为 8 位二进制数,为了方便分析,也可以看成是 16 进制数。16 进制数传入 51 单片机后,通过数制转换程序把 16 进制数转换为可以显示的 BCD码。通过查询字符表得到 BCD 码对应的字符。最后应用 I 2C 通信程序把相应字符传输给 ZLG7290B 管理芯片并通过数码管显示数据。其中 TLC549 的数据采集和 ZLG7290B 管理都需要在 51 单片机中编程实现数据传输和控制。总体设计如图 2.1 所示。1武汉理工大学电子系统设计与调试课程设计说明书图 2.1 电流采集总体设计3 电流测量系统硬件设计3.1 转换电路设计输入端接入一个适当的电阻,可以把直流电流信号转换为直流电压信号。如图 3.1 所示。3.2 数据采集电路设计图 3.1 电流-电压转换电路数据采集电路要用到 A/D 转换芯片 TLC549。TLC549 是逐次比较型 8 位串行 CMOS A/D 转换器,电压供电范围为+3+6V,具有4MHz 片内系统时钟和软、硬件控制电路,转换时间最大值为17ms ,允许的最高转换速率为 40000 次/s。总失调误差最大为±0.5LSB, 典型功耗值为 6mW。采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,VREF -接地,VREF +VREF -1V,可用于较小信号的采样。TLC549 均有片内系统时钟,该时钟与I/O CLOCK 是独立工作的,无须特殊的速度或相位匹配。TLC549 可方便地与具有串行外围接口(SPI)的单片机或微处理器配合使用,也可与 51 系列通用单片机连接使用。TLC549 片型小,采样速度快,功耗低,价格便宜,控制简单。适用于低功耗的袖珍仪器上的单路 A/D 或多路并联采样。TLC549 的内部框图和管脚名称如图 3.2 所示。2武汉理工大学电子系统设计与调试课程设计说明书图 3.2TLC549 的内部框图和管脚名称TLC549 的数字量输出与 A/D 输入电压之间的关系如表 3.1 所示表 3.1A/D 输入电压与数字量输出量关系表输入电压值V= VINREF +MV= (V) - (V) / 2INREF +REF -MV= VINREF -输出数字量(二进制)11111111M1000000M0000000注意:本次测量取V接+5V,V接地REF +REF -TLC549 的工作时序如图 3.3 所示。芯片本身没有 A/D 转换结束信号,需要软件延时一段时间等待转换结束,转换周期典型值为 36 个时钟周期(最大为17ms ), CS 低电平有效,在CS 变低后,最高有效位 A7 被自动放置在 DATAOUT总线上,其余 7 位 A6A0 在前 7 个 I/O CLK 的下降沿由时钟同步输出,第 8 个下降沿选择通道地址,DATAOUT输出的数据是上次 A/D 转换的结果。3武汉理工大学电子系统设计与调试课程设计说明书图 3.3 TLC549 的工作时序图综上分析可以设计数据采集电路如图 3.4 所示。VREF +接供电电压,VREF -接地,TLC549 的片选CS 、数据输出 DATAOUT、时钟脉冲 I/O CLOCK 分别接 51 单片机的 P1.2、P1.3、P1.4口,实现 51 单片机对 TLC549 的控制和 TLC549 向 51 单片机的数据传输。3.3 数据显示电路设计图 3.4 数据采集电路图 3.4 采样信号(16 进制数)经过 51 单片机程序变换成可以显示的 BCD 码,要通过管理芯片 ZLG7290B 和数码管相连的电路显示数值。ZLG7290B 是广州周立功单片机发展有限公司自行设计的数码管显示驱动及键盘扫描管理芯片。能够直接驱动 8 位共阴式数码管(或 64 只独立的 LED),同时还可以扫描管理多达 64 只按键。其中有 8 只按键还可以作为功能键使用,就像电脑键盘上的 Ctrl、Shift、Alt 键一样。另外 ZLG7290B 内部还设置有连击计数器,能够使某键按下后不松手而连续4武汉理工大学电子系统设计与调试课程设计说明书有效。采用 I 2 C 总线方式,与微控制器的接口仅需两根信号线。该芯片为工业级芯片,抗干扰能力强,在工业测控中已有大量应用。ZLG7290B 引脚图如图 3.5 所示。图 3.5 ZLG7290B 引脚图KR0KR7和DIG0DIG7实现对键盘信号和数码管显示的管理; INT 是键盘中断请求信号,低电平(下降沿)有效; RST 是复位信号,低电平有效;OSC1和OSC2分别为晶振输入、输出信号;SCL是 I 2 C 总线时钟信号,SDA是 I 2 C 总线数据信号。I 2 C 总线是双向传输的总线,因此主机和从机都可能成为发送器和接收器。如果主机向从机发送数据,则主机是发送器,而从机是接收器;如果主机从从机读取数据,则主机是接收器,而从机是发送器。数据线SDA的电平状态必须在时钟线SCL处于高电平期间保 持稳定不变。SDA的电平状态只有在SCL处于低电平期间才允许改变。 I 2 C 总线上数据有效性的示意图如图3.6所示。图3.6 I 2 C 总线上数据有效性的示意图ZLG7290B内部有8个显示缓冲寄存器DpRam0DpRam7,它们直接决定数码管显示 的内容。ZLG7290B提供有两种显示控制方式,一种是直接向显存写入字型数据,另一种5武汉理工大学电子系统设计与调试课程设计说明书是通过向命令缓冲寄存器写入控制指令实现自动译码显示。通过程序访问51单片机寄存器需要通过 I 2 C 总线接口来实现。ZLG7290B的 I 2 C 总线器件地址是70H(写操作)和71H(读操作)。显示缓冲区DpRam0DpRam7(地址:10H 17H)这8个寄存器的取值直接决定了数码管的显示内容。每个寄存器的8个位分别对应数 码管的a,b,c,d,e,f,dp 段,MSB 对应a,LSB对应dp。ZLG7290B驱动数码管电路如图3.7所示。图3.7 ZLG7290B驱动数码管电路图只要51单片机中程序编写正确,通过 I 2 C 总线通信后,就可以在数码管上显示电流值。4 电流测量系统子程序设计4.1 AD 转换和数据采集程序设计由 TLC549 的工作时序图可知,只有CS =0 时才能采集数据,而每一位数据采集可采用寄存器 A 的带进位标志位循环左移实现,每次时钟脉冲(P1.4)下降沿采集一位数据, 一轮采集 8 次得到 8 位二进制数,等待 17µS(36 个时钟周期)再启动下轮采集。根据 TLC 时序图还可以知道每次 A 中返回的 8 位数都是上次采集结果。A/D 转换和数据采集程序流6武汉理工大学电子系统设计与调试课程设计说明书程图如图 4.1 所示。开始P1.2=0,CS片选成功等待1.4µSA带进位标志左移一位采集一位数放入进位标志C中P1.4输入时钟脉冲采集次数=8?NY P1.2=1,保持转换结果结束等待36个时时间到钟周期下轮采集图 4.1AD 转换和数据采集程序流程图15;AD 转换和数据采集子程序; AD:MOV 20H,#0MOV R2,#08H;第一次采样 CLOCK 的 8 个脉冲CLR P1.2 ;CS 变为低电平NOPNOP NOPL3:MOV C,P1.3;对模拟输入采样,读出结果 OUT MOV A,20HRLC A MOV 20H,ALCALL PULSE DJNZ R2,L3MOV R2,#24H;A/D 转换的 36 个时钟周期SETBP1.2;CS 变为高电平,保持 36 个时钟周期L4:LCALL PULSEDJNZ R2,L4 RET;产生 CLK 时钟脉冲子程序PULSE:SETBP1.4;p1.4 输出高电平,CLOCK 时钟NOP NOP NOPCLR P1.4 RET4.2 16 进制转换为 BCD 码程序设计因为按照 TLC549 采集的数据是把 5V 电压值平均分为 255 份,因此采集到 A 中的数据需要除以 51 并逐位储存所得的商才能正确显示模拟输入值。当单片机基准电压改变时就要适当修改程序中的除数 51,经过测量,我使用的单片机基准电压只有 4.11V,于是,我把程序中的 51 改成 62,其他原理一样,以后不再赘述。这里以基准电压为 5V 讲述转换程序的原理。从第二位起,三次所得余数乘以10 后可能大于 255,这时如果只用A 寄存器存储时就会丢失最高位(余数在 2650 之间丢失,因为余数不可能大于 50,乘以 10 后不可能大于 500,若有最高位最大可表示 512,显然512>500,故若丢失只可能是最高位一位)。为了采取补救措施,我们把余数减去 1AH 判断是否有溢出。如果有溢出,则表明余数乘以 10 后可能不小于 255,这样第二次除以 51 的商需要加上 5 才是准确的 BCD 码;如果没有溢出则表明余数乘以 10 后可能小于 255, 这样第二次除以 51 的商就是准确的 BCD 码。如此调准后的 BCD 码送入相应储存单元才是正确的。由于采集范围确定为 050mA,所以需要显示十位,而显示的电压值只有05V,故需要把第三位加上小数点,使用 4 位数码管显示,可以精确到 0.01mA。在实际验收时如果没有恒流源,则可以用输入电压实现模拟测量。比如说,需要模拟 10mA 的电压输入测量, 在不接外加电阻的情况下,在 A/D 转换输入端直接接入 1V 电压,理论上应该是显示 10.00, 此时对应的电压值是 1V、电流值是 10mA。A 中存储的 16 进制转换为 BCD 码程序设计流程图如图 4.2 所示。A÷51商送53H当十位余数-1AH余数×10送AY是否有溢出N余数×10送AA÷51余数-1AHA÷51商+5送51H余数×10送AY是否有溢出N余数×10送A商送51单元单元当小数A÷51余数-1AHA÷51当小数第一第一位位余数×10送AY是否有溢出N余数×10送A商+5送50H单元当小数A÷51A÷51商送50单元当小数第二第二位位商+5送52H单元当个位商送52单元当个位图 4.216 进制转换为BCD 码程序设计流程图;16 进制(20H 单元中)转换为 BCD 码; ZHUANHUAN:MOV A,20H MOV B,#62;255/4.11=62,把 4.11V 分为 255 等分采集的数据DIV ABMOV F0,C;F0 为跳转标志MOV A,#10 MUL ABMOV B,#62 DIV ABJB F0,LOOP2MOV 53H,AADD A,#5;十位存 53H 单元中MOV A,B;余数大于 19H,F0 为 1,乘法溢出,加 5 CLR F0SUBB A,#1AHLOOP2:MOV 52H,A;个位存 52H 单元中MOV A,BCLR F0SUBB A,#1AHMOV F0,C MOV A,#10 MUL AB MOV B,#62 DIV ABJB F0,LOOP3 ADD A,#5LOOP3:MOV 51H,A;小数点后第一位存 51H 单元中MOV A,BCLR F04.3 字形查表程序设计SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#51 DIV ABJB F0,LOOP4 ADD A,#5LOOP4:MOV 50H,A;小数点后第二位存 50H 单元中RET对于十位的显示,只需要在字符表中查得相应字符送入显示十位的 63H 单元中即可。显示个位时除了要查到字符以外,还要在送入 62H 单元显示前加一,原因是当要显示带小数点字符时就要在相应字符显示前加一,例如 5 的字型数据为 0B6H(不带小数点)或 0B7H(带小数点)。接下来的两位小数可以用循环两次的办法把需要显示的字符分别送入 61H和 60H 就可以了。字形查表程序设计流程图如图 4.3 所示。PUSH PSW十位53H单元送A查表得A对应字符送入63H做十位个位52H单元送A查表得A对应字符查得字符加1(显示小数点)送入62H做个位两位小数点R0=50H, R1=5FH,R2=2HR0单元送A查表得A对应字符R0+1R0 R1+1R1字符送入R1做相应小数位POP PSW结束NR2-1=0结束Y;字形查表子程序; XIANSHI:PUSH PSW;显示十位图 4.3字形查表程序设计流程图MOV R0,#53H MOV R1,#63H MOV DPTR,#TABMOV A,R0MOVC A,A+DPTR MOV R1,A;显示个位MOV R0,#52H MOV R1,#62H MOV DPTR,#TAB MOV A,R0MOVC A,A+DPTR INC AMOV R1,A;显示小数点后二位4.4 I 2 C 通信程序设计MOV R0,#50H MOV R1,#5FH MOV R2,#02H MOV DPTR,#TABNEXT3:MOV A,R0MOVC A,A+DPTR INC R0INC R1 MOV R1,ADJNZ R2,NEXT3 POP PSWRETNNY发送起始发送控制字应答Y发送地址应答?Y发送字节发应N 送答停?止I 2 C 通信总线是串行传输总线,两根线(串行时钟线SCL 和串行数据线 SDA)能实现全双工同步数据传送。在数据传输时,开始位后,主器件送出 8 位控制字节,以选择从器件并控制总线传送方向,其后再传送数据。没传送一个字节后,接收器都必须发一位应答信号 ACK,发送器确定后,再发下一数据。每一数据都是先发高位,再发低位,在全部数据传送结束后主控制器发送停止信号。还要注意写时钟 SCL 和 SDA 的发送起始和停止条件程序时,要根据单片机晶振来确定NOP 指令条数,由于我们用的外部时钟晶振是11.0592M,需要四个 NOP 指令。 I 2 C 通信程序设计流程图如图 4.4 所示。图 4.4 I 2 C 通信程序设计流程图;IIC 通信子程序;n 个字节数据发送子程序WRNBYT:PUSH PSW;现场保护WRNBYT1:MOV PSW,#18H;改用第 3 组工作寄存器CALL STA;发起始条件MOV A,SLA;读写控制字节CALL WRB;发送写控制字节CALL CACK;检查应答位JB F0,WRNBYT ;无应答位,重发MOV R0,#MTD;有应答位,发送数据,第一个数据为首址MOV R5,NUMBYT;R5 存读取数据字节数WRDA:MOV A,R0;读第一个字节数据LCALL WRB;发送此字节LCALL CACK;检查 ACKJB F0,WRNBYT1;无 ACK,重发INC R0;调整指针DJNZ R5,WRDA;尚未发完 n 个字节,继续LCALL STOP;全部发完数据,停止POP PSW;恢复现场RET;返回;字节数据发送子程序WRB:MOV R7,#8 ;位计数器初值WLP:RLC A;欲发送位移如 C 中JC WR1;此位为 1,转 WR1 CLR SDA;此位为 0,发送 0 SETB SCL;时钟脉冲变高电平NOP;延时NOP NOPNOPCLR SCL;时钟脉冲变低电平DJNZ R7,WLP;未发完 8 位,转 WLPRET;8 位发送完,返回WR1:SETB SDA ;此位为 1,发送 1 SETB SCL ;时钟脉冲变高电平NOP;延时NOP NOP NOPCLR SCL;时钟脉冲变低电平CLR SDA DJNZ R7,WLP RET;应答位检查子程序CACK:SETB SDA;SDA 作为输入SETB SCL;第 9 个时钟脉冲开始NOP NOPMOV C,SDA ; 读 SDA 线MOV F0,C;转存入 F0 中CLR SCL;时钟脉冲结束NOPNOP RETSTA:SETBSDA;发送起始位SETBSCL NOPNOPNOPNOPNOPNOPCLRSDANOPNOPNOPNOPSETBSDANOPNOPNOPNOPCLRSCLNOPRETNOPSTOP:CLRSDA;发送停止位CLRSCLSETBSCLRET5 电流测量系统性能分析及调试由于采样用的VREF=5V,故 A/D 转换器出来电压量程为 05V,通过外接电阻可以实现电流测量;在电流输入口接一个100,则可以测量050mA 电流,由于需要显示十位, 于是我把小数点放在第三位,从而把 050mA 的 mA 级电流正确显示在数码管上。其实可以通过基准电压校准数码管显示,例如输入电压为 6V 时,我们只需把进制转换程序中的“A÷51”改成“A÷43”,就可以实现测量06V,通过外接电阻就可以扩大电流测量范围。因为我测量的是 mA 级电流,精确到 0.01mA 已经满足要求,当要求更高精确度时,我们可以适当增加小数点后面的位数就可以了,具体做法是向后顺移各位并增加需要的位数即可。设计完成后,在调试阶段。最开始时,显示在数码管上的是 16 进制数,比如接+5V 时显示 256,查看源程序发现进制转换程序有问题,看下面两段程序: “ MOV A,20H MOV B,#100 DIV AB MOV 53H,A” 和 “MOV A,20H MOV B,#51 DIV ABMOV 53H,A”,前者只是把 20H 单元中的 16 进制数转化为 BCD 码并把百位存入 53H 单元中,而后者是把 5V 分为 255 等分采集的数据按 05V 范围显示出来,显然后者显示才是正确可取的,当然后者还要在恰当的地方加上小数点,否则显示也是错误的。加上小数点后,能够测量 05V 直流电压,如果外接上 1K 电阻可以正常显示 05mA电流,也就说只能测量比较小的电流,没有什么实用价值。如果可以显示 050mA 电流就比较理想了,于是我可以外接 100,但只是单纯地外接 100并不能解决问题,因为数码管上实际显示的总是 05V 范围的电压值。比如当输入 20mA 电流时,显示在数码管上的是 2.000,也就说此时不能正确反映电流大小。要解决这一问题其实也很简单,我们只需要把小数点后移一位即可,这是就要注意原小数点后面个位显示的循环程序都要修改, 否则就会出现错误。通过以上各项调试和改进,此次基于 51 单片机的电流数据采集系统设计基本完成。系统参数指标如下:输入基准电压为+5V;测量直流电流范围为 050mA;精确到 0.01mA。能比较准确地显示 0.01mA50mA 范围内的直流电流值。6 设计心得通过两周多时间的紧张设计,本次单片机课程设计终于告一段落,我体会很多。从刚开始的选题到选题论证、从查找借鉴资料到自主设计、从本学科基础知识到其它学科知识、从自己思考到和老师同学交流,我从中学到了很多以前理论知识学习中所学不到的东西。我设计的题目是“基于 51 单片机的电流采集系统设计”,先把直流电流通过转换电路转换为直流电压,之后通过 A/D 把模拟信号变成数字信号并采集数据,再把采集到的 16 进制数转换为可以准确显示的 BCD 码,最后 I 2C 通信程序把数据传给数码管管理芯片并通过数码管把模拟信号大小表示出来。课程设计之前一直只是理论知识的学习,在课程设计阶段,我不但自习重新学习的51 单片机课本的相关章节,而且还在图书馆借来书籍阅读和参考。在遇到问题的时候,积极与身边的同学交流经验,是在弄不懂的地方就请教老师,我从中学到了很多知识以外的东西,比如说遇到问题后分析解决问题的方法、坚忍不拔和不耻下问的求知态度等等。特别是在程序设计阶段,虽然程序不是很复杂,但是由于是第一次接触,总感觉无从下手, 最后通过查阅资料和反复试验最终把程序设计了出来。这次课程设计巩固了我以前所学过的知识,知识学得更深、更透彻,理论联系实际, 很好地锻炼了我的发散思维能力和动手能力。感谢刘皓春老师对我此次课程设计的指导。参考文献1李群芳.单片微型计算机及接口技术(第二版).北京:电子工业出版社.2005 2何立民. MCS-51 单片机应用系统设计.北京:北京航空航天出版社.20003 蒋力培.单片微机系统实用教程.北京:机械工业出版社.20044 王琼.单片机原理及应用实验教程.合肥:合肥工业大学出版社.2005 5凌玉华.单片机原理及应用系统设计.长沙:中南大学出版社.2006 6李广军.可编程 ASIC 设计及应用.成都:电子科技大学出版社.2000附录一 电流测量系统总体电路设计电流采集总体电路设计如附录一图所示。电阻与 A/D 转换芯片 TLC549 的电压输入口Analog(编号为 2)相连接;TLC549 的CS 、DATAOUT、I/O CLOCK 分与 51 单片机的P1.2、P1.3、P1.4 口相连接;ZLG7290B 的 SCL 和 SDA 分别与 51 单片机的 P1.0、P1.1 相连接。TLC549、ZLG7290B 与 51 单片机相连实现数据传输和信号控制,程序设计是要先定义以上 51 单片机各端口。武汉理工大学电子系统设计与调试课程设计说明书Fu王lE oo l 吉sA证8 001.2扯JClpFpDIG 咏 CODIGl氐 Cl DIG2氐 C1 DIG3IKC3 DIG4.KCi DIG5住 C5DIG邹 DIG71KCDPY2a8口尸;-中附录一图 电流禾第总体电路设计b:中 心卢-I 扫门口3志b曰丿b< ·血nEl,。lDc卢口d迅中 8Jmm口( 中一心臼乌直流电洗输入u16武汉理工大学电子系统设计与调试课程设计说明书附录二 电流测量系统设计总程序A/D 转换与数据采集程序16进制数数制转换程序BCD码字形查表程序IIC通信程序数据显示软件设计总框图如附录二图所示。模拟信号送入 A/D 转换器 TLC549 后转换为数字信号,编写程序通过脉冲和片选采集数据,采集到的数据是 16 进制数;由于 16 进制直接显示不能表达模拟信号大小,所以紧跟着需要一个数制转换程序将16 进制转换为 BCD 码以便于直接表示模拟信号大小;接下来就要编写 BCD 码数如何正确显示的程序,要编程实现显示整数和小数部分;再把需要显示的数据通过 I 2C 通信程序送到数码管显示。21;总程序清单;定义; SCLBIT P1.0SDABIT P1.1CSBIT P1.2 DATEBIT P1.3 CLOCKBIT P1.4 NUMBYT EQU 5DH SLAEQU 5EHMTDEQU 5FH;程序开始; ORG 0000HMAIN:LCALL ADLCALL ZHUANHUAN LCALL XIANSHI;II 通信与数码管显示入口MOV MTD,#10H MOV NUMBYT,#09H附录二图软件设计总框图MOV SLA,#70H LCALL WRNBYT SJMP$;子程序清单;AD 转换和数据采集子程序; AD:MOV 20H,#0MOV R2,#08H;第一次采样 CLOCK 的 8 个脉冲CLR P1.2 ;CS 变 为 低 电 平NOPNOP NOPL3:MOV C,P1.3;对模拟输入采样,读出结果 OUT MOV A,20HRLC AMOV 20H,ALCALL PULSE DJNZ R2,L3 MOV R2,#24H;A/D 转换的 36 个时钟周期SETBP1.2;CS 变为高电平,保持 36 个时钟周期L4:LCALL PULSEDJNZ R2,L4 RET;产生 CLK 时钟脉冲子程序PULSE:SETBP1.4;p1.4 输出高电平,CLOCK 时钟NOP NOP NOPCLR P1.4 RET;16 进制(20H 单元中)转换为 BCD 码;ZHUANHUAN:MOV A,20H MOV B,#62;255/4.11=62,把 4.11V 分为 255 等分采集的数据DIV AB MOV 53H,A;十位存 53H 单元中MOV A,B;余数大于 19H,F0 为 1,乘法溢出,加 5 CLR F0SUBB A,#1AH MOV F0,C;F0 为跳转标志MOV A,#10 MUL AB MOV B,#62 DIV ABJB F0,LOOP2 ADD A,#5LOOP2:MOV 52H,A;个位存 52H 单元中MOV A,BCLR F0SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#62 DIV ABJB F0,LOOP3 ADD A,#5LOOP3:MOV 51H,A;小数点后第一位存 51H 单元中MOV A,BCLR F0SUBB A,#1AH MOV F0,C MOV A,#10 MUL ABMOV B,#51 DIV ABJB F0,LOOP4 ADD A,#5LOOP4:MOV 50H,A;小数点后第二位存 50H 单元中RET;字形查表子程序; XIANSHI:PUSH PSW;显示十位MOV R0,#53H MOV R1,#63H MOV DPTR,#TAB MOV A,R0MOVC A,A+DPTR MOV R1,A;显示个位MOV R0,#52H MOV R1,#62H MOV DPTR,#TAB MOV A,R0MOVC A,A+DPTR INC AMOV R1,A;显示小数点后二位MOV R0,#50H MOV R1,#5FH MOV R2,#02H MOV DPTR,#TABNEXT3:MOV A,R0MOVC A,A+DPTR INC R0INC R1 MOV R1,ADJNZ R2,NEXT3 POP PSWRET;IIC 通信子程序;n 个字节数据发送子程序WRNBYT:PUSH PSW ;现场保护WRNBYT1:MOV PSW,#18H;改用第 3 组工作寄存器CALL STA;发起始条件MOV A,SLA;读写控制字节CALL WRB;发送写控制字节CALL CACK;检查应答位JB F0,WRNBYT ;无应答位,重发MOV R0,#MTD;有应答位,发送数据,第一个数据为首址MOV R5,NUMBYT;R5 存读取数据字节数WRDA:MOV A,R0;读第一个字节数据LCALL WRB;发送此字节LCALL CACK;检查 ACKJB F0,WRNBYT1;无 ACK,重发INC R0;调整指针DJNZ R5,WRDA;尚未发完 n 个字节,继续LCALL STOP;全部发完数据,停止POP PSW;恢复现场RET;返回;字节数据发送子程序CACK:SETB SDA;SDA 作为输入SETB SCL;第 9 个时钟脉冲开始NOP NOPMOV C,SDA ; 读 SDA 线MOV F0,C;转存入 F0 中WRB:MOV R7,#8 ;位计数器初值CLR SCLWLP:RLC A;欲发送位移如 C 中NOPJC WR1;此位为 1,转 WR1NOPCLR SDA;此位为 0,发送 0RET SETB SCL;时钟脉冲变高电平STA:SETBSDA NOP;延时SETBSCLNOPNOPNOPNOPNOPNOPCLR SCL;时钟脉冲变低电平NOPDJNZ R7,WLP;未发完 8 位,转 WLPCLRSDARET;8 位发送完,返回NOPWR1:SETB SDA;此位为 1,发送 1NOPSETB SCL;时钟脉冲变高电平NOPNOP;延时NOPNOPCLRSCLNOPRETNOPSTOP:CLRSDACLR SCL;时钟脉冲变低电平SETBSCLCLR SDANOPDJNZ R7,WLPNOPRETNOP;应答位检查子程序NOP;时钟脉冲结束;发送起始位;发送停止位SETB SDA NOPNOP NOP NOPCLR SCL RET;数字字形显示表TAB:DB 0FCH,60H,0DAH,0F2H,66H, DB0B6H,0BEH,0E0H,