历史上的今天
今天是:2024年09月10日(星期二)
2020年09月10日 | 基于单片机+pt100热敏电阻的体温计
2020-09-10 来源:51hei
采用热敏电阻pt100设计温度传感电路,温度传感电路通过放大电路进行放大后加载到A/D转换模块(ADC0804),以AT89C51单片机为主控制端,外接晶振电路满足各模块时序,最终通过7段数码管进行温度显示

单片机源程序如下:
#include #include #define uchar unsigned char #define uint unsigned int #define ad0_7 P1 //AD数据口 sbit cs=P2^4; //片选信号,低电平有效,控制芯片的启动和结果读取 sbit rd=P2^7; //读数据控制,低电平有效 sbit wr=P2^6; //AD启动控制,上升沿有效 sbit intr=P2^5; //AD转换完成输出低电平 uchar i; uchar led[11]={ 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x40, //"-" }; uchar dat_AD[4]={0}; //启动AD转换子程序////////////////// void start_ad(void) { cs=0; //允许AD wr=0; _nop_(); wr=1; //WR由低变高时启动AD转换 while(intr); //等待转换完成,低电平有效 cs=1; //停止AD转换 }//////////////////// read_ad() { uint ad_data; ad0_7=0xff; cs=0; //允许读 rd=0; //读取转换数据结果 _nop_(); ad_data=ad0_7; //把数据存到AD——data中 rd=1;cs=1; //停止读取AD return(ad_data); } // 数据处理函数 //实际测量当0度时,AD数据为133,所以数据处理时判断AD数据和133的大小来识别正负温度。 //由于ADC芯片精度不够,所以测量时有误差,8位AD的分辨率为19.5mV,约为20mV, //放大电路输出的电压,温度每变化一度,电压变化只有10mV左右,所以测量有误差, //以下温度和AD数据的计算公式为实测数据后线性拟合得到的,实际线性拟合得到公式为:y=0.503x+133.63. //因为AD数据为0-255的整数,所以公式简化为以下计算方式 void data_shout(uint ad_data) { float temp; uint T; if(ad_data<79) { temp=614.422-7.811*ad_data; T=(uint)temp; dat_AD[0]=10; } //负温度 dat_AD[0]中为温度符号数据 else if(ad_data<=204) { temp=7.990*ad_data-628.491; T=(uint)temp; dat_AD[0]=T/1000; } //正温度 else if(ad_data>204) { temp=8.124*ad_data-655.742; T=(uint)temp; dat_AD[0]=T/1000; } //ad_data=T; dat_AD[1]=T%1000/100; //温度值的十位 dat_AD[2]=T%100/10; //2温度值的个位 dat_AD[3]=T%10; //温度值的小数位 } //显示函数 void disp(){ switch(i){ case 0: P0=0xfe;P3=led[dat_AD[0]];i++;break; //显示符号位 case 1: P0=0xfd;P3=led[dat_AD[1]];i++;break; case 2: P0=0xfb;P3=led[dat_AD[2]]|0x80;i++;break; case 3: P0=0xf7;P3=led[dat_AD[3]];i=0;break; } } //定时器初始化 //用作数码管显示的刷新 void t0init(){ TMOD=0x01; TH0=(65535-2000)/256; //定时20ms时间 TL0=(65535-2000)%256; EA=1; ET0=1; TR0=1; } //定时器中断函数,在中断中刷新数码管显示 void Time0( ) interrupt 1{ TH0=(65535-2000)/256; TL0=(65535-2000)%256; disp(); } //主函数 void main(void){ t0init(); //初始化 while(1){ start_ad(); //开始AD data_shout(read_ad()); //数据处理 } }
史海拾趣
|
Gem micro semiconductor Inc. GM8205A Pb free Pb Dual N-Channel High Density Trench MOSFET (20V, 6.0A) PRODUCT SUMMARY VDSS ID RDS(on) (m-ohm) Max 28 @ VGS =4.0V, ID=6.0A ...… 查看全部问答> |
|
我已经能让模块登陆网络,并能获取到模块登陆的IP地址,但是使用BENQ M32 AT$DESTINFO 链接服务器的时候出错 不知道怎么回事? AT+CGDCONT=1,\"IP\",\"CMNET\" OK AT%CGPCO=1,\"PAP,,\", 1 OK AT$DESTINFO=\"115.46.37.254\" ,1,1029 EXT: I ...… 查看全部问答> |
|
不知道怎么回事,俺第一次做SD卡,但是碰到了很大麻烦。 用ADS裸机测试程序没有问题。 但是弄到PB下面却不行了(微软的驱动)-------看不见SD卡盘符,串口打印信息也有问题。 平台描述 2440+512M nand flash+1G MicroSD卡 wince5.0+由4.2升至5 ...… 查看全部问答> |
|
请教各位大虾: GPS模块里1PPS的上升沿和串口收到的信息是同步的还是有些时间差?先后时间顺序是啥关系? 如何保证收到的时间和1pps上升沿同步? ...… 查看全部问答> |
|
tcp_recved: recveived 2 bytes, wnd 4096 (0). blankname!----A 123.txt----A 432.txttcp_write(pcb=20006e88, data=20009258, len=30, apiflags=0) tcp_enqueue(pcb=20006e88, arg=20009258, len=30, flags=0, apiflag ...… 查看全部问答> |
|
在超低功耗时钟DIY的过程中,大家对于时钟源经行过讨论,这个时钟所用到的时钟源到底是使用32768Hz的晶体还是使用专用的时钟芯片比如DS1302。最后我们选定的方案是带上DS1302用于时钟的校对,这个考虑主要是出于时钟的准确的考虑,但是这样一来就多 ...… 查看全部问答> |
|
浅析视频会议终端系统市场动态与前景2012年06月11日 投影时代 视频会议终端市场正面临着巨大的转变。几年以前,机顶盒和移动系统在视频会议市场中占据了主导地位,它们主要都是通过ISDN连接,然而当今的市 ...… 查看全部问答> |
|
昨天上午看的视频,特权的按键消抖,想了好久,到现在终于弄明白了,下面是我理解的方式: 先上他的程序: module key_led(clk,rst_n,sw1_n,sw2_n,sw3_n, led_d3,led_d4,led_d5, Q1,Q2,Q3,Q4,Q5, ...… 查看全部问答> |




