您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 单片机课程设计――温度测控系统程序
SDAEQUP1.3;I2C数据线SCLEQUP1.4;I2C时钟线DQEQUP1.5;3-WIR数据线CLKEQUP1.6;3-WIR时钟线NRSTEQUP1.7;3-WIR复位线SLAWEQU70H;SAA1064写命令,地址为70H,最低位为0表示写SLAREQU71H;SAA1064读命令,地址为71H,最低位为1表示读THEQU34;最高极限温度TLEQU32;最低极限温度TZEQU33DSEGAT20HNUMBYT:DS1;向SAA1064I2C传送字节数N存放单元BUFTC:DS2;SAA1064发送命令缓冲区BUFTD:DS4;向SAA1064发送数据缓冲区BUFRD:DS6;从SAA1064接收缓冲区DAT1:DS1;温度值存储单元POINT:DS1;小数点后温度值的存储单元CSEGAT0000HJMPMAIN1ORG0003HLJMPKEYORG0100HMAIN1:MOVSP,#60H;已用参数R0,R1,R2,R5,R6,R7,C,F0MOVPSW,#00HMOV50H,#33MOV51H,#25MOV52H,#29MAIN0:SETBEX0SETBEAMOV45H,#2;写入判断条件MOV33H,#1;写入循环条件MOV44H,#1MOVA,38HCJNEA,#00H,AA1MOV38H,#01HRETIAA1:CLRIE0CLRP1.0LCALLBEGIN;复位命令MOVA,#0CH;写配置寄存器命令LCALLW8BITMOVA,#0AH;连续转换模式数据LCALLW8BITLCALLBEGIN;结束上一次通讯,开始下一次通讯MOVA,#01H;写TH寄存器命令LCALLW8BITMOVA,#THMOVA,50H;写最高温度值MOVPOINT,#0LCALLW9BITLCALLBEGIN;结束上一次通讯,开始下一次通讯MOVA,#02H;写TL寄存器命令LCALLW8BITMOVA,#TLMOVA,51H;写最低温度值MOVPOINT,#0LCALLW9BITLCALLBEGIN;结束上一次通讯,开始下一次通讯MOVA,#0EEH;开始温度转换命令LCALLW8BITCLRNRST;结束上一次通讯LCALLDELAY2;延时1sRENU:LCALLBEGIN;复位命令MOVA,#0AAH;写读温度值命令LCALLW8BITLCALLR9BIT;读9位温度值MOV57H,R0;加如的判断温度和设定之间的关系,并跳到相应的子程序MOV46H,AMOVA,50HDECAMOVB,46HSUBBA,BJBACC.7,S5JMPS6S5:LJMPKBSS6:MOVA,52HADDA,#2MOVB,46HSUBBA,BJBACC.7,S7JMPS8S7:LJMPQJKSS8:MOVB,51HMOVA,46HSUBBA,BJBACC.7,S11JMPS10S11:LJMPKBJS10:MOVA,52HSUBBA,#2MOVB,AMOVA,46HSUBBA,BJBACC.7,S9JMPS12S9:LJMPKJS12:MOVR0,57H;判断结束5MOVA,46H;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOVDAT1,A;将1-8位温度值送DAT保存CLRNRST;结束一次读温度LCALLSTORE;将温度值转换为可显示的形式MOVNUMBYT,#6;显示温度值LCALLWRNBYTSJMPRENUSTORE:MOVR0,#BUFTC;用到参数DAT,POINTMOVA,#00H;SAA1064子地址MOV@R0,AINCR0MOVA,#47H;SAA1064控制字节MOV@R0,AMOVR0,#BUFTDMOVA,DAT1;判断温度值是正是负JBACC.7,NEGMOVA,#00H;正温度的符号位不显示,数码管不亮MOV@R0,AAJMPNSTNEG:CPLA;将负数转换成相应的正数MOVB,AMOVA,POINTCPLACLRACC.1INCAMOVC,ACC.1XCHA,BADDCA,#0MOVDAT1,A;把负温度值1-8位变正存储MOVPOINT,B;把负温度值第9位变正存储MOVA,#40H;负号显示MOV@R0,ANST:INCR0;显示缓冲区地址加1MOVA,DAT1;取温度值MOVB,#10;除法后寄存器ACC是十位数,寄存器B是个位数DIVABMOVDPTR,#TAB0;将十位和个位的数转换为数码管的字形码值MOVCA,@A+DPTRMOV@R0,A;存十位数INCR0;显示缓冲区地址加1MOVA,BMOVCA,@A+DPTRSETBACC.7MOV@R0,A;存个位数和小数点INCR0;显示缓冲区地址加1MOVA,POINT;取小数点后的值JBACC.0,FLOAT;如果有小数转FLOATMOVA,#3FH;将0的字形码值存缓冲区MOV@R0,AAJMPEFLOAT:MOVA,#6DH;将5的字形码值存缓冲区MOV@R0,AE:RETTAB0:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9段码值表;3-WIR初始化子程序BEGIN:CLRNRST;复位线置0CALLDELAY1;延时20mS,这是为了写EEPROM时有足够长的等待时间SETBCLK;置3-WIR时钟为高SETBNRST;复位线置1RET;向3-WIR数据线上发送9位温度值,第9位数据在POINT中,1-8位数据在ACC中W9BIT:CLRCLK;置3-WIR时钟为低SETBDQ;置3-WIR数据线为1,即默认第9位数据为1MOVR0,POINT;从POINT读出第9位数据送R0CJNER0,#0,W1;第9位数据不为0转W1CLRDQ;置3-WIR数据线为0,即第9位数据为0W1:SETBCLK;置3-WIR时钟为高,发送数据;下一段程序也可单独作为写8位数据使用W8BIT:MOVR0,#08H;置R0为8,为写8位数据建立计数器初值W2:CLRCLK;置3-WIR时钟为低SETBDQ;置3-WIR数据线为1,即默认数据为1RRCA;右移将被发送数据放入进位CJCW3;进位为1(即发送数据为1)转W3CLRDQ;置3-WIR数据线为0,即发送数据为0W3:SETBCLK;置3-WIR时钟为高,发送数据DJNZR0,W2;8位数据没送完转W2RET;读9位温度值。第9位存到POINT,第1-8位存到累加器ACCR9BIT:SETBDQ;置3-WIR数据为高,为接收数据做准备CLRCLK;置3-WIR时钟为低MOVPOINT,#1;默认小数点后的数据为1MOVC,DQ;传送小数点后的数据到进位CJCRR1;进位为1转RR1MOVPOINT,#0;将0存入POINTRR1:SETBCLK;置3-WIR时钟为高;下一段程序也可单独作为写8位数据使用R8BIT:MOVR0,#08H;置R0为8,为读8位数据建立计数器初值RR2:CLRCLK;置3-WIR时钟为低MOVC,DQ;传送读出的数据到进位CRRCA;通过右移将读出的数放入ACCSETBCLK;置3-WIR时钟为高DJNZR0,RR2;8位数据没读完转RR2RET;模拟I2C总线发送N个字节数据,N存放在NUMBYT中;数据区的第一个字节为从器件的地址SUBADR;数据区的第二个字节是控制寄存器字节COMWRNBYT:LCALLSTAR0;发出启动传输命令MOVA,#SLAW;发出发送数据命令LCALLWRBYTLCALLCACK;调用应答子程序JBF0,WRNBYT;如果错误应答,转WRNBYT重新开始MOVR1,#BUFTC;放发送数据区的首地址在R1中WRDAT:MOVA,@R1;从数据区中取出1个字节发送LCALLWRBYTLCALLCACK;调用应答子程序JBF0,WRNBYT;如果错误应答,转WRNBYT重新开始INCR1;数据区地址加1DJNZNUMBYT,WRDAT;发送没有结束转WRDAT继续发送LCALLSTOP;发送结束,发出停止命令RET;模拟I2C总线接收N个字节数据,N存在NUMBYTRDNBYT:LCALLSTAR0;发出启动传输命令MOVA,#SLAR;发出接收数据命令LCALLWRBYTLCALLCACK;调用应答子程序JBF0,RDNBYT;如果错误应答,转RDNBYT重新开始RDN:MOVR1,#BUFRD;放接收数据区的首地址在R1中RDN1:LCALLRDBYT;接收1个字符MOV@R1,A;将收到的字符放进缓冲区DJNZNUMBYT,ACK;接收没结束,转ACKLCALLMNACK;接收结束,发送非应答信号LCALLSTOP;发送停止信号RETACK:LCALLMACK;发送应答信号INCR1;缓冲区地址加1SJMPRDN1;向SDA线上发送一个数据字节子程序,使用了R0WRBYT:MOVR0,#08H;8位数据长度送R0中WLP:RLCA;发送数据左移,使发送位送入进位C中JCWRE1;判断发送1还是0,发送1转WRE1SJMPWRE0;发送0转WRE0WLP1:DJNZR0,WLP;8位是否发送完,未完转WLPRET;8位发送完,返回;发送1程序段WRE1:SETBSDA;置数据信号SDA为高SETBSCL;置时钟信号SCL为高NOP;NOP为满足I2C协议所需的等待时间NOPCLRSCL;使时钟信号SCL为低CLRSDA;使数据信号SDA为低SJMPWLP1;发送0程序段WRE0:CLRSDA;使数据信号SDA为低SETBSCL;置时钟信号SCL为高NOP;NOP为满足I2C协议所需的等待时间NOPCLRSCL;使时钟信号SCL为低SJMPWLP1;从SDA线上读取一个数据字节子程序,放入R2中RDBYT:MOVR0,#08H;8位数据长度送入R0RLP:SETBSDA;置SDA为输入方式SETBSCL;置时钟信号SCL为高,使SDA上数据有效CLRC;默认读数为0,置进位C=0JNBSDA,RD0;读数为0,转RD0SETBC;读数为1,置进位C=1RD0:MOVA,R2;将读到的数(在进位C中),通过循环左移放到R2中RLCAMOVR2,ACLRSCLDJNZR0,RLP;没有读完8位数据转RLPRET;读完8位数据返回;START信号子程序STAR0:SETBSCL;置时钟信号SCL为高SETBSDA;置数据信号SDA为高NOP;NOP为满足I2C协议所需的等待时间NOPCLRSDA;使数据信号SDA为低NOP;NOP为满足I2C协议所需的等待时间NOPCLRSCL;使时钟信号SCL为低RET;主机发送应答位子程序MACK:CLRSDA;使数据信号SDA为低SETBSCL;置时钟信号SCL为高NOP;NOP为满足I2C协议所需的等待时间NOPCLRSCL;使时钟信号SCL为低SETBSDA;置数据信号SDA为高RET;主机发送非应答位子程序MNACK:SETBSDA;置数据信号SDA为高SETBSCL;置时钟信号SCL为高NOP;NOP为满足I2C协议所需的等待时间NOPCLRSCL;使时钟信号SCL为低CLRSDA;使数据信号SDA为低RET;应答位检测子程序,F0=0表示收到了正常应答;F0=1表示收到非正常应答CACK:SETBSDA;置数据信号SDA为高,以便接收数据SETBSCL;置时钟信号SCL为高CLRF0;默认为正常应答JNBSDA,CEND;正常应答转CENDSETBF0;置错误应答标志CEND:CLRSCL;使时钟信号SCL为低NOP;NOP为满足I2C协议所需的等待时间NOPRET;STOP信号子程序STOP:CLRSDA;使数据信号SDA为低SETBSCL;置时钟信号SCL为高NOP;NOP为满足I2C协议所需的等待时间NOPSETBSDA;置数据信号SDA为高NOP;NOP为满足I2C协议所需的等待时间NOPCLRSCL;使时钟信号SCL为低RET;延时20ms,使用了R6、R7DELAY1:MOVR7,#250L1:M
本文标题:单片机课程设计――温度测控系统程序
链接地址:https://www.777doc.com/doc-4130022 .html