1、2、方案可行性分析在测温系统中,用温度敏感元件通过电路的调整可以把温度信号转换为模拟电压信号,在将模拟电压信号远距离传输并通过A/D转换得到相应的数字信号,通过程序进行处理得到实时的温度数值。铂热电阻测量范围为200850,R0有10 、100和1000三种,分度号分别为Pt10、Pt100和Pt1000。铂热电阻的精度高,体积小,测温范围宽,稳定性好,再现性好,但是价格较贵。其电阻与温度的关系为:当T0时 R(T)= R0(1+AT+BT) 当T 0时 R(T)= R0 1+AT+BT+CT(T-100) 式中: RT为被测温度T下的阻值,单位为 R0为0下的阻值 T为实际温度值 A为常数3
2、.908310/ B为常数-5.775107/ C为常数-4.1831012/4由于我们要测得温度是100-500,所以,不用考虑小于0的情况了。所以公式为:R(T)= R0(1+AT+BT)由数学知识可以直接解出T=(-A-sqrt(A2-4*B(1-R(t)/R0)/2B(1)因为A、B、R(0)已知,所以只要测到R(t)就能够算出T。所以我们将测量电阻上的电压来算出电阻的阻值,进而得出他现在的温度。2、 硬件电路设计(1)、铂电阻测量单元设计思想:铂金属的阻值会随着温度变化而变化,所以可以通过测量它的电阻来确定温度。我们可以通过串接另一个阻值已知的电阻通过电压的变化而确定铂金属的阻值。由
3、电路知识求得:RV9=3*u/(5-u).(2)式(2)、按键控制单元由于有八路信号,所以可以用3*3的矩阵键盘,或者用8各独立的键盘来控制八路信号。我这里由于简化设计就用了8个独立的键盘控制。低电平有效。(3)、AD转换单元由于精度要求+-1度,从100-500所以有400个档位,所以要9位(512)或者9位以上的AD转换器才能实现这个精度。我这里使用了TLC1543,这个ad芯片的精度很高,为10位串行逐步逼近型AD转换器(1024)。所以能精确到0.4度。其工作过程分为两个周期:访问周期和采样周期。(4)、LED数码管显示单元LED接收来自p0口的数据信号与地址信号,通过地址锁存,分时复
4、用来实现LED数码管的动态显示,我这里用74ls373来作为锁存器,来锁住数据与地址信息。(5)、数据传输上位机单元由于rs232传输的距离有限,所以我们这里使用传输距离更远的rs485。Max485位一款rs485。但是由于485电平和rs232电平不符,所以,当我们连接计算机的时候还是要接上max232用来转换电平。4、整体硬件设计连接图软件设计(1)、软件设计思想在本次设计中,mcu主要的工作是将ad采集来的数据,通过一定的计算转化成为温度的值,并且将这个值通过p0口输出到led数码管上。在循环扫描八个检测点的时候,顺便扫描按键部分,看有没有按键被按下,按下则进入按键服务程序,执行按键指
5、定的测量。并通过串口传输到上位机上。由于软件源代码过长,这里简略的写ad部分(详细软件部分见附录)uint ADC(uchar chn1)uchar i;uchar addr8; uint ADresult; AD_eoc=1; AD_cs=0;_nop_();addr8=chn1;addr8=4;for(i=0;i4;i+)/写地址 AD_add=(bit)(addr8&0x80);AD_clk=1;AD_clk=0;addr8=1; for(i=0;6;i+) /采样AD_cs=1;while(!AD_eoc);/查询ADresult=0; /移位传数据10;i+)ADresultm=AD
6、_dat;ADresult+=m;return(ADresult);(2)、程序流程图(3)、程序清单void delay(uint z)延时z 毫秒void display(num)显示子程序,显示num和数据AD转换子程序,负责转化模拟信号位数字信号void Send(unsigned char dat)串口发送子程序,负责将收集到的数据发送到上位机上void jianpan(void)键盘检测子程序,负责不断地扫描键盘,看是否有键盘按下void main()主函数5、电路pcb原理图及pcb图设计用altium designer6.9设计并做出原理图pcb图设计画好原理图后电器检查通过后
7、编译,并design-updatato pcb再布局布线覆铜。6、系统protues仿真及调试通过protues仿真,可以了解自己的电路到底能不跑起来,大部分的原件还是找得到的,就是不知道叫什么名字,所以在百度里查查名字后再连线,之后就是通过keil来编译生成的hex文件烧到mcu中去。8、 结果与展望通过本次课程设计,我更深刻理解了单片机,特别是51系列的单片机。当然,我也了解了一点avr的知识。Avr价格上面还是有点高,所以现在51单片机还是有很大的市场的。但是51的引脚比较少,所以还是主要用于简单的控制上面。对于我们大自动化的学生,我们可不要认为会51就好了,至少得学个arm corte
8、x-m3吧。对于有追求,有理想的学生,我们更应该好好学习arm9的内容,以及linux系统。要是更高级的话,x86芯片也可以去研究。可是学校给我们做实验的机会太少了。就那几台设备,而且课内充满做一下,都不到在干什么。对于实验室,我只能说,粥少僧多啊。主要还是没有实验室地皮的问题。建议扩展地皮,要建一个自由实验室,以用来给买不起试验设备的学子一个做实验的平台。我们应该做的是扬长避短,发挥所长,为社会做贡献。9、参考文献郭天祥10天学会单片机视频mcs-51单片机原理与应用张毅刚 刘杰 哈尔滨工业大学出版社郭天祥10天学会PCB教程视频程序源代码 + pcb 3d模拟图(见附录)附录#includ
9、e #includemath.h#define uchar unsigned char#define uint unsigned intuint num;float num1; int keyval;int o;int i;int q;int rt;int tr;double n2;uchar port,m;uchar ge,shi,bai,qian;sbit wela=P27; int sy;sbit dula=P26; uchar led10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;sbit AD_eoc=P10;sbit AD_
10、clk=P11;sbit AD_add=P12;sbit AD_dat=P13;sbit AD_cs=P14;sbit S1=P35; /将S1位定义为P1.4引脚sbit S2=P34; sbit S3=P20;sbit S4=P21; sbit S5=P22;sbit S6=P23;sbit S7=P24;sbit S8=P25; void delay(uint z)uint k; for(z;z0;z-) for(k=1000;kk-); void display(num) n2=num;n2=n2*5/1024; n2=(3*n2)/(5-n2)*1000;/r1=3k电压求电阻 n2
11、=3383.8-8.658*(sqrt(175850-23.1*n2); sy=n2; bai=sy/100%10; shi=sy/10%10; ge=sy%10; P0=0xff;wela=1;wela=0;P0=ledbai; dula=1;dula=0; P0=0Xf7; wela=1;delay(1); P0=0xff;P0=ledshi; dula=1;P0=0xef;P0=0xff; P0=ledge; dula=1;P0=0xdf;P0=o;P0=0xfe; /显示哪一路标号 SBUF=dat; while(TI=0) ; TI=0; void delay5(void) unsi
12、gned char m,n; for(m=0;m200;m+) for(n=0;n250;n+) ; void jianpan(void) if(S1=0) /按键S1被按下 tr=0; for(rt=0;rtrt+)port=0x0a; o=led1;num=ADC(port); tr=num+tr; num=tr/10; for(q=0;q50;q+)display(num); Send(ledbai); Send(ledshi); Send(ledge); /发送数据 tr=0; if(S2=0) keyval=2; tr=0; for(rt=0; port=0x09; o=led2;t
13、r=num+tr;num=tr/10; for(q=0;q+)display(num); Send(ledbai); tr=0; if(S3=0) keyval=3; tr=0; for(rt=0;rt+) port=0x08; o=led3; num=tr/10;for(q=0; Send(ledbai); tr=0; if(S4=0) keyval=4; for(rt=0; port=0x07;o=led4;num=tr/10; Send(ledbai); tr=0; if(S5=0) tr=0; for(rt=0; port=0x06; o=led5;tr=num+tr; num=tr/
14、10; for(rt=0;rt+)display(num); Send(ledbai); if(S6=0) tr=0; for(rt=0; port=0x05; o=led6; num=tr/10; Send(ledbai); tr=0; if(S7=0) tr=0; for(rt=0; port=0x04; o=led7; num=tr/10;for(q=0; Send(ledbai); tr=0; if(S8=0) tr=0; for(rt=0; port=0x03;o=led8; Send(ledbai); o=led1; ; void main() TMOD=0x20; /TMOD=0010 0000B,定时器T1工作于方式2