PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx
《PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx》由会员分享,可在线阅读,更多相关《PIC LCD1602 DS18B20 单片机课程设计报告轻院.docx(14页珍藏版)》请在冰豆网上搜索。
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仿真现象和计算机的性能有关,不同的计算机性能对同一程序的仿真,会有一定的差异,单是对程序运行时间长度的仿真是精确的。
设计成绩:
教师签名:
年月日