《单片机》课程设计说明书专业名称:电气工程及其自动化班级:093学号:20090202101姓名:张淑冠指导教师:姚广芹日期:2011年7月8日单片机课程设计评阅书摘要随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计是基于AT89S52单片机的温度测量系统。
通过对单片机技术基础及温度传感器使用方法的学习,本组利用Protel设计工作电路,并用PROTUES进行仿真后,焊接电路,这次课程设计综合利用所学单片机知识完成了一个单片机应用系统设计并仿真,焊接电路实现功能,从而加深对单片机软硬知识的深层次理解,获得初步的应用经验,为走出校门从事单片机应用的相关工作打下了一定的基础。
关键词:单片机;AT89S52;温度计;数字控制目录1 课题描述 (1)2 设计过程 (2)2.1 数字温度计系统设计方框图 (2)2.2 单片机所实现功能说明 (2)2.3 电路板各部分电路图及其原理 (2)3 测试 (5)总结 (6)参考文献 (7)附录1 (8)附录2 (9)1 课题描述本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
开发工具:protel2 设计过程由于本设计是测温电路,进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
2.1 数字温度计系统设计方框图图2.1系统设计方框图2.2 单片机所实现功能说明本次实训所设计的为数字温度计,能实现对温度的测试,所测温度由数码管以整数的形式显示。
同时可调所测温度的上下限,如果超出所测温度的限制,能够发出报警,报警信号由LED灯和蜂鸣器同时发出。
性能指标基本要求:(1)能够显示当前室内温度,分辨率为1摄氏度。
(2)具有超限声光报警功能,能够通过按键设定报警温度的上限和下限。
控制器采用单片机AT89S52,温度传感器采用DS18B20,用数码管显示器实现温度显示。
2.3 电路板各部分电路图及其原理(一)单片机AT89S52图2.3.1单片机AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
(二)晶振和复位装置图2.3.2a晶振图2.3.2b复位电路(1)晶体振荡器,能产生振荡,其特点是固有频率十分稳定,而且震动具有多谐性,除了奇频震动外还有奇次谐波泛音震动。
性能上,晶振的品质因素Q和特性阻抗都非常高,而且接入系数很小,因此具有很高的频率稳定度。
(2)复位电路,与单片机第9引脚,也就是RST引脚相连,起复位作用,高电平有效(三)温度传感器DS18B20图2.3.3温度传感器DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内,温范围-55℃~+125℃。
有三个引脚,其中1引脚接高电平,第3引脚接地,第2引脚接单片机的16引脚,即P3.6口以送入温度信号。
(四)报警电路——LED灯和蜂鸣器图2.3.4aLED灯图2.3.4b蜂鸣器此次所设计的数字温度计可以设置上下限,当超出上下限后能够报警,报警信号又LED灯和蜂鸣器同时发出。
其中LED灯要有一个上拉电阻和高电平相连,LED报警信号由单片机的P1.0口送出。
蜂鸣器采用无源连接,报警信号由单片机的P3.7引脚送出(五)按键。
按键实现对温度计所测温度的上下限进行节。
图2.3.5按键3 测试将制作好的数字温度计用USB线与电脑连接,把编的程序写入单片机中,测试温度计显示数据是否正确。
调节环境温度,利用温度计(事先准备一个)确定环境温度,观察数码管所显示的数据,并与温度计示数对比。
调节温度使温度达到声光报警温度,测试声光报警是否正常。
总结课程设计的过程是艰辛的,但是收获却是很大的。
这次课程设计我主要是应用以前学习的编程以及单片机的一些知识,综合起来才完成了这个温度计的设计,虽然所设计器件很小,但是付出却是艰辛的。
首先,综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识,再次,我在课程设计中碰到了很多的问题,我通过查阅相关书籍,资料,通过自己钻研,特别是得到了姚老师的谆谆教导,姚老师给予了我很大的帮助,不仅给了我思路上的开阔,还让我认识到了自己对以前所学知识的不足方面。
随着社会发展,单片机技术的迅速普及,以及飞速发展,人们对实时数字的要求越来越迫切,需求日益增加,单片机的应用无处不在,从小小的电子表,到大型的计算机都离不开单片机,因此我们更需要学习单片机工作原理的及其编程。
通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,不断进取,能使自己在单片机运用这方面有一个大的发展。
参考文献[1] 张毅刚彭喜元彭宇《单片机原理及其应用》高等教育出版社[2] 王守忠赵明明索世文《51单片机应用开发速查手册》人民邮电出版社[3] 谢自美《电子线路综合设计》华中科技大学出版社[4] 夏继强《单片机应用设计培训教程—实践篇》北京航空航天大学出版社[5] 李广弟, 朱月秀, 王秀山《单片机基础》北京航空航天大学出版社[6] 王毅《单片机器件应用手册》人民邮电出版社附录1 总电路图附录2 程序/**********************************程序功能:基于四眼兔子单片机学习板的温度计数码管显示温度,十位与个位时间:2010.3.14***********************************/ #include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intbit presence;bit flow0;sbit led=P1^0;sbit DQ=P3^6;//定义温度传感器sbit led1=P2^0;sbit led2=P2^1;sbit led3=P2^2;sbit led4=P2^3;sbit key1=P3^2;sbit key2=P3^3;sbit key3=P3^4;sbit key4=P3^5;float i=0;int datt=0;int aa=0;int bb=0;int cc=0;int dd=0;int wendu=30;int wenduxia=25;uchar ge,shi,bai,xiao,xiao1;sbit BEEP=P3^7;unsigned char code tab[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };unsigned char init[] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};unsigned char init1[] ={0x12, 0x12, 0x12, 0x12, 0x12, 0x12,0x33};void delayms(uchar xms){while(xms--){uchar time;for(time=114;time>0;time--);}}void display(void){P0=tab[shi];led4=0;delayms(1);P2=0xff;P0=tab[ge];led3=0;delayms(1);P2=0xff;P0=0xc6;led1=0;delayms(1);P2=0xff;P0=0x9c;led2=0;delayms(1);P2=0xff;}/**********************************************延时微妙函数************************************************/ void delayus(unsigned char x){unsigned char i;while (x--){for (i = 0; i < 14; i++){;}}}void beep(){ uint j;BEEP=0;for (j = 3; j > 0; j--){ delayms(1);BEEP = ~BEEP;}BEEP = 1;}/********************************************************** us延时函数 (8*1.085)*num**********************************************************/ void Delay(unsigned int num) //延时函数{while (--num);}void xianshi(){int q ;char z;for(z=5;z>0;z--){for(q=20;q>0;q--){P0=tab[aa];led4=0;delayms(1);P2=0xff;P0=tab[bb];led3=0;delayms(1);P2=0xff;P0=tab[cc];led2=0;delayms(1);P2=0xff;P0=tab[dd];led1=0;delayms(1);P2=0xff;} }}void xianshi1(){ aa=0;bb=0;cc=wenduxia/10;dd=wenduxia%10;P0=tab[aa];led4=0;delayms(1);P2=0xff;P0=tab[bb];led3=0;delayms(1);P2=0xff;P0=tab[cc];led2=0;delayms(1);P2=0xff;P0=tab[dd];led1=0;delayms(1);P2=0xff;}void shengwen(){if(key1==0){delayms(100);;if(key1==0){ wendu++;aa=wendu/10;bb=wendu%10;cc=0;dd=0;xianshi();delayms(150);}}}void jiangwen(){if(key2==0){ delayms(100);if(key2==0){ wendu--;aa=wendu/10;bb=wendu%10;cc=0;dd=0;xianshi();delayms(150);}}}void xianshixianzhi(){if(key3==0){ delayms(100);if(key3==0){aa=wendu/10;bb=wendu%10;cc=wenduxia/10;dd=wenduxia%10;xianshi();delayms(150) ;}}}/****************************************初始化18b20****************************************/uchar ds18b20_init(void){DQ = 0; //单片机发出低电平复位信号Delay(60); //延时>480usDQ = 1; //释放数据线Delay(8); //延时>64us,等待应答presence = DQ; //接收应答信号Delay(50); //延时>400us,等待数据线出现高电平DQ = 1; //释放数据线return (presence); //返回presence信号}/********************************************************** 读一个字节数据**********************************************************/ unsigned char ReadOneChar(void){unsigned char i = 0;unsigned char dat = 0;DQ = 1;for (i = 0; i < 8; i++)//一个字节8个bit{DQ = 0; //给低脉冲信号dat >>= 1;DQ = 1; //释放总线_nop_();_nop_();if (DQ)//读总线电平状态dat |= 0x80;//最高位置1Delay(6); //延时>45usDQ = 1; //释放总线,表示此次读操作完成}return(dat);}/********************************************************** 写一个字节数据**********************************************************/ void WriteOneChar(unsigned char dat){unsigned char i = 0;for (i = 0; i < 8; i++)//一个字节8个bit{DQ = 0; //给低脉冲信号Delay(1); //延时<15usdat >>= 1; //数据右移一位,最低位移入CYDQ = CY; //写1bit数据Delay(6); //延时>45usDQ = 1; //释放总线,表示此次写操作完成}/*****************************************读温度函数*****************************************/void read_temp(void){uint d=1;uchar temp1=0;uchar temp2=0;uint t=0;float tt;uint zong=0;ds18b20_init();WriteOneChar(0xcc);//跳过ROM匹配WriteOneChar(0x44);//启动温度转换ds18b20_init();WriteOneChar(0xcc);//跳过ROM匹配WriteOneChar(0xbe);//读温度寄存器temp1=ReadOneChar();//温度低8位temp2=ReadOneChar();//温度高8位if(temp2>112)//判断温度正负,负温度时执行大括号内程序{temp1=(~temp1)+1;if((~temp1)+1>=0xff){temp2=(~temp2)+1;}elsetemp2=(~temp2);flow0=1;//温度是零下}else //温度值为零上flow0=0;t=temp2;t<<=8;t=t|temp1;tt=t*0.0625*100;datt=(int)tt;bai=datt/10000;shi=(datt%10000)/1000;ge=datt%1000/100;xiao=datt%100/10;xiao1=datt%10;if(xiao1>=5)//四舍五入计算小数点后一位xiao++;zong=bai*100+shi*10+ge;if(zong>=wendu||zong<=wenduxia) {led=0;beep();}if(zong<wendu||zong>wenduxia) led=1;}void shezhixiaxian(){if(key4==0){delayms(30);if(key4==0){while(1){if(key4==0){delayms(50);if(key4==0){break;}}if(key1==0){delayms(50);if(key1==0){ wenduxia++;aa=0;bb=0;cc=wenduxia/10;dd=wenduxia%10;xianshi();} }if(key2==0){delayms(50);if(key2==0){ wenduxia--;aa=0;bb=0;cc=wenduxia/10;dd=wenduxia%10;xianshi();}}xianshi1();}}}}/**************************************************主函数**************************************************/void main(void){P2=0xff;P0=0xff;while(1){ read_temp(); //读取温度值display();shengwen();jiangwen();xianshixianzhi();shezhixiaxian();}}。