您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 单片机设计数字温度计
一、设计题目这次单片机课程的设计任务选择的是:数字温度计二、设计任务和要求设计要求:(1)、基本范围-50℃~110℃(2)、精度误差小于0.5℃(3)、LED数码直读显示(4)、实现语音报数报告要求:(1)原理图中元件电气图形符号符合国家标准(2)整体布局合理,注标规范、明确、美观,不产生歧义(3)列出完整的元件清单(标号、型号及大小、封装形式、数量)(4)图纸幅面为A4(5)流程图的符号采用国际标准三、原理电路和程序设计(1)方案比较以及元件的选择1)单片机的选取:本系统采用STC89C52RC单片机为控制核心。因为51系列单片机功能齐全,能运行各种项目设计。且因为51系列单片机操作简单,方便。2)温度传感器的选取:传感器是信号输入通道的第一道环节,也是决定整个测试系统性能的关键环节。相比热敏电阻来说,DS18B20单总线数字式温度传感器灵敏度高,精度高,但本次课程设计对温度精度的要求不高,且因为DS18B20温度传感器需要初始化,价格也比热敏电阻高,综合考虑,本设计采用热敏电阻对温度信号进行采集。3)显示器的选取:显示系统是单片机控制系统的重要组成部分,主要用于显示各种参数的值,常用的显示器有CRT、LED、LCD等。本设计用LED数码管显示需求片数并不多,观察方便,而LED数码管相对于其他显示器价格也比较便宜,成本也较低,所以本系统采用LED数码管显示。(2)整体电路图3-2(3)单元电路设计1)晶振电路:瓷片电容C1、C2是用来驱动晶振Y1的,因为晶振的大小是16M,所以选用20P的电容。图3-3-12)复位电路:复位电路选用了10nF的电解电容和10K的电阻。图3-3-23)温度显示数码管驱动电路:PE0~PE3是进行位选通的控制,PD口进行段选通的控制。图3-3-3(4)说明电路工作原理本设计使系统可以检测-50~110℃范围内的温度,考虑到测温精度,设置显示数值精确到0.5℃并且设置温度的上下限,当温度值超过上下限温度时,报警电路中的蜂鸣器鸣响,报警灯闪。根据STM8S105C6T6的引脚特性,本设计中采用PB0~PB2和PD口作为四位数码管的驱动引脚,PA3~PA5作为外部中断的输入,PB4作为热敏电阻与单片机之间的信息传送。PB5与蜂鸣器相接,控制蜂鸣器是否鸣响。RST作为复位输入,当振荡器工作时,RST引脚出现2个机器周期以上高电平使单片机复位。PB5与正常工作指示灯相连接,PB7引脚与报警灯相接,控制报警灯是否闪亮。XTAL1振荡器反相放大器及内部时钟发生器的输入端。XTAL2振荡器反相放大器的输出端。四、电路和程序调试过程与结果(1)设计逻辑图:(2)部分程序代码#includereg52.h//调用单片机头文件#defineucharunsignedchar//无符号字符型宏定义变量范围0~255#defineuintunsignedint//无符号整型宏定义变量范围0~65535//数码管段选定义0123456789ucharcodesmg_du[]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05,//ABCDEF不显示0x06,0xa4,0x9c,0x64,0x8c,0x8e,0xff};//断码//数码管位选定义sbitsmg_we1=P2^0;//数码管位选定义sbitsmg_we2=P2^2;sbitsmg_we3=P2^4;sbitsmg_we4=P2^6;uchardis_smg[8]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84};ucharsmg_i=3;//显示数码管的个位数sbitdq=P3^3;//18b20IO口的定义bitflag_wd_z_f;//正负温度inttemperature;///***********************1ms延时函数*****************************/voiddelay_1ms(uintq){uinti,j;for(i=0;iq;i++)for(j=0;j120;j++);}/***********************小延时函数*****************************/voiddelay_uint(uintq){while(q--);}/***********************数码位选函数*****************************/voidsmg_we_switch(uchari){switch(i){case0:smg_we1=0;smg_we2=1;smg_we3=1;smg_we4=1;break;case1:smg_we1=1;smg_we2=0;smg_we3=1;smg_we4=1;break;case2:smg_we1=1;smg_we2=1;smg_we3=0;smg_we4=1;break;case3:smg_we1=1;smg_we2=1;smg_we3=1;smg_we4=0;break;}}/***********************数码显示函数*****************************/voiddisplay(){staticuchari;i++;if(i=smg_i)i=0;P0=0xff;//消隐smg_we_switch(i);//位选P0=dis_smg[i];//段选}/***********************18b20初始化函数*****************************/voidinit_18b20(){bitq;dq=1;//把总线拿高delay_uint(1);//15usdq=0;//给复位脉冲delay_uint(80);//750usdq=1;//把总线拿高等待delay_uint(10);//110usq=dq;//读取18b20初始化信号delay_uint(20);//200usdq=1;//把总线拿高释放总线}/*************写18b20内的数据***************/voidwrite_18b20(uchardat){uchari;for(i=0;i8;i++){//写数据是低位开始dq=0;//把总线拿低写时间隙开始dq=dat&0x01;//向18b20总线写数据了delay_uint(5);//60usdq=1;//释放总线dat=1;}}/*************读取18b20内的数据***************/ucharread_18b20(){uchari,value;for(i=0;i8;i++){dq=0;//把总线拿低读时间隙开始value=1;//读数据是低位开始dq=1;//释放总线if(dq==1)//开始读写数据value|=0x80;delay_uint(5);//60us读一个时间隙最少要保持60us的时间}returnvalue;//返回数据}/*************读取温度的值读出来的是小数***************/uintread_temp(){uintvalue;ucharlow;init_18b20();//初始化18b20write_18b20(0xcc);//跳过64位ROMwrite_18b20(0x44);//启动一次温度转换命令delay_uint(50);//500usinit_18b20();//初始化18b20EA=0;write_18b20(0xcc);//跳过64位ROMwrite_18b20(0xbe);//发出读取暂存器命令low=read_18b20();//读温度低字节value=read_18b20();//读温度高字节EA=1;value=8;//把温度的高位左移8位value|=low;//把读出的温度低位放到value的低八中if((value&0xf000)==0xf000){flag_wd_z_f=1;//负温度}elseflag_wd_z_f=0;//正温度value*=0.625;//转换到温度值小数returnvalue;//返回读出的温度}/*************定时器0初始化程序***************/voidtime_init(){EA=1;//开总中断TMOD=0X01;//定时器0、定时器1工作方式1ET0=1;//开定时器0中断TR0=1;//允许定时器0定时}/****************主函数***************/voidmain(){P0=P1=P2=P3=0xff;time_init();//初始化定时器temperature=read_temp();//先读出温度的值delay_1ms(650);temperature=read_temp();//先读出温度的值dis_smg[0]=smg_du[temperature%10];//取温度的小数显示dis_smg[1]=smg_du[temperature/10%10]&0xfb;//取温度的个位显示dis_smg[2]=smg_du[temperature/100%10];//取温度的十位显示while(1){temperature=read_temp();//先读出温度的值if(flag_wd_z_f==1)//负温度{smg_i=4;dis_smg[0]=smg_du[temperature%10];//取温度的小数显示dis_smg[1]=smg_du[temperature/10%10]&0xfb;//取温度的个位显示dis_smg[2]=smg_du[temperature/100%10];//取温度的十位显示dis_smg[3]=0xef;//负号}else{if(temperature=1000){smg_i=4;dis_smg[0]=smg_du[temperature%10];//取温度的小数显示dis_smg[1]=smg_du[temperature/10%10]&0xfb;//取温度的个位显示dis_smg[2]=smg_du[temperature/100%10];//取温度的十位显示dis_smg[3]=smg_du[temperature/1000%10];//取温度的十位显示}else{smg_i=3;dis_smg[0]=smg_du[temperature%10];//取温度的小数显示dis_smg[1]=smg_du[temperature/10%10]&0xfb;//取温度的个位显示dis_smg[2]=smg_du[temperature/100%10];//取温度的十位显示}}delay_1ms(300);}}/*************定时器0中断服务程序***************/voidtime0_int()interrupt1{TH0=0xf8;TL0=0x30;//2msdisplay();//数码管显示函数}(3)PCB板实物图:(4)、调试过程与结果1)调试:接入5V电源,观察数码管是否有显示。若没有,则先用万用表测量电路是否短路或者虚焊,进一步检测元件是否因为焊接过程中热量过高而烧坏。若有,则按下温度选择开关,调节温度的范围。2)载入程序并检测:将写好的程序通过软件写入STC89C52RC芯片中,装入电路。接入5V电源,看电路是否符合设计要求,能否正常工作。(5)元件清单五、总结回顾这次课程设计,至今仍感慨颇多。自从拿到课程设计的题目到整个编程,从理论到实践,在几个星期里,不仅巩固了所学知识,更是通过多种途径学会了多种之前没有掌握的知识。通过这次课程设计,我懂得了只是有理论是不够的,在实践中还是有很多问题需要多加思考,在实践中将理论得出,才能真正地融会贯通,才能提升自己的动手能力,自己的设计能力,以及思考能力。在设计中,我们遇到了问题,但经过查找资料解决了一些,但是还
本文标题:单片机设计数字温度计
链接地址:https://www.777doc.com/doc-2594613 .html