基于PIC16F877单片机与DS18B20的温度采集与显示.doc_第1页
基于PIC16F877单片机与DS18B20的温度采集与显示.doc_第2页
基于PIC16F877单片机与DS18B20的温度采集与显示.doc_第3页
基于PIC16F877单片机与DS18B20的温度采集与显示.doc_第4页
基于PIC16F877单片机与DS18B20的温度采集与显示.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计报告河北联合大学轻工学院QINGGONG COLLEGE, HEBEI UNITED UNIVERSITYPIC单片机课程设计学生姓名: 肖晓峰 学 号: 201124520121 学 部:信息科学技术部专业班级: 电信1 指导教师: 曹义 2014年7月4日一、课程设计目的本课程设计是在PIC单片机原理及应用及单片机C语言编程课程的基础上,通过硬件设计、软件编程及仿真调试的实践,进一步掌握PIC单片机的应用方法,熟练掌握PICC C语言程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。二、设计题目及要求2.1 设计题目:基于PIC16F877单片机与DS18B20的温度采集与显示2.2 功能实现:实时温度显示,并具有超限报警功能。输出显示采用LCD1602。2.3 设计要求:自己设计硬件和程序编程,画出完整的电路原理图,用Multisim或Proteus仿真,最终可实现脱机运行。三、设计原理说明3.2 显示模块如用LCD1602作为显示设备,要求显示屏分两行显示,第一行显示日期(年-月-日)和星期,第二行显示时间(时:分:秒)和温度。显示秒由00一直加到59,分钟数也由00加到59,小时采用24小时制,由00加到23,如此循环显示。3.3 按键模块按键用来作为时间调整。要求至少设计4个按键,按键1作为设置键;按键2、按键3分别为增加、减少键,在设置键按下时,此两个按键方有效;按键4是确定键,在设置键按下时方才有效。3.4 温度采集模块DS18B20是美国DALLAS公司推出的单总线数字温度传感器。DS18B20内部集成了温敏元件、数据转换芯片、存储器芯片和计算机接口芯片等多功能模块。其主要技术特点有:具有独特的单线接口方式;可以通过数据线供电,具有超低功耗工作方式;测温范围为-55125,测温精度为0.5;温度转换精度912位可编程,直接将温度转换值以二进制数码的方式串行输出。四、硬件原理图(含原理图、电路仿真图)图2电路仿真图 五、软件设计(含流程图、带注释的程序清单)程序设计流程图初始化picLcd,ds18b20否是否为正数Ds18b20复位,是否应答验证,开始温度转换并读取显示取补码,加1否是是 主文件 he/*/#include_CONFIG(0x3B31);/芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡/宏定义#define DQ RC1 /温度数据口#define DQ_HIGH() TRISC1=1#define DQ_LOW() TRISC1=0;DQ=0#define uchar unsigned char#define uint unsigned int#define RS RA0 /LCD功能选择位#define RW RA1 /读写选择#define EN RA2 /使能/变量定义int temper;char f = 0 ;uchar a1,a2,a3,a4;uchar Prompt=P1ress K1 - K3 To Start Demo Prog;/各种申明void init();void DelayMS(uint ms);uchar Busy_Check();void Write_LCD_Command(uchar cmd);void Write_LCD_Data(uchar dat);void Initialize_LCD();void ShowString(uchar x,uchar y,uchar *str);void Showword0(uchar x,uchar y,char word );void Showword1(char word );void write_shuzi(uchar num1,uchar num2,uchar num3,uchar num4);/18b20void delay(uint x);void delayus(uint,uchar);void init();void write_byte(uchar date);uchar read_byte();void get_tem();/*子函数*/ /系统初始化函数void init() ADCON1=0X07; /设置A口为普通数字口 TRISA =0X00; /设置A口方向为输出TRISB =0x00; OPTION=0x00; /B口电阻上拉TRISC = 1; PORTC = 0x20; TRISD =0X00; TRISD =0x00; /延时函数void delayus(uint x,uchar y)uint i;uchar j;for(i=x;i0;i-);for(j=y;j0;j-);void delay(uint x)uint a,b;for(a=x;a0;a-)for(b=110;b0;b-);/ds18b20复位函数void reset()uchar st=1;DQ_HIGH(); /开始于高电平NOP();NOP(); /延时2uswhile(st) DQ_LOW();delayus(70,30); /750DQ_HIGH(); /释放总线delayus(4,4); /等70if(DQ=1) /应答判断st=1; elsest=0; delayus(50,10); /延时450/ds18b20写函数void write_byte(uchar date)uchar i,temp;DQ_HIGH(); /开始于高电平NOP();NOP();for(i=8;i0;i-) temp=date&0x01;/01010101 /分位写入DQ_LOW();delayus(0,0); /15if(temp=1)DQ_HIGH();delayus(2,2); /45DQ_HIGH();date=date1;/00101010/ds18b20读函数uchar read_byte()uchar i,date;static bit j;for(i=8;i0;i-)date=date1;DQ_HIGH(); /开始于高电平NOP();NOP();DQ_LOW();NOP();NOP();NOP();NOP();NOP();NOP(); /6DQ_HIGH();NOP();NOP();NOP();NOP(); /4j=DQ; /读取总线if(j=1)date=date|0x80;/1000 0000delayus(1,1); /30return (date); /返回函数值/温度读取处理函数void get_tem()uchar tem1,tem2,num;float aaa;reset(); /复位write_byte(0xCC);/跳过ROMwrite_byte(0x44);/温度转换reset();write_byte(0xCC); /跳过ROMwrite_byte(0xBE); /温度传递tem1=read_byte(); /读取低8位tem2=read_byte();/读取高8位if(tem27) /符号判断tem2=255-tem2; tem1=255-tem1; f=1; else f=0; aaa=(tem2*256+tem1)*6.25*8; /转化为实际温度值temper=(int)aaa; /强行转化位整数a1=temper/1000; /十进制分位a2=temper%1000/100;a3=temper%100/10;a4=temper%10; if(a17|a15) RD7=1;else RD7=0;/延时void DelayMS(uint ms) /毫秒uchar i;while(ms-) for(i=0;i120;i+);/LCD忙检查函数uchar Busy_Check()uchar LCD_Status;RS=0;/寄存器选择(0指令1数据)RW=1;/读状态寄存器EN=1;/开始读DelayMS(1);LCD_Status=PORTB;EN=0;return LCD_Status;/写LCD命令函数void Write_LCD_Command(uchar cmd)/while(Busy_Check()&0x80)=0x80);/忙等待RS=0;/选择命令寄存器RW=0;/写EN=0;PORTB=cmd;EN=1;DelayMS(1);EN=0;/LCD发送数据函数void Write_LCD_Data(uchar dat)/while(Busy_Check()&0x80)=0x80);/忙等待RS=1;RW=0;EN=0;PORTB=dat;EN=1;DelayMS(1);EN=0;/LCD初始化函数void Initialize_LCD()Write_LCD_Command(0x38);DelayMS(1); /38:数据长8位,两行显示,字体5*7点阵(80)Write_LCD_Command(0x01);DelayMS(1);/清屏Write_LCD_Command(0x06);DelayMS(1);/字符进入模式:屏幕不动,字符后移Write_LCD_Command(0x0c);DelayMS(1);/显示开,光标关;0x0e是开光标/显示字符函数void Showword0(uchar x,uchar y,char word ) /y:行地址,x:列地址 if(y=0) Write_LCD_Command(0x80|x);/设置显示起始位置(x,0)第一行if(y=1) Write_LCD_Command(0xc0|x); / (x,1)第二行 Write_LCD_Data(word+0x30); /stri等价于*(str+i)/显示温度函数void write_shuzi(uchar num1,uchar num2,uchar num3,uchar num4) if(f)Showword0(0,0,-3 ); /负号Showword0(1,0,num1 ); /十位Showword0(2,0,num2 );Showword0(3,0,-2 ); /小数点Showword0(4,0,num3 );Showword0(5,0,num4 );DelayMS(5);/主函数void main() init(); /调用系统初始化函数 Initialize_LCD(); /LCD初始化while

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论