PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx

上传人:b****4 文档编号:24611829 上传时间:2023-05-29 格式:DOCX 页数:14 大小:205.78KB
下载 相关 举报
PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx_第1页
第1页 / 共14页
PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx_第2页
第2页 / 共14页
PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx_第3页
第3页 / 共14页
PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx_第4页
第4页 / 共14页
PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx

《PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx》由会员分享,可在线阅读,更多相关《PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx(14页珍藏版)》请在冰豆网上搜索。

PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx

PICLCD1602DS18B20单片机课程设计报告轻院

河北联合大学轻工学院

QINGGONGCOLLEGE,HEBEIUNITEDUNIVERSITY

《PIC单片机课程设计》

 

学生姓名:

肖晓峰

学号:

201124520121

学部:

信息科学技术部

专业班级:

电信1

指导教师:

曹义

2014年7月4日

一、课程设计目的

本课程设计是在《PIC单片机原理及应用》及《单片机C语言编程》课程的基础上,通过硬件设计、软件编程及仿真调试的实践,进一步掌握PIC单片机的应用方法,熟练掌握PICCC语言程序的编写与调试,是毕业设计前的一次重要实践,为今后走上工作岗位打下坚实的单片机应用基础。

 

二、设计题目及要求

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内部集成了温敏元件、数据转换芯片、存储器芯片和计算机接口芯片等多功能模块。

其主要技术特点有:

具有独特的单线接口方式;可以通过数据线供电,具有超低功耗工作方式;测温范围为-55℃~125℃,测温精度为0.5℃;温度转换精度9~12位可编程,直接将温度转换值以二进制数码的方式串行输出。

 

四、硬件原理图

(含原理图、电路仿真图)

图2电路仿真图

五、软件设计

(含流程图、带注释的程序清单)

程序设计流程图

 

 

主文件he

//**********************************************/

#include

__CONFIG(0x3B31);

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

//宏定义

#defineDQRC1//温度数据口

#defineDQ_HIGH()TRISC1=1

#defineDQ_LOW()TRISC1=0;DQ=0

#defineucharunsignedchar

#defineuintunsignedint

#defineRSRA0//LCD功能选择位

#defineRWRA1//读写选择

#defineENRA2//使能

//变量定义

inttemper;

charf=0;

uchara1,a2,a3,a4;

ucharPrompt[]="P1ressK1-K3ToStartDemoProg";

//各种申明

voidinit();

voidDelayMS(uintms);

ucharBusy_Check();

voidWrite_LCD_Command(ucharcmd);

voidWrite_LCD_Data(uchardat);

voidInitialize_LCD();

voidShowString(ucharx,uchary,uchar*str);

voidShowword0(ucharx,uchary,charword);

voidShowword1(charword);

voidwrite_shuzi(ucharnum1,ucharnum2,ucharnum3,ucharnum4);

//18b20

voiddelay(uintx);

voiddelayus(uint,uchar);

voidinit();

voidwrite_byte(uchardate);

ucharread_byte();

voidget_tem();

//***子函数****************************************/

//系统初始化函数

voidinit()

{

ADCON1=0X07;//设置A口为普通数字口

TRISA=0X00;//设置A口方向为输出

TRISB=0x00;

OPTION=0x00;//B口电阻上拉

TRISC=1;

PORTC=0x20;

TRISD=0X00;

TRISD=0x00;

}

//延时函数

voiddelayus(uintx,uchary)

{

uinti;

ucharj;

for(i=x;i>0;i--);

for(j=y;j>0;j--);

}

voiddelay(uintx)

{

uinta,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}

//ds18b20复位函数

voidreset()

{

ucharst=1;

DQ_HIGH();//开始于高电平

NOP();NOP();//延时2us

while(st)

{

DQ_LOW();

delayus(70,30);//750

DQ_HIGH();//释放总线

delayus(4,4);//等70

if(DQ==1)//应答判断

st=1;

else

st=0;

delayus(50,10);//延时450

}

}

//ds18b20写函数

voidwrite_byte(uchardate)

{

uchari,temp;

DQ_HIGH();//开始于高电平

NOP();NOP();

for(i=8;i>0;i--)

{

temp=date&0x01;//01010101//分位写入

DQ_LOW();

delayus(0,0);//15

if(temp==1)

DQ_HIGH();

delayus(2,2);//45

DQ_HIGH();

date=date>>1;//00101010

}

}

//ds18b20读函数

ucharread_byte()

{

uchari,date;

staticbitj;

for(i=8;i>0;i--)

{

date=date>>1;

DQ_HIGH();//开始于高电平

NOP();NOP();

DQ_LOW();

NOP();NOP();NOP();NOP();NOP();NOP();//6

DQ_HIGH();

NOP();NOP();NOP();NOP();//4

j=DQ;//读取总线

if(j==1)

date=date|0x80;//10000000

delayus(1,1);//30

}

return(date);//返回函数值

}

//温度读取处理函数

voidget_tem()

{

uchartem1,tem2,num;

floataaa;

reset();//复位

write_byte(0xCC);//跳过ROM

write_byte(0x44);//温度转换

reset();

write_byte(0xCC);//跳过ROM

write_byte(0xBE);//温度传递

tem1=read_byte();//读取低8位

tem2=read_byte();//读取高8位

if(tem2>7)//符号判断

{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(a1>7||a1<5)RD7=1;

elseRD7=0;

}

//延时

voidDelayMS(uintms)//毫秒

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//LCD忙检查函数

ucharBusy_Check()

{

ucharLCD_Status;

RS=0;//寄存器选择(0指令1数据)

RW=1;//读状态寄存器

EN=1;//开始读

DelayMS

(1);

LCD_Status=PORTB;

EN=0;

returnLCD_Status;

}

//写LCD命令函数

voidWrite_LCD_Command(ucharcmd)

{

//while((Busy_Check()&0x80)==0x80);//忙等待

RS=0;//选择命令寄存器

RW=0;//写

EN=0;

PORTB=cmd;EN=1;DelayMS

(1);EN=0;

}

//LCD发送数据函数

voidWrite_LCD_Data(uchardat)

{

//while((Busy_Check()&0x80)==0x80);//忙等待

RS=1;RW=0;EN=0;PORTB=dat;EN=1;DelayMS

(1);EN=0;

}

//LCD初始化函数

voidInitialize_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是开光标

}

//显示字符函数

voidShowword0(ucharx,uchary,charword)//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);//str[i]等价于*(str+i)

}

//显示温度函数

voidwrite_shuzi(ucharnum1,ucharnum2,ucharnum3,ucharnum4)

{

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);

}

//主函数

voidmain()

{

init();//调用系统初始化函数

Initialize_LCD();//LCD初始化

while

(1)

{get_tem();//读取温度

write_shuzi(a1,a2,a3,a4);//显示

}

}

 

六、设计总结

1打好基础,清楚硬件工作原理,性能,以便于编程。

2程序调试要一步一步想清楚,思路清晰,知道每一步是要做什么,一步一调试,不然某些错误很难找到原因。

3程序模块化,方便以后调用,

4仿真现象和计算机的性能有关,不同的计算机性能对同一程序的仿真,会有一定的差异,单是对程序运行时间长度的仿真是精确的。

 

 

设计成绩:

教师签名:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1