51单片机课程设计Word格式.docx
- 文档编号:22508178
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:12
- 大小:859.26KB
51单片机课程设计Word格式.docx
《51单片机课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
年月日
课程设计评语
成绩:
年月日
一、设计目的
本次的设计主要是利用了单片机80C51和数字温度传感器DS18B20测量温度信号,计算后可以在LCD数码管1602上显示相应的温度值。
二、设计指标
温度测量范围为-55~125℃,精确度为0.1℃。
三、总体框图设计
主函数流程图
四、功能模块及原理说明
温度计采用80C51单片机作为微处理器,温度计系统的外围接口电路由晶振、LCD显示电路、复位电路、温度检测电路、LCD驱动电路。
温度计系统的的硬件电路图如下图所示。
温度计的工作过程是:
初始化其接收需要检测的温度,并一直处于检测状态,并将检测到的温度值读取,并转化为十进制数值,通过LCD显示出来,再显示温度,方便用户来读数使用记录数据。
具体实现方法是:
单片机将从P3.3管脚读进来的数据进行处理,P0.1到P0.7为数码管的段选端口,通过RP1的驱动对LCD进行驱动。
五、设计验证
数字温度计程序代码如下:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^3;
//ds18b20与单片机连接口
sbitRS=P2^4;
//数据/命令选择
sbitRW=P2^5;
//读写选择
sbitEN=P2^6;
//使能信号
unsignedcharcodestr1[]={"
temperature:
"
};
unsignedcharcodestr2[]={"
uchardatadisdata[5];
uinttvalue;
//温度值
uchartflag;
//温度正负标志
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{unsignedinti,j;
for(i=0;
i<
ms;
i++)
for(j=0;
j<
100;
j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
//RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
RW=0;
//R/W为读写信号,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址。
EN=0;
//E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
P0=com;
//写指令
delay1ms
(1);
EN=1;
voidwr_dat(unsignedchardat)//写数据//
RS=1;
//RS为寄存器选择,高电平时选择数据寄存器
//R/W为读写信号线,低电平时进行写操作.当RS为高电平R/W为低电平时可以写入数据
P0=dat;
//写数据
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
voiddisplay(unsignedchar*p)//显示//
{while(*p!
='
\0'
)
{wr_dat(*p);
p++;
init_play()//初始化显示
{lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/*********************ds1820程序************************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{while(i--);
voidds1820rst()/*ds1820复位*/
{unsignedcharx=0;
DQ=1;
//DQ复位
delay_18B20(4);
//延时
DQ=0;
//DQ拉低
delay_18B20(100);
//精确延时大于480us
//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
{DQ=0;
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
delay_18B20(10);
return(dat);
voidds1820wr(ucharwdata)/*写数据*/
i>
i--)
{DQ=0;
DQ=wdata&
0x01;
wdata>
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);
//*跳过读序列号*/
ds1820wr(0x44);
//*启动温度转换*/
ds1820wr(0xbe);
//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<
<
=8;
tvalue=tvalue|a;
if(tvalue<
0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
tvalue=tvalue*(0.625);
//温度值扩大10倍,精确到1位小数
return(tvalue);
/*******************************************************************/voidds1820disp()//温度值显示
{ucharflagdat;
disdata[0]=tvalue/1000+0x30;
//百位数
disdata[1]=tvalue%1000/100+0x30;
//十位数
disdata[2]=tvalue%100/10+0x30;
//个位数
disdata[3]=tvalue%10+0x30;
//小数位
if(tflag==0)
flagdat=0x20;
//正温度不显示符号
flagdat=0x2d;
//负温度显示负号:
-
if(disdata[0]==0x30)
{disdata[0]=0x20;
//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;
//如果百位为0,十位为0也不显示
wr_com(0xc0);
wr_dat(flagdat);
//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);
//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);
//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);
//显示个位
wr_com(0xc4);
wr_dat(0x2e);
//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);
//显示小数位
/********************主程序***********************************/
voidmain()
{init_play();
//初始化显示
while
(1)
{
read_temp();
//读取温度
ds1820disp();
//显示
程序运行结果如图:
六、总结
通过本次课程设计我感觉自己收获很多,本次实验是我们在上次做的一个用1602显示时间程序的基础上改进而来的,我们上次实验中遇到了很多问题,运行结果一直显示不出来,最后在老师的帮助下解决了,这个过程中我学会了一些解决问题的方法。
本次试验过程中我了解了DS18B20的相关知识和应用,并通过烧写程序用单片机显示温度,感觉不仅收获了知识而且整个过程比较有意思。
当然我们还有一些不足,程序设计功能单一,使用范围有限,一些错误信息考虑不到位,有待于进一步改进,例如利用本次实验设计的整体思路还可以测量空气中的湿度,颗粒物含量等。
能够顺利完成本次实验设计我还要感谢我的团队成员,在和我团队成员的相处中我们有过不一致的意见和看法,因为我的急躁,甚至还发生过一些小小的不愉快,但最后我们都以大局为重,整个过程相处比较和睦,这对我以后与人相处都有所帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 课程设计