参考文献
[1] 马忠梅.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1998
[2] 李晓荃.单片机原理与应用[M].北京:电子工业出版社,2000年8月 [3] 何立民 AVR单片机原理与接口技术[M].北京:北京航空航天大学出版社,2002
31
致 谢
本论文在xx老师的细心指导和严格要求下已完成,从课题选择到具体构思和内容,无不凝聚着老师的心血和汗水,特备是老师严格的教学要求和一丝不苟的工作精神,让我非常敬佩。在三年的大学学习和生活期间,也始终感受着导师的精心培养和无私的关怀,我受益匪浅。在此向各位老师表示深深的感谢和崇高的敬意。
在此,我还要特别感谢我的同学们,由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,你们对本课题做了不少工作,直至本文的顺利完成,给予我不少的帮助。最后我还要感谢含辛茹苦培养我长大的父母,谢谢你们!
32
附 录
附录1 主程序
/*******************************************************************/ /*学校名称*/湖南工学院
/*模块名*/单片机温度控制系统
/*功能描述*/显示温度传感器的温度及控制温度范围
/*******************************************************************/
#include
#define uchar unsigned char /*端口定义*/
#define LED P0 /*实际温度值输出端口定义*/ #define NOP _nop_() sbit Q1=P3^2; sbit Q2=P3^3;
sbit tem_in=P3^0; /*温度读取端口*/ sbit con_out=P1^7; /*报警启动端口*/ sbit DP=P2^7;
#define L 15 /*温度报警下限*/ #define H 40
uchar temp_h,temp_l; /*温度值变量*/ uchar flag1; /*正负标志位*/ uchar code
ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*数码显示数据:0,1,2,3,4,5,6,7,8,9*/
uchar code ledbit[]={0xfe,0xfd,0xfb};//共阴led uchar dispbuf[2]={0,0};
uchar B20num[]={1,2,3,4,5,6,7,8};
/*==================================== 函数功能:延时 入口参数:
说 明 :送1迟202us
=====================================*/ void delay(unsigned int count) {
unsigned int i; while(count) {
i=200;
while(i>0)i--; count--; } }
/*==================================== 函数功能:延时 us 入口参数: 说 明 :
=====================================*/ void Delay_us(uchar n)
33
{
uchar i; i=0;
while(i /*==================================== 函数功能:DS18B20重设 入口参数:无 说 明 : =====================================*/ void dsreset(void) { unsigned int i; tem_in=0; i=103; while(i>0)i--; tem_in=1; i=4; while(i>0)i--; } /*==================================== 函数功能:直接读一字节程序 入口参数:无 说 明 :返回结果 =====================================*/ uchar ReadByte(void){ uchar i,k; i=8; k=0; while(i--) { tem_in=1; Delay_us(1); tem_in=0; k=k>>1; tem_in=1; NOP; if(tem_in)k |= 0x80; Delay_us(4); } return(k); } /*==================================== 函数功能:向B20写一字节 入口参数:待写数据 说 明 : =====================================*/ void tmpwrite(unsigned char dat) { unsigned int i; unsigned char j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { tem_in=0;i++;i++; 34 tem_in=1; i=8;while(i>0)i--; } else { tem_in=0; i=8;while(i>0)i--; tem_in=1;i++;i++; } } } void tmpchange(void) { dsreset(); /*复位*/ delay(1); tmpwrite(0xcc); //跳过序列号命令 tmpwrite(0x44); //转换命令 } /*==================================== 函数功能:将温度值读出来并转化为显示数组 入口参数: 说 明 :调用 ReadByte(); =====================================*/ void tmp(void) { float dis; uchar tempbuf; dsreset(); delay(1); tmpwrite(0xcc); tmpwrite(0xbe); temp_l=ReadByte(); //低位在前 temp_h=ReadByte(); //高位在后 flag1=temp_h&0xf8; if(flag1) { temp_h=~temp_h; if(temp_l==0)temp_h++; //若低8位全为0且温度为负,取补时就要向高位进1 temp_l=~temp_l+1; } dis=(temp_h*256+temp_l)/16; dis=25.34; //调试用 if(dis<10) { dispbuf[0]=0; dispbuf[1]=(uchar)dis; } else { dispbuf[0]=(uchar)dis/10; dispbuf[1]=(uchar)dis; } dispbuf[2]=(uchar)(dis*10); dispbuf[3]=(uchar)dis*100; 35