1、3)将ALE由低电平置为高电平,从而将ADDAADDC送进的通道代码锁存,经译码后通道0的模拟量送给内部转换单元。4)给START一个正脉冲。当上升沿时,所有内部寄存器清零。下降沿时,开始进行A/D转换;在转换期间,START保持低电平。5)EOC为转换结束信号。在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换结束。否则,表明正在进行A/D转换. 6)当A/D转换结束后,将OE设置为1,这时D0D7的数据便可以读取了。OE0,D0D7输出端为高阻态,OE1,D0D7端输出转换的数据.3、数据处理部分-查表和线性插值法热敏电阻为一种阻值随温度变化的电阻,按其变化关系
2、可分为两类:正温度系数(简称PTC)和负温度系数(简称NTC)。PTC元件的阻值随温度的上升而上升,NTC元件的阻值随温度的上升而下降.本模块中使用的为NTC型热敏电阻,在常温(25)下其阻值为10K,其阻值与温度的关系、阻值与电压的关系、电压值与电压AD值得关系如下表所示:温度()-302010102025304050阻值(K)176.096。2954。8532.4119。8012.4710。008.0665。3423。618电压(V)0。26881720470411130.771010021.178967221.677852342.225189142。5767629802590275067
3、161110电压AD142439608611412814216718870901001101201301401505021。7631.2650.922668340.51580.394230480.238218813.999360104.250616334.438526404。5776646568015800754749994.81037501852107754.8836709590768641205218228235240244247249250252在上面列的表格中,温度与阻值的关系是已知的,电压是根据式3-1得出的,电压的AD值是根据式21得出的。 电压V与电压AD的关系: (21)4 电
4、压AD值与温度关系折线图根据图2。4可用线性插值法在线性区间建立函数关系,随着电压的改变输出温度值.三、硬件电路图图3。1 热敏电阻温度采集电路图图3.1中J1、J2、J3分别对应于模块上的V1、Vzero、Vout插孔,R3对应与 ZERO电位器,用于偏置电压调节;R9对应于GAIN电位器,用于增益调节. 使用时,可先将电路增益调节为1,具体做法如下:调节ZERO电位器,使Vzero=0V,用万用表分别测量V1、Vout端电压,调节GAIN电位器,使V1=Vout,此时电路增益为1。由此可得出电压与电阻之间的关系: (3-1)四、程序设计流程图图4。1 主函数程序流程图2 LCD显示流程图3
5、 A/D转换流程图3 中断服务程序五、问题和不足出现的问题及解决方法:在数据处理部分,之前是建立电压值V与温度值T的关系来显示温度,发现再怎么细分线性部分,输出的温度误差还是很大,而且显示的温度值一直在跳变。于是决定找电压值AD与温度之间的关系,这样减小了误差,显示的温度值也几乎不再跳变了。不足之处:实验台提供的可调输出电压的范围是0-4.5V,正确来说显示的温度范围应为-35至90。这样选定的线性区间才能较小误差,更趋近与表格提供的数值.所以,更细分的取线性部分得到的数值会更好。六、总结通过此次实习,使我对所学知识进行了实践。掌握了A/D转换芯片性能及编程方法、单片机系统中扩展LCD显示的方
6、法以及温度传感器和LCD的工作原理及综合应用。在数据处理部分学会了线性插值法。在编写程序时,也发现对一些程序中的函数的处理不够合理,在自己的多次运行下,还是能够实现温度监控的功能.本次单片机实训让我很有成就感,并对以前所学的单片机知识做了一个小结。附件include reg51。hinclude stdio.h#include #include absacc.hdefine uchar unsigned char #define ulong unsigned long #define uint unsigned int #define Port_address XBYTE0X0CFA0sbit
7、 REQ=P35; /请求信号,高电平有效sbit BUSY=P34; /忙检测sbit EOC=P32;/转换结束信号,EOC=1转换结束,EOC=0正在转换void delay1ms(uint time) /延迟子程序1 uint ii; uint jj; for (ii=0;iitime;ii+) for(jj=0;jj=0) qian=date/1000; bai=date1000/100; shi=date%1000%100/10; ge=date10; write_ASCII_8x16(10,16,0x2b); /显示正号+ write_ASCII_8x16(11,16,0x30+
8、qian);write_ASCII_8x16(12,16,0x30+bai); write_ASCII_8x16(13,16,0x2E); /显示小数点 write_ASCII_8x16(14,16,0x30+shi);write_ASCII_8x16(15,16,0x30+ge); if(date0) date=-date; qian=date/1000; bai=date1000/100; shi=date1000%100/10; ge=date10; write_ASCII_8x16(10,16,0x2d); /显示负号 write_ASCII_8x16(11,16,0x30+qian)
9、; write_ASCII_8x16(12,16,0x30+bai); write_ASCII_8x16(13,16,0x2E); write_ASCII_8x16(14,16,0x30+shi); write_ASCII_8x16(15,16,0x30+ge);/*中断初始化函数*/void config(void) IT0=1; /INT0下降沿中断 EX0=1; /允许INT1中断 EA=1;void AD_init(void) Port_address=0x00; /虚写一次,启动通道0/*AD转换函数*/uchar AD(void) uchar ad_date; /保存经AD转换后的
10、数据 ad_date=Port_address; return ad_date; /返回数据/*温度处理函数*/int deal_wendu() int v,t; uint da; da=AD(); v=da*195; if(da=14&da=167&=188) t=48da4000; if(da=188&=209) t=da*595341; if(da=209da=248) t=46*da-3341; t=15000; return t;void main() int r=0; uint v,da; config(); /中断初始化 lcd_init(); /显示屏初始化 AD_init()
11、; /启动通道0 delay(700); clear_lcd(); delay(700); write_chinese(0,0,46,34); /显示温度采集系统 write_chinese(1,0,22,40); write_chinese(2,0,18,41); write_chinese(3,0,28,15); write_chinese(4,0,47,21); write_chinese(5,0,45,19); while(1) if(r=0) v=da*195; display_voltage(v); display_digit(da); display_temperature(deal_wendu();void int0(void) interrupt 0 int r=1; EX0 = 0; EX0 = 1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1