51单片机的多路温度采集系统程序
单片机数字式多路温度采集系统设计(原理图+电路板图+源程序)论文

单片机数字式多路温度采集系统设计(原理图+电路板图+源程序)-论文单片机数字式多路温度采集系统设计(原理图+电路板图+源程序)目录1综述 12数字式多路温度采集系统硬件电路设计 22.1温度采集电路设计 2简介 2温度采集电路结构 52.2单片机控制电路设计 6单片机芯片选择 6单片机工作基本电路设计 62.3输入控制电路设计 72.4显示电路设计 8数码显示管静态显示工作原理 8显示电路结构 9显示电路工作过程 92.5报警控制电路设计 9报警控制电路结构 10报警控制电路工作过程 102.6电源电路设计 102.7数字式多路温度采集系统元件清单 112.8数字式多路温度采集系统电路图 113数字式多路温度采集系统程序设计 123.1主程序设计 123.2子程序设计 12的通信协议 12子程序 133.3数字式多路温度采集系统控制源程序 164系统调试及性能分析 174.1系统调试 174.2系统性能分析 175结束语 18参考文献 19致谢 20附录 21附录(1)数字式多路温度采集系统元件清单 21附录(2)数字式多路温度采集系统原理图 22附录(3)数字式多路温度采集系统印刷电路板图 23附录(4)数字式多路温度采集系统控制源程序 24摘要数字式多路温度采集系统由主控制器、温度采集电路、温度显示电路、报警控制电路及键盘输入控制电路组成。
它利用单片机AT89C51做控制本文源自六维论文网及数据处理器、智能温度传感器DS18B20做温度检测器、LED数码显示管做温度显示输出设备。
硬件电路比较简单,成本较低,测温范围大,测量精度高,读数显示直观,使用方便。
关键词:数字;温度;传感器;单片机;控制Abstractthe digital multi-channel temperature gathering system by the master control regulator, the temperature gathering electric circuit, the temperature display circuit, reports to the police the control circuit and the keyboard entry control circuit is composed .It makes the control and the data processor, intelligent temperature sensor DS18B20 using monolithic integrated circuit AT89C51 makes the temperature detector, the LED numerical code display tube makes the temperature demonstration output unit. The hardware electric circuit quite is simple, the cost is low, the temperature measurement scope is big, and the measuring accuracy is high, reading demonstration is direct-viewing, easy to operate.Key words: numeral; temperature; sensor; monolithic integrated circuit; control1综述温度是一种最基本的环境参数,人们的生活与环境温度息息相关,因此研究温度的测量方法和装置具有重要的意义。
ds18b20多路温度采集程序

本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
亲测,更改端口即可使用。
(主要器件:51单片机,ds18b20,lcd 显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;uchar lcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}, {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd {delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;j--){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tmstart()//初始化ds18b20 {sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat(' ');if(tvalue>warnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e);wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625; tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数*//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数*//***************************************************/ void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 *//***************************************************/ void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数*//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数*//***************************************************/ uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数*//***************************************************/ void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom()/* 功能:向LCD写入命令*//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P3= com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据*//***********************************************/void LCD_WriteData(uchar dat)rs = 1; //选择LCD为写入数据状态lcden = 0;P3= dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() *//* 功能:初始化LCD,设定LCD的初始状态*//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//**//* 显示18B20序列号*//*/**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30);//取ASCII码elseLCD_WriteData(h+0x37);//取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。
51单片机多点温度采集系统程序清单

#include <AT89X52.h>#include <Intrins.h>#define DATA P1 //1602驱动端口//ROM操作命令#define READ_ROM 0x33 //读ROM#define SKIP_ROM 0xCC //跳过ROM#define MATCH_ROM 0x55 //匹配ROM#define SEARCH_ROM 0xF0 //搜索ROM#define ALARM_SEARCH 0xEC //告警搜索//存储器操作命令#define ANEW_MOVE 0xB8 //重新调出E^2数据#define READ_POWER 0xB4 //读电源#define TEMP_SWITCH 0x44 //启动温度变换#define READ_MEMORY 0xBE //读暂存存储器#define COPY_MEMORY 0x48 //复制暂存存储器#define WRITE_MEMORY 0x4E //写暂存存储器//数据存储结构typedef struct tagTempData{unsigned char btThird; //百位数据unsigned char btSecond; //十位数据unsigned char btFirst; //个位数据unsigned char btDecimal; //小数点后一位数据unsigned char btNegative; //是否为负数}TEMPDATA;TEMPDATA m_TempData;//引脚定义sbit DQ = P2^7; //数据线端口sbit RS= P2^0;sbit RW= P2^1;sbit E= P2^2;//DS18B20序列号,通过调用GetROMSequence()函数在P1口读出(读8次)const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7};const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E};//U2const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9};//U3const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0};//U4const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52};//U5const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65};//U6const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C};//U7const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B};//U8//判断忙指令void Busy(){DATA = 0xff;RS = 0;RW = 1;while(DATA & 0x80){E = 0;E = 1;}}//写指令程序void WriteCommand(unsigned char btCommand) {Busy();RS = 0;RW = 0;E = 1;DATA = btCommand;E = 0;}//写数据程序void WriteData(unsigned char btData){Busy();RS = 1;RW = 0;E = 1;DATA = btData;E = 0;}void Clear(){WriteCommand(1);}//初始化void Init(){WriteCommand(0x0c); //开显示,无光标显示WriteCommand(0x06); //文字不动,光标自动右移WriteCommand(0x38); //设置显示模式:8位2行5x7点阵}//显示单个字符void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber) {if (bRow) WriteCommand(0xc0 + btColumn);else WriteCommand(0x80 + btColumn);if (bIsNumber) WriteData(btData + 0x30);else WriteData(btData);}//显示字符串函数void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData) {while (*pData != '\0'){if (bRow) WriteCommand(0xc0 + btColumn);//显示在第1行else WriteCommand(0x80 + btColumn); //显示在第0行WriteData(*(pData++)); //要显示的数据btColumn++; //列数加一}}//延时16us子函数void Delay16us(){unsigned char a;for (a = 0; a < 4; a++);}//延时60us子函数void Delay60us(){unsigned char a;for (a = 0; a < 18; a++);}//延时480us子函数void Delay480us(){unsigned char a;for (a = 0; a < 158; a++); }//延时240us子函数void Delay240us(){unsigned char a;for (a = 0; a < 78; a++); }//延时500ms子函数void Delay500ms(){unsigned char a, b, c;for (a = 0; a < 250; a++)for (b = 0; b < 3; b++)for (c = 0; c < 220; c++);}//芯片初始化void Initialization(){while(1){DQ = 0;Delay480us(); //延时480usDQ = 1;Delay60us(); //延时60usif(!DQ) //收到ds18b20的应答信号{DQ = 1;Delay240us(); //延时240usbreak;}}}//写一个字节(从低位开始写)void WriteByte(unsigned char btData){unsigned char i, btBuffer;for (i = 0; i < 8; i++){btBuffer = btData >> i;if (btBuffer & 1){DQ = 0;_nop_();_nop_();DQ = 1;Delay60us();}else{DQ = 0;Delay60us();DQ = 1;}}}//读一个字节(从低位开始读) unsigned char ReadByte(){unsigned char i, btDest;for (i = 0; i < 8; i++){btDest >>= 1;DQ = 0;_nop_();_nop_();DQ = 1;Delay16us();if (DQ) btDest |= 0x80;Delay60us();}return btDest;}//序列号匹配void MatchROM(const unsigned char *pMatchData) {unsigned char i;Initialization();WriteByte(MATCH_ROM);for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i)); }//得到64位ROM序列(在P1口显示,必须与Proteus联调且在单步调试下才能得到) /*void GetROMSequence(){unsigned char i;Initialization();WriteByte(READ_ROM);for (i = 0; i < 8; i++)P1 = ReadByte();}*///读取温度值TEMPDATA ReadTemperature(){TEMPDATA TempData;unsigned int iTempDataH;unsigned char btDot, iTempDataL;static unsigned char i = 0;TempData.btNegative = 0; //为0温度为正i++;if (i == 9) i = 1;Initialization();WriteByte(SKIP_ROM); //跳过ROM匹配WriteByte(TEMP_SWITCH); //启动转换Delay500ms(); //调用一次就行Delay500ms();Initialization();//多个芯片的时候用MatchROM(ROMData)换掉WriteByte(SKIP_ROM)switch (i){case 1 : MatchROM(ROMData1); break; //匹配1case 2 : MatchROM(ROMData2); break; //匹配2case 3 : MatchROM(ROMData3); break; //匹配3case 4 : MatchROM(ROMData4); break; //匹配4case 5 : MatchROM(ROMData5); break; //匹配5case 6 : MatchROM(ROMData6); break; //匹配6case 7 : MatchROM(ROMData7); break; //匹配7case 8 : MatchROM(ROMData8); break; //匹配8}//WriteByte(SKIP_ROM); //跳过ROM匹配(单个芯片时用这句换掉上面的switch)WriteByte(READ_MEMORY); //读数据iTempDataL = ReadByte();iTempDataH = ReadByte();iTempDataH <<= 8;iTempDataH |= iTempDataL;if (iTempDataH & 0x8000){TempData.btNegative = 1;iTempDataH = ~iTempDataH + 1; //负数求补}//为了省去浮点运算带来的开销,而采用整数和小数部分分开处理的方法(没有四舍五入)btDot = (unsigned char)(iTempDataH & 0x000F); //得到小数部分iTempDataH >>= 4; //得到整数部分btDot *= 5; //btDot*10/16得到转换后的小数数据btDot >>= 3;//数据处理TempData.btThird = (unsigned char)iTempDataH / 100;TempData.btSecond = (unsigned char)iTempDataH % 100 / 10;TempData.btFirst = (unsigned char)iTempDataH % 10;TempData.btDecimal = btDot;return TempData;}//数据处理子程序void DataProcess(){m_TempData = ReadTemperature();if (m_TempData.btNegative) DisplayOne(1, 6, '-', 0);else DisplayOne(1, 6, m_TempData.btThird, 1);DisplayOne(1, 7, m_TempData.btSecond, 1);DisplayOne(1, 8, m_TempData.btFirst, 1);DisplayOne(1, 10, m_TempData.btDecimal, 1);}void main(){//GetROMSequence();Clear();Init();DisplayString(0, 0, " Temperature");DisplayOne(1, 9, '.', 0);while (1) DataProcess();}。
基于mcs-51单片机的温度采集系统课程设计

基于mcs-51单片机的温度采集系统课程设计温度采集系统课程设计是一种基于mcs-51单片机的温度测量和数据采集系统的设计和实现。
本文将详细介绍这个系统的设计过程和实际应用。
通过对温度测量的理解和市场需求的调查,我们确定了设计一个基于mcs-51单片机的温度采集系统的目标。
该系统需要能够准确测量环境温度,并将数据通过串行通信传输给上位机,以便进行进一步处理和分析。
接下来,我们开始准备所需的硬件设备和软件工具。
硬件方面,我们需要mcs-51单片机主板、温度传感器和相关的电路元件。
软件方面,我们使用Keil C51开发环境进行程序开发,并使用串行通信协议来实现与上位机的数据传输。
然后,我们开始进行电路设计和硬件连接。
首先,我们将温度传感器连接到mcs-51单片机的模拟输入引脚上,并根据传感器的特性和电路设计要求,选择合适的电路元件。
接下来,我们连接mcs-51单片机到串行通信模块,以便与上位机进行数据交流。
接下来,我们开始进行软件设计和程序开发。
首先,我们编写mcs-51单片机的嵌入式程序,用于读取温度传感器的数据,并将其转换为可读取的数字形式。
然后,我们编写程序来实现与上位机的串行通信协议,以便将温度数据传输给上位机。
在程序开发过程中,我们还可以实现一些额外的功能,以增加系统的灵活性和可扩展性。
例如,我们可以设置温度阈值,在温度超过设定值时触发报警功能。
我们还可以添加LCD显示屏,以便在单片机上直接显示温度数据。
我们进行测试和调试,以确保系统的正常运行。
我们可以使用模拟信号发生器模拟不同的温度值,并使用上位机软件来验证系统是否准确地读取和传输这些值。
如果有任何问题,我们可以检查硬件连接和程序代码,并进行相应的修复和调整。
综上所述,基于mcs-51单片机的温度采集系统是一个很有实际应用价值的课程设计。
通过这个设计过程,我们不仅可以学习和掌握嵌入式系统的开发和应用,还可以了解和实践温度测量和数据采集的原理和方法。
51单片机温度采集报告

目录1.摘要-----------------------------------------------32.前言-----------------------------------------------43.正文-----------------------------------------------54.结论----------------------------------------------195.参考文献------------------------------------------196.附录----------------------------------------------19一、摘要此系统主要以AD1674模数转换器和AT89C51单片机为核心,进行实时温度数据采集,数据处理和显示,终端接收及存储。
具体包括控制、显示、A/D转化器等。
设计中用AD1674进行温度的采样,利用51单片机的串行口进行发送和接收数据。
利用8个LCD数码管进行显示数据处理。
采用PROTEUS和Keil uvision3为开发工具,软件设计采用模块化编程关键字:AT89C51、温度采集、AD1674、双机通讯二、前言随着计算机技术的飞速发展,数据采集系统应用在多个领域中。
数据采集时供、农业控制系统中十分重要的环节,在医药、化工、食品等领域中,往往需要随时检测各生产环节的温度、流量、压力等参数。
同时,还要对某一检测点任意参数能够进行随机查寻,将其在某一段时间内检测得到的数据经过转换提取出来,以便进行比较,做出决策,调整控制方案,以提高产品的合格率,产生良好的经济效益。
不仅如此,数据采集系统在我国高科技领域中也扮演着十分重要的地位。
雷达的实时数据采集,航天飞机成功升空,通讯卫星的实时通报数据,这些高科技给国家人民的生活带来了便利。
因此数据采集是一项十分重要的技术。
从严格意义上来讲,数据采集系统是用计算机控制的多路自动检测或巡回检测,并且能够对采集到的数据进行存储、计算、分析,以及从数据中提取可用的信息,供显示,记录、打印或描绘的系统。
最新51单片机的多路温度采集控制系统设计汇总

51单片机的多路温度采集控制系统设计基于51单片机的多路温度采集控制系统设计言:随着现代信息技术的飞速发展,温度测量控制系统在工业、农业及人们的日常生活中扮演着一个越来越重要的角色,它对人们的生活具有很大的影响,所以温度采集控制系统的设计与研究有十分重要的意义。
本次设计的目的在于学习基于51单片机的多路温度采集控制系统设计的基本流程。
本设计采用单片机作为数据处理与控制单元,为了进行数据处理,单片机控制数字温度传感器,把温度信号通过单总线从数字温度传感器传递到单片机上。
单片机数据处理之后,发出控制信息改变报警和控制执行模块的状态,同时将当前温度信息发送到LED进行显示。
本系统可以实现多路温度信号采集与显示,可以使用按键来设置温度限定值,通过进行温度数据的运算处理,发出控制信号达到控制蜂鸣器和继电器的目的。
我所采用的控制芯片为AT89c51,此芯片功能较为强大,能够满足设计要求。
通过对电路的设计,对芯片的外围扩展,来达到对某一车间温度的控制和调节功能。
关键词:温度多路温度采集驱动电路正文:1、温度控制器电路设计本电路由89C51单片机温度传感器、模数转换器ADC0809、窜入并出移位寄存器74LS164、数码管、和LED显示电路等组成。
由热敏电阻温度传感器测量环境温度,将其电压值送入ADC0809的IN0通道进行模数转换,转换所得的数字量由数据端D7-D0输出到89C51的P0口,经软件处理后将测量的温度值经单片机的RXD端窜行输出到74LS164,经74LS164 窜并转换后,输出到数码管的7个显示段,用数字形式显示出当前的温度值。
89C51的P2.0、P2.1、P2.2分别接入ADC0809通道地址选择端A、B、C,因此ADC0809的IN0通道的地址为F0FFH。
输出驱动控制信号由p1.0输出,4个LED 为状态指示,其中,LED1为输出驱动指示,LED2为温度正常指示,LED3为高于上限温度指示,LED4为低于下限温度指示。
毕业设计_基于AT89C51单片机为核心的多路温度采集系统电路设计

Abstract
This design is proposed based onAT89C51microcontroller as the core of the temperature control system and its digital single-bus technology used inthe design of the greenhouse temperature measurement system. Program uses a new type of digital temperature sensor DS18B20, use DS18B20 temperature sensor embedded inside the greenhouse temperature, transformed into the current changes, and thenaconverted to voltage input ADC, the bus passed through the singleAT89C51comicic-rocontrollerAT89C51microcontroller input and output through the serial port tounat-e with the PC machine.System for real-time multi-point inspection of temperature,w-hile providing instruction based on the temperature of PC-time acquisition.Tempsen-sor for temperature DS18B2collection, microcontroller reads the message from theD-S18B20 temperature and with the effective temperature of the upper and lowerextm-comparison, if more than the effective temperature range, start alarm system, and to the PC, send the appropriate signals, or continue to read from the DS18B20temper- rure. The system has a practical and high reliability。
基于51单片机和Labview的多路温度采集系统

干货联盟原理图外接USB转TTL线最小系统传感器程序/*************************此部分为18B20的驱动程序*************************************/#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7;#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/void TempDelay (unsigned char idata us);void Init18b20 (void);void WriteByte (unsigned char idata wr); //单字节写入void read_bytes (unsigned char idata j);unsigned char CRC (unsigned char j);void GemTemp (void);void Config18b20 (void);void ReadID (void);void TemperatuerResult(void);bit flag;unsigned int idata Temperature;unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID 为8字节unsigned char idata id_buff[8];unsigned char idata *p,TIM;unsigned char idata crc_data;unsigned char code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (unsigned char idata us){while(us--);}/************************************************************ *Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/ void Init18b20 (void){D18B20=1;_nop_();D18B20=0;TempDelay(75); //delay 530 uS//80 _nop_();D18B20=1;TempDelay(12); //delay 100 uS//14 _nop_();_nop_();_nop_();if(D18B20==0)flag = 1; //detect 1820 success! elseflag = 0; //detect 1820 fail!TempDelay(18); //20_nop_();_nop_();D18B20 = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/ void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 0;_nop_();D18B20=wr&0x01;TempDelay(2); //delay 45 uS //3_nop_();_nop_();D18B20=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 0;u >>= 1;D18B20 = 1;if(D18B20==1)u |= 0x80;TempDelay (2);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (unsigned char idata j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ unsigned char CRC (unsigned char j){unsigned char idata i,crc_data=0;for(i=0;i<j;i++) //查表校验crc_data = CrcTable[crc_data^temp_buff[i]];return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}void GetT emp(){if(TIM==100) //每隔1000ms 读取温度{ TIM=0;TemperatuerResult();}}/************************************* [ t1 (10ms)中断] 中断*************************************/ void timer1() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;TIM++;}} Labview界面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机的多路温度采集系统程序ORG 0000HAJMP MAIN;BUF EQU 40H ;显示缓冲区MOTATA EQU 50H ;AD0809数据存放于此WH EQU 48H ;温度上限数据存放区WL EQU 58H ;温度下限数据存放区BUFF1S EQU 38H;BUFF1MS EQU 39H;BUFF5S EQU 3AH;INNAL EQU 3CH;ALARMBUF EQU 33HBUFFH EQU 31H ;八路LED报警信号红灯BUFFL EQU 32H ;八路LED报警信号绿灯BACK EQU 34H ;利用与BUF地址的重复修改路数CHANNEL EQU 35HTEMPBUF EQU 36HREAD_AD BIT 30H ;是否要读写AD0809的标志位DISPIN BIT 31H;SETWARN BIT 32HSOLIDISP BIT 33HENTER BIT P1.2SETH BIT 35HSETL BIT 36HSETIN BIT P1.3ABYTEIN BIT p1.1ORG 0003HAJMP INT_0;ORG 000BHLJMP INT_T0ORG 0100HMAIN: MOV SP, #70H ;设置堆栈位置SETB READ_AD ;初始化标志位SETB EA ;开总中断CLR SETWARN ;清除温度设置标志位SETB SETIN ;当其为0时表示要进行通道数采集LCALL INITWARN ;初始化温度上下限LCALL INIT_2 ;初始化2#工作寄存器区;主循环,启动ADC0809,从第一个通道开始读取LOOP: JNB READ_AD,DIS ;若不读AD0809,则调显示,次标志位也表示1s延时结束;延时已完毕,则计算要显示的温度路数及温度值送缓冲区LCALL WARN ;报警CLR READ_AD ;清楚标志位LCALL READ ;读取一次AD0809LCALL DLY1MS ;此处加1ms的延时,否则数码管会因中断的存在而产生闪动 LCALL ADJUST ;调整显示;在此完成键盘检测及显示任务DIS: LCALL DISPLAY;LCALL KEYCHK ;调键盘检测子程序CJNE A,#0FFH, AKEY ;若有键按下,则跳转LJMP LOOP ;若没有则循环AKEY: LCALL KEYFUNC;CJNE A,#0FFH,CALLRPD ;验证按下的键是否为数字键,若是则处理输入LJMP LOOP ;不为数字键则返回循环CALLRPD: LCALL KEYRPD;SJMP LOOP;;*********初始化2#工作寄存器区************INIT_2: PUSH PSW ;初始化2号工作寄存器区SETB RS1;CLR RS0 ;选择2号工作寄存器区MOV R2, #00H ;存放要显示的路数CLR DISPIN ;初始化路显示标志位;MOV R0, #MOTATA ;R0充当指向MOTATA的指针POP PSW;RET;;*******调整指针*********PADJUST:ONADJUST: DJNZ R2,INADJUST;RET;返回INADJUST: INC R0;SJMP ONADJUST;;*************计算并调整显示缓存区的数据*******ADJUST: PUSH PSW ;保护SETB RS1;CLR RS0 ;选择2号工作寄存器区CJNE R2,#08H,NE08;GE08: MOV R2,#00H;MOV R0,#MOTATA;SJMP LESS08;NE08: JNC GE08;LESS08: JB SETWARN, DISPWARN ;若在设定温度,则也不调整显示JB SOLIDISP, ADJEND ;若为固定显示,则跳过调整JB DISPIN,DLY_5S ;若有键盘值输入,则延时5秒来暂时固定显示INC R0 ;调整R0,使其指向下一个要显示的温度值地址 INC R2 ;调整R2mov channel,r2;SJMP ADJEND;DLY_5S: DJNZ BUFF5S,ADJEND;CLR DISPIN;LJMP ADJENDDISPWARN: JB SETH,DISHIGH ;若在调整上限值则跳转到上限温度显示JB SETL,DISLOW ;若在调整下限值则跳转到下限温度显示SJMP ADJEND ;若不在调整则显示输入路数的当前检测温度值DISLOW: MOV R0,#WL ;将指针调整到温度上限存放区SJMP ADAPT ;跳转到指针调整处DISHIGH:MOV R0,#WH ;将指针调整到温度下限存放区ADAPT: MOV R2,CHANNEL ;调整R2的值为通道数LCALL PADJUST ;指针指向R2 ADJEND: LCALL LOADTEMP ;将当前指针指向数据放到缓冲区POP PSW;RET;;**************** 将当前指针指向数据放到缓冲区******** LOADTEMP: LCALL COMPUTE ;调用COMPUTE得到要显示的当前温度值MOV R1,#BUF;MOV A,channel;MOV @R1,A ;将路数送入显示缓冲区INC R1 ;调整到要显示温度值的缓冲区JB SETH,DISPH ;若设定温度上限,则显示HJB SETL,DISPL ;若设定温度下限,则显示LMov a,#10h ;消隐SJMP DISP2DISPH: MOV A,#11HSJMP DISP2DISPL: MOV A,#12HDISP2: mov @r1,a;INC R1;MOV A,R5;ANL A,#0FH;MOV @R1,A ; 最低位 INC R1;MOV A,R5;ANL A,#0F0H;SWAP A;MOV @R1,A ;次低位 ,应当在此处添加小数点INC R1;MOV A,R4;ANL A,#0FH;MOV @R1,A ;次高位 INC R1;MOV A,R4;ANL A,#0F0H;SWAP A;MOV @R1,A ;最高位RET;;*************读取一次0809的内容***********READ: MOV R6,#08H ;用中断的方式读取一次AD0809MOV R0,#MOTATA ;0号工作寄存器区MOV DPTR,#0FFFEH ;A0作为地址MOV A,#00H ;表示先检测第一个通道MOV INNAL,A ;将检测的路数保存MOVX @DPTR,A ;开启ADC0809 SETB EX0 ;开外部中断0RET ;若已读取完毕,则返回;**********************显示子程序************;要显示的数据入口为BUF(6位);1号工作寄存器区DISPLAY: PUSH PSW ;压栈保护SETB RS0;CLR RS1 ;切换工作寄存器区到 1MOV R0,#BUFMOV R7,#06HMOV R1,#01HNEXTDIS: MOV A,@R0MOV DPTR,#TABLEMOVC A,@A+DPTR ;取段码CJNE R7,#03H,NODIP ;显示小数点ANL A,#07FHNODIP: MOV DPTR,#0FFDCHMOVX @DPTR,A ;送段码MOV DPTR,#0FFDDHMOV A,R1MOVX @DPTR,A ;送位码RL AMOV R1,ALCALL DLY1MSINC R0 ;调整显示DJNZ R7,NEXTDIS;POP PSW;RET;**************************延时1ms****************************DLY1MS: MOV BUFF1MS,#0F9HDJNZ BUFF1MS,$RET;*************************按键检查子程序******************** KEYCHK:MOV A,#00H ;查看是否有键按下MOV DPTR,#0FFDDHMOVX @DPTR,AMOV DPTR,#0FFDEHMOVX A,@DPTRCPL AANL A,#0FHJNZ TEST ;若有键按下则检测,无则返回。
MOV A,#0FFHRETTEST: LCALL KEYTESTLCALL DISPLAYLCALL KEYTESTCJNE A,BACK,NOKEYDWAIT: LCALL DISPLAY;MOV A,#00H ;等待键抬起MOV DPTR,#0FFDDHMOVX @DPTR,AMOV DPTR,#0FFDEHMOVX A,@DPTRCPL AANL A,#0FHJNZ WAIT ;若键未抬起,则继续等待MOV A,BACK ;将检测到的键值送给ASJMP CHKENDNOKEYD: MOV A,#0FFHCHKEND: RET;**********************按键检测子程序******************** KEYTEST: MOV R0,#0FEHMOV R1,#00HMOV R2,#08HNEXTL: MOV A,R0MOV DPTR,#0FFDDHMOVX @DPTR,AMOV DPTR,#0FFDEHMOVX A,@DPTRCPL AANL A,#0FHJNZ KEYDWN ;看按下的键是否在当前列DJNZ R2,GOSCAN ;看是否扫描完毕,若没有则调整继续扫描SJMP TSTEND ;若扫描完毕,则返回。
GOSCAN: MOV A,R0RL AMOV R0,AINC R1SJMP NEXTLKEYDWN: MOV R3,#00HLL0: RRC AJC LL1INC R3SJMP LL0LL1: MOV A,R3MOV B,AMUL ABADD A,R1 ;A中返回的为按下的键的代码RETTSTEND: MOV A,#0FFHRET;***********延时1s*******************DLY_1S: MOV TMOD,#01H;SETB ET0;MOV TH0,#0F0H ;10msMOV TL0,#0D8H;MOV buff1s,#100;SETB TR0;RET;;*********定时器T0中断服务程序**********INT_T0:CLR TR0 ;关计数器DJNZ buff1s ;NEXT_10MS;若不到1s继续SETB READ_AD;若到了,则置标志位cpl p1.0;clr et0;SJMP T0_END;NEXT_10MS: MOV TMOD,#01HMOV TH0,#0F0H ;定时10msMOV TL0,#0D8HSETB TR0T0_END: RETI;*************计算子程序,完成一路计算**************** COMPUTE: MOV A,@R0;MOV B,#04H ;测得的温度数乘以4MUL AB;MOV R6,B;MOV R7,A;LCALL HB2 ;调用子程序转化为压缩BCD码,R4,R5为出口RET;HB2: CLR ;BCD码初始化MOV R4,AMOV R5,AMOV R3,#10H ;转换双字节十六进制整数HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5 ;BCD码带进位自身相加,相当于乘2ADDC A,R5DA A ;十进制调整MOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,ADJNZ R3,HB3 ;处理完16bitRET;;********报警子程序*********WARN: MOV R0,#MOTATA ;R0指向MOTATAMOV R1,#WH ; R1指向WHMOV R7,#08H ;R7为循环次数WLOOP:MOV A,@R0MOV ALARMBUF,@R1 ;与指令相适应的必要中转CJNE A,ALARMBUF,REDGEHIGH: CLR C ;红灯信号LJMP NEXTREDRED : JNC GEHIGH ;读入数值比预设大SETB CNEXTRED:MOV A,BUFFHRLC A ;压入红灯信号MOV BUFFH,AMOV A,R1 ;调整R1指向WLADD A,#10HMOV R1,AMOV ALARMBUF,@R1MOV A,@R0CJNE A,ALARMBUF,GREENLSLOW: CLR C ;绿灯信号LJMP NEXTGRNGREEN: JC LSLOW ;读入数值比预设小SETB CNEXTGRN:MOV A,BUFFLRLC AMOV BUFFL,AMOV A,R1SUBB A,#10HMOV R1,AINC R1INC R0DJNZ R7,WLOOPMOV A,BUFFH ;将红灯报警信息送出MOV DPTR,#0FBFFH ;红灯信号对应地址p2.2MOVX @DPTR,AMOV A,BUFFL ;将绿灯报警信息送出MOV DPTR,#0F7FFH ;绿灯信号对应地址p2.3MOVX @DPTR,ARET;************键位调整程序************KEYFUNC: MOV DPTR,#KEYTABLEANL A,#0FH ;消除键位干扰MOVC A,@A+DPTR ;调整跳转位置CJNE A,#0AH,K1MOV A,#0FFHSETB SETINSETB SETH ;表示要设定温度报警上限值 CLR SETLRET;K1: CJNE A,#04H,K2MOV A,#0FFHSETB SETINSETB SETL ;表示要设定温度报警下限值 CLR SETHRETK2: CJNE A,#0FH,K3MOV A,#0FFHJB SETWARN,ENDISPSETB SETWARNCLR ABYTEINCLR SETHCLR SETLCLR ENTERRETENDISP: CLR SETWARN;CLR SETH;CLR SETL;RET;K3: CJNE A,#0EH,K4MOV A,#0FFHJB SOLIDISP,ENSOLID;SETB SOLIDISPRETENSOLID: CLR SOLIDISPRETK4: CJNE A,#0CH,K5MOV A,#0FFH;CLR SETIN;CLR SETH;CLR SETL;RET;K5: CJNE A,#0DH,K6MOV A,#0FFHSETB ENTERRET;K6: RETKEYTABLE: db 07h,04h,08h,05h,09h,06,0Ah; 0, 1 ,2 ,3 ,4 ,5 ,6db 04h,01h,00h,02h,0Fh,03h,0Eh,0Ch,0Dh; 7 ,8 ,9 ,10 ,11,12, 13, 14 ,15;*********实现对各个设定键的响应**********KEYRPD: JB SETWARN,WARNSET ;根据SOLIDISP的值调显示PUSH PSW;SETB RS1;CLR RS0 ;选择2号工作寄存器区MOV R0,#MOTATA;MOV CHANNEL,A ;将读入的值放入通道缓冲MOV R2,A;MOV BACK,A;MOV BUF,A;LCALL PADJUST ;调整R0,使其指向R2通道的温度值 SETB DISPIN ;5s计时的标志位MOV BUFF5S,#05H ;初始化5s计时MOV R2,CHANNEL;POP PSW;RET ;调整完毕,返回WARNSET:JNB SETIN,INSET ;若未设定通道,先进行设定LJMP SETTEMP ;若已设定则跳转到温度设定处INSET: MOV CHANNEL,ARETSETTEMP:JB SETH,HIGHSET ;设定温度警告上限JB SETL,LOWSET ;设定温度警告下限RETHIGHSET: LCALL READTEMPMOV R0,#WH ;调整R0使其指向温度上限存储区LJMP STORESETLOWSET: LCALL READTEMPMOV R0,#WL ; 调整R0使其指向温度下限存储区STORESET:MOV A ,TEMPBUF;LCALL COMPACT ;将输入的数转化为16进制数存储(未改变R0)MOV R2,CHANNEL ;送入要调整到的位置LCALL PADJUST ;调用调整子程序MOV @R0 ,A ; 将温度值送到相应的位置RETREADTEMP: JB ABYTEIN,READLOW;若已经有一位读入则读取低位READHIGH: SWAP A;MOV TEMPBUF,A;SETB ABYTEIN;RET;READLOW: ORL A,TEMPBUF;MOV TEMPBUF,A;CLR ABYTEIN;RET;;**********将输入温度值转化为16进制数********** COMPACT: MOV R2,A;ANL A,#0FH ;分离出十进制数的低位SWAP A;MOV R3,A;MOV A,R2;ANL A,#0F0H ;分离出十进制数的高位SWAP A;MOV R2,A;LCALL BH2 ;将双字节BCD码转化为十六进制整数MOV A,R2 ;将R2R3中的数除以4CLR C;RRC A;MOV R2,A;MOV A,R3;RRC A;MOV R3,AMOV A,R2;RRC A;MOV A,R3RRC A ;转换完毕A中为要得到的16进制数RET;;*********双字节BCD码整数转换成双字节十六进制整数********* BH2: MOV A,R3 ;将低字节转换成十六进制LCALL BCDHMOV R3,AMOV A,R2 ;将高字节转换成十六进制LCALL BCDHMOV B,#100 ;扩大一百倍MUL ABADD A,R3 ;和低字节按十六进制相加MOV R3,ACLR AADDC A,BMOV R2,ARET;*******单字节BCD码整数转换成单字节十六进制整数BCDH: MOV B,#10H ;分离十位和个位DIV ABMOV R4,B ;暂存个位MOV B,#10 ;将十位转换成十六进制MUL ABADD A,R4 ;按十六进制加上个位RET;********初始化WH和WL********INITWARN: MOV R0,#WH;MOV A,#0AFH;MOV R7,#08H;INITHIGH: MOV @R0,A;DJNZ R7,HIGHINC;SJMP ENDHIGH;HIGHINC: INC R0;SJMP INITHIGH;ENDHIGH: MOV R0,#WL;MOV A,#04BH;MOV R7,#08H;INITLOW: MOV @R0,A;DJNZ R7,LOWINC;SJMP ENDLOW;LOWINC: INC R0;SJMP INITLOW;ENDLOW: RET;;***********外部中断0的服务程序**********;完成一个循环的数据读取INT_0: CLR EX0 ; 若转换完毕关中断MOV DPTR,#0FFFEH;MOVX A,@DPTR ;读取转换完毕后的数MOV @R0,A ;将转换完毕的数保存DJNZ R6,READNEXT;若未读取完毕则调整后继续LCALL DLY_1S;SJMP EX0_END;READNEXT: INC R0;INC INNAL;MOV A,INNAL;MOVX @DPTR,A ;再次启动AD0809SETB EX0 ;开外部中断0EX0_END: RETI;TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EHDB 0FFH,089H,0C7H;END。