1、51单片机温度采集报告目录1. 摘要-32. 前言-43. 正文-54. 结论-195. 参考文献-196. 附录-19一、 摘要此系统主要以AD1674模数转换器和AT89C51单片机为核心,进行实时温度数据采集,数据处理和显示,终端接收及存储。具体包括控制、显示、A/D转化器等。设计中用AD1674进行温度的采样,利用51单片机的串行口进行发送和接收数据。利用8个LCD数码管进行显示数据处理。采用PROTEUS和Keil uvision3为开发工具,软件设计采用模块化编程关键字:AT89C51、温度采集、AD1674、双机通讯二、前言随着计算机技术的飞速发展,数据采集系统应用在多个领域中。
2、数据采集时供、农业控制系统中十分重要的环节,在医药、化工、食品等领域中,往往需要随时检测各生产环节的温度、流量、压力等参数。同时,还要对某一检测点任意参数能够进行随机查寻,将其在某一段时间内检测得到的数据经过转换提取出来,以便进行比较,做出决策,调整控制方案,以提高产品的合格率,产生良好的经济效益。不仅如此,数据采集系统在我国高科技领域中也扮演着十分重要的地位。雷达的实时数据采集,航天飞机成功升空,通讯卫星的实时通报数据,这些高科技给国家人民的生活带来了便利。因此数据采集是一项十分重要的技术。从严格意义上来讲,数据采集系统是用计算机控制的多路自动检测或巡回检测,并且能够对采集到的数据进行存储、
3、计算、分析,以及从数据中提取可用的信息,供显示,记录、打印或描绘的系统。数据采集系统通常由数据输入通道、数据处理、数据存储、数据显示、数据输出五个部分组成。输入通道实现对数据的检测并读取;数据转化是将采集到的数据进行适当的转化;以便输出人们易懂的数据;数据存储是对采集过来的数据进行存储;以防下次用到可以方便提取;数据显示便是将处理后的数据进行显示,让操作者可以方便读取采集到的信息,以便进行控制;数据输出就是将数据输送到打印机打印。本设计中对数据采集系统做了基本的研究。此次试验主要解决的是怎样进行多路数据采集并如何通过串行口发送数据实现双机通讯的。三、正文3.1、设计要求使用proteus作为开
4、发工具,完成双机通讯的温度采集功能:1、使用LM20温度传感器、AD1674模数转换器、AT89C51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5S)后通过串口发送到主机;2、使用AT89C51单片机、4位拨码开关、LED显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3S),之后显示接收地址与温度信息,当接收时间间隔超过6S未收到数据,系统报警;3.2、系统的组成及工作原理 此系统主要以AD1674与
5、80C51为中心,通过AD1674对LM20温度传感器采集数据,并将采集到的数据通过单片机串口传到另外一篇单片机中,并将其显示在数码管中。由于LM20采集到温度会改变,AD1674采集到的数据也会变化。需要利用定时器来控制数据的发送。而波特率是由人通过拨码开关来控制的。3.3、方案比较3.31.采样器方案比较:由于采样的最重要指标是:转化时间、转换精度。已知ADC转换芯片有8位,10位,12位,14位,最高的达到16位。位数不一样,导致处理速度,精度都不一样。AD1674是美国AD公司生产的12位逐次逼近式A/D转换器系列产品,它们转换精度高、速度快,内部设有时钟电路和参考电压源,其中AD16
6、74还在片内集成了采样保持器,转换速度也最快,是AD574和AD674的升级换代产品。但价格较高,适用于高精度快速采样系统中。 3.32.单片机控制ADC方案比较: 用单片机控制ADC通常有两种方式。一种是查询法,另外一种是中断控制法。查询法是单片机不断地对STS状态进行读取。当发现STS变化时,则单片机便对转化好的数据进行读取。中断控制法则是当ADC变换结束后向单片机发送中断请求,然后进入中断服务进行想干操作。 本次设计采用查询方法。3.33.显示方案比较:显示方法有动态显示与静态显示两种方法。动态显示需要对CPU时刻对显示器进行数据刷新,显示数据会有闪烁感,占用的CPU时间多。静态显示数据
7、稳定,但是接线复杂。这两种方法各有利弊,故当显示装置中有多个多段LED式,通常采用动态扫描驱动电路在该单片机系统中,使用7段LED显示器构成8位显示器,段选线控制显示的字符,位选线控制显示位的亮或暗。3.34.双机通信接口方案比较:由于此次设计是在PROTEUS上仿真的,因此不需要外加双机端口之间的诸如电平转换器、串行通信RS-232、RS-485.直接利用单片机串行接口相互连接发送便可。3.35.外部拨码开关的方案比较:由于通常都用switch开关来控制单片机,以便达到我们人所需要的条件。但在此次设计中,由于在PROTEUS软件中8个switch不仅占用空间,而且还不好控制,故选择dipsw
8、拨号开关,这个开关switch功能一样,但体积小,而且可以同时全部开,全部关,故选择dipsw开关。3.4、电路设计(图示)3.5、模块分析此系统中共用到的模块如下:ADC数据采集模块、发送机发送模块、接收机接收模块、LED数码管显示模块、传输速率处理模块。(1)ADC数据采集模块:在此模块中,主要是ADC采集数据是的时序处理,CE=1,CS=0,A0=0,RC=0,进行12位模数转换,STS由高电平变为低电平说明转换结束,单片机进行采集。(2)发送机发送模块:在此模块中,主要是查询法得知转换结束(STS由高电平变为低电平说明转换结束),将采集到数据进行一定处理后进行发送。(3)接收机接收模块
9、:与发射机对应,波特率要设置成与发射机波特率相同,而且也是在收到信号后进行数据处理。 并且调用显示功能。在此模块中,当RI=1,进入中断以后,要用软件清零。(4)LED数码管显示模块:在此模块中,主要是考虑将采集到的数据正确地显示处理,给操作者一个非常直观的界面。在这个模块中要处理的一个难题是:如何不让数码管跳动显示。软件实现过程主要控制好段选与位选,以及延时时间上的处理。(6)传输速率处理模块:在此模块中,主要处理波特率问题,即如何通过用户的要求,改变传输波特率,并且显示出来。3.42.小结:经简单理论分析,本系统数据采集核心采用AD1674模数转换器,单片机系统选用80C51构成的最小系统
10、,用LED动态显示采集到的数据,数据通过80C51串行端口传输,实现单片机与单片机之间的通信。3.6、实验流程图3.7、程序主体/*(1)温度采集、发送机数据处理、数据发送的程序如下:#include#include#define uchar unsigned char #define uint unsigned int#define addo (10.0/4095.0)/转换进率,12位精度(212-1=4095),满量程为10Vuint num; /计数次数/*管脚定义*/sbit STS = P20;sbit CS = P21;sbit A0 = P22;sbit CE = P23;sb
11、it RC = P24;/*毫秒延时函数*/void delay_ms(uint n) uint i; while(n-) for(i=0;i110;i+); /*读取AD1674转换结果*/uint AD1674_Read(void) uint temp; uchar temp1,temp2; CS = 1; CE = 0; /初始化,关闭数据采集 CS = 0; A0 = 0; RC = 0; CE = 1; /CE=1,CS=0,RC=0,A0=0启动12位温度转换 _nop_(); while(STS=1);/等待数据采集结束 CE = 0; /芯片使能关闭 RC = 1; A0 =
12、0; CE = 1; /CE=1,CS=0,RC=1,12/8=1,A0=0允许高八位数据并行输出 _nop_(); temp1 = P0;/读取转换结果的高八位 CE = 0;/芯片使能关闭 RC = 1; A0 = 1; CE = 1;/CE=1,CS=0,RC=1,12/8=0,A0=1允许低四位数据并行输出 _nop_(); temp2 = P0;/读取转换结果的低四位 temp = (temp14);/返回转换结果,右移四位是因为temp2为P0口的高四位/*数据发送*/void putbyte(uchar byte)/ 利用硬件串口方式2 发送一个字节数据 SBUF = byte;
13、/将要发送的数据送到发送缓冲区域,系统自动发送 while(!TI);/查询是否发送结束 当TI=1 代表发送结束 TI = 0;/清发送结束位方便下一次发送void init() TMOD=0x21;/定时器为方式2 TL1=0xFD; TH1=0xFD;/波特率为9.6K TH0 = (65536 - 50000) / 256; /装初值实现50ms TL0 = (65526 - 50000) % 256; TR0 = 1; /启动定时器0 TR1 = 1; /启动定时器1 ET0 = 1; /开定时器0 SM0 = 0; /方式2 SM1 = 1; RI = 0; TI = 0; REN
14、 = 1; EA = 1; /开总中断 ES = 1; /开串口中断 /设置波特率void set_bote(uchar temp) if(temp=1) TL1=0xE8; TH1=0xE8;/波特率为1.2k else if(temp=2) TL1=0xF4; TH1=0xF4;/波特率为2.4K else if(temp=4) TL1=0xFA; TH1=0xFA;/波特率为4.8K else if(temp=8) TL1=0xFD; TH1=0xFD;/波特率为9.6K /*主函数*/void main(void) int temp,temp1; uchar a, temp2; uch
15、ar j; init(); /*查询法接收波特率*/ while(1) if(RI = 1) temp = SBUF; set_bote(temp);/设置波特率 break; while(1) while(num=160); /num计数100实现8秒的延时 num = 0; j = 0; /温度正负标志位 temp = AD1674_Read(); /读取转换后的12位温度值 temp = (int)(1.8528-temp*addo)*10000/11.79); /实现实际温度的转换 if(temp 0) temp = - temp;j = 0x20; /温度若为负,则标志位001000
16、00 temp2 = temp % 10; /温度小数位存放在temp2中 temp = temp / 10; a = (uchar)temp; putbyte(a); /发送温度 delay_ms(10);/延时一段时间 temp2 = temp2+132;/温度小数位+132用于接收时的判断 putbyte(temp2); delay_ms(10); /发送温度小数位 temp = P1; temp = temp & 0x0f; /地址为P1口的低4位 temp1 = temp1 4; temp1 = temp1 | 0xc0; /地址高位置1即11000000用于接收判断 temp =
17、temp | temp1; temp = temp | j; /正负标志位存于temp中 putbyte(temp); /发送地址 /*定时器0中断*/void t0() interrupt 1 TH0 = (65536 - 50000) / 256;/装初值50000实现50ms TL0 = (65526 - 50000) % 256; num+; /计数次数 /*(2)接收机接收、存储、显示的程序如下:#include #include #define uchar unsigned char#define uint unsigned int/*数码管显示0-9,-,C无小数点*/uchar
18、 code table=0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,0xbf, 0xc6;/*数码管显示0-9有小数点*/uchar code table1=0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10,0x3f;/*位选信号选中数码管*/uchar disbit8 = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80;uchar disnum8,bote4;/存放要显示的数据/倒计时uchar dao5=0x
19、92,0x99,0xb0,0xa4,0xf9; uchar time1;uchar time2;uchar flag, num, num1, m, aa, cc;sbit beep = P17; /蜂鸣器报警sbit led = P16; /红灯亮报警/*延时子程序*/void delay(uint i) char j; for(i; i 0; i-) for(j = 200; j 0; j-);/*向缓冲器中写入要显示的数据*/void HEXTOBCD(uint temp, uchar a,uchar cc) temp = temp * 10 + cc; /*若为正数即0-130*/ if
20、(a = 0) disnum0 = temp/1000; /百位 disnum1 = temp%1000/100; /十位 disnum2 = temp%100/10; /各位 disnum3 = temp%10; /小数位 disnum4 = 11; /显示C disnum5 = 10; /显示- /*若为负数即-55-0*/ else if (a = 1) disnum0 = 10; /显示- disnum1 = temp/100; /十位 disnum2 = temp%100/10; /个位 disnum3 = temp%10; /小数位 disnum4 = 11; /显示C disnu
21、m5 = 10; /显示- void init() SCON = 0x50; TMOD=0x21;/定时器为方式2 TL1=0xFD; TH1=0xFD;/波特率为9.6K TH0 = (65536 - 50000) / 256; /装初值实现50ms TL0 = (65526 - 50000) % 256; TR0 = 1; /开定时器0 TR1 = 1; /开定时器1 ET0 = 1; /开定时器0 REN = 1; /允许接收 SM0 = 0; /方式2 SM1 = 1; EA = 1; /开总中断 ES = 1; /开串口中断/*数据发送*/void putbyte(uchar byt
22、e)/ 利用硬件串口方式2 发送一个字节数据 SBUF = byte;/将要发送的数据送到发送缓冲区域,系统自动发送 while(!TI);/查询是否发送结束 当TI=1 代表发送结束 TI = 0;/清发送结束位方便下一次发送/*设置波特率 */void set_bote() uint temp=P1; temp=temp&0x0f; putbyte(temp); if(temp=1) TL1=0xE8; TH1=0xE8;/波特率为1.2K else if(temp=2) TL1=0xF4; TH1=0xF4;/波特率为2.4K else if(temp=4) TL1=0xFA; TH1=
23、0xFA;/波特率为4.8K else if(temp=8) TL1=0xFD; TH1=0xFD;/波特率为9.6K void display_led() uchar i; for(i = 0; i 8; i+) P2 = disbiti; /使用查表法进行位选 if(i != 2) P0 = tabledisnumi; else P0 = table1disnumi; delay(10); /扫描间隔时间 太长会数码管会有闪烁感 void BEEP() uchar i , j; led = 1; for (i = 0; i 100; i+) beep = !beep; /beep取反 fo
24、r(j = 0; j 250 ; j+) /需要产生方波 _nop_(); beep = 1; /关闭蜂鸣器void main(void) uchar c; uchar i; init(); /初始化 set_bote(); /设置波特率并且发送给从机 num = 0; /计数次数清0 num1 = 0; /报警计数次数清0 m = 1; /波特率显示结束标志 flag = 1; /是否接收到从机发送的数据标志 while(1) led = 0; if(num = 60 & m = 1) uchar temp = P1 & 0x0f; if(temp=1) /显示波特率1200 bote0 =
25、 1;bote1 = 2;bote2 = 0;bote3 = 0; else if(temp=2) /显示波特率2400 bote0 = 2;bote1 = 4;bote2 = 0;bote3 = 0; else if(temp=4) /显示波特率4800 bote0 = 4;bote1 = 8;bote2 = 0;bote3 = 0; else if(temp=8) /显示波特率9600 bote0 = 9;bote1 = 6;bote2 = 0;bote3 = 0; for(i = 0; i 4; i+) P2 = disbiti+4; /使用查表法进行位选 P0 = tablebotei
26、; delay(10); /扫描间隔时间 太长会数码管会有闪烁感 else m = 0; /波特率显示结束 if(num1 = 180) /若已经计时9s if(flag = 0) /若没有接收到数据 uchar t = 8; while(t-) /报警 BEEP(); else flag = 0; /否则接收到数据标志位清0 num1 = 0; /计数次数清0 time1=60; while(time1!=0) display_led(); /显示温度和地址3s for(c=0;c5;c+) time2=20; while(time2!=0) /倒计时5s P2=0x80; P0=daoc; delay(10); void t0() interrupt 1 TH0 = (65536 - 50000) / 256; /装初值实现50ms TL0 = (65526 - 50000) % 2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1