余昌乐单片机课程设计Word文件下载.docx
- 文档编号:18430386
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:20
- 大小:190.79KB
余昌乐单片机课程设计Word文件下载.docx
《余昌乐单片机课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《余昌乐单片机课程设计Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
华氏相当于是-67°
F到257华氏度-10°
C至+85°
C范围内精度为±
0.5°
3、LCD1602
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
3、设计功能模块
本部分主要是进行相关的软件模块的设计,因为我们都知道不可能把所有的程序都写到一个主源文件中,这样不但写程序不好写,就连可读性也大大下降了,所以模块化的程序是必须的。
模块化设计就是通过相应的头文件和源文件的设计,同时一定要注意模块的高内聚、低耦合。
1、延时模块的设计
延时模块的头文件:
#ifndef__DELAY_H
#define__DELAY_H
#include"
reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
voiddelay_ms(uintms);
voiddelay_us(uintus);
#endif
延时模块的源文件:
intrins.h"
delay.h"
//毫秒的延时函数
voiddelay_ms(uintms)
{
uchari;
while(ms--)
{
for(i=0;
i<
115;
i++);
}
}
//微妙的延时函数
voiddelay_us(uintus)
while(us--)
_nop_();
2、实时时钟走时模块的设计,主要通过定时器来产生秒定时,并通过定时器中断来实现。
实时时钟走时的头文件:
#ifndef__TIME_H
#define__TIME_H
voidTIME0_Init(void);
实时时钟的源文件:
time.h"
uchartime0_count;
ucharshi,fen,miao;
voidTIME0_Init(void)
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
voidTIME0(void)interrupt1
time0_count=time0_count+1;
if(time0_count==20)
time0_count=0;
miao=miao+1;
if(miao==60)
{
miao=0;
fen=fen+1;
if(fen==60)
{
fen=0;
shi=shi+1;
if(shi==24)
{
shi=0;
}
}
}
3、DS18B20模块设计,这部分主要的功能就是对温度传感器进行初始化。
DS18B20头文件:
#ifndef__DS18B20_H
#define__DS18B20_H
sbitDQ=P3^3;
//ds18b20数据位接口
bitds18b20_start(void);
voidds18b20_write(uchardat);
uchards18b20_read(void);
voidds18b20_init(void);
DS18B20源文件:
ds18b20.h"
uchartable_rom[8];
/*ds18b20的开始函数设置*/
bitds18b20_start(void)
uchartime;
bitflag;
DQ=1;
_nop_();
DQ=0;
for(time=0;
time<
200;
time++);
20;
flag=DQ;
100;
returnflag;
/*向ds18b20中写入数据*/
voidds18b20_write(uchardat)
uchari,time;
for(i=0;
8;
i++)
DQ=1;
DQ=0;
DQ=dat&
0x01;
for(time=0;
10;
dat=dat>
>
1;
5;
/*从ds18b20中读数*/
uchards18b20_read(void)
uchardat;
2;
if(DQ==1)
dat=dat|0x80;
else
dat=dat|0x00;
returndat;
/*ds18b20的初始化函数*/
voidds18b20_init(void)
ds18b20_start();
/*ds18b20_write(0xcc);
//跳过ROM
ds18b20_write(0x44);
//温度转换指令
delay_ms(500);
//500毫秒的延时
ds18b20_write(0xcc);
ds18b20_write(0xbe);
*///读取温度的指令
ds18b20_write(0x55);
ds18b20_write(table_rom[0]);
ds18b20_write(table_rom[1]);
ds18b20_write(table_rom[2]);
ds18b20_write(table_rom[3]);
ds18b20_write(table_rom[4]);
ds18b20_write(table_rom[5]);
ds18b20_write(table_rom[6]);
ds18b20_write(table_rom[7]);
delay_ms(400);
4、LCD1602模块设计,主要是液晶模块的初始化,为温度和实时时钟的显示提供支持。
LCD1602模块的头文件:
#ifndef__LCD1602_H
#define__LCD1602_H
voidlcd1602_write_com(ucharcom);
voidlcd1602_write_dat(uchardat);
voidlcd1602_init(void);
LCD1602模块的源文件:
lcd1602.h"
sbitlcdrs=P2^0;
//指令、数据选择位
sbitlcdrw=P2^1;
//读、写选择位
sbitlcden=P2^2;
//LCD1602使能位
/*向lcd1602中写指令的函数*/
voidlcd1602_write_com(ucharcom)
lcdrs=0;
lcdrw=0;
lcden=0;
P0=com;
delay_ms
(1);
lcden=1;
/*向lcd1602中写数据的子函数*/
voidlcd1602_write_dat(uchardat)
lcdrs=1;
P0=dat;
/*lcd1602初始化配置函数*/
voidlcd1602_init(void)
lcd1602_write_com(0x38);
delay_ms(10);
lcd1602_write_com(0x0c);
lcd1602_write_com(0x06);
lcd1602_write_com(0x01);
5、主函数模块,这部分是本次程序设计的主体,这部分通过对其他几个模块的调用可以很好地实现程序的功能。
sbitK5=P1^4;
//K5控制校时的类型
sbitK6=P1^5;
//K6加一计数
sbitK7=P1^6;
//K7减一计数
ucharflag,flag1,K5_Num;
//flag时间控制与显示的标志位,flag1温度的负号标志位
voidread_ds18b20_rom(void);
//读取DS18B20的64位ROM
voidds18b20_rom_display(void);
//DS18B20ROM显示在LCD1602上
voidds18b20_temperature_display(void);
//温度显示
voidShiZhong_display(void);
//时钟显示
voidKEY_Scan_And_Control(void);
//通过扫描按键的校时函数
externuchartable_rom[8];
//存放DS18B20的64位ROM值
externucharshi,fen,miao;
//存储时间的三个全局变量
uchardisplay_temperature[4];
//存储温度数据
ucharcodetable_number[]=
"
0123456789ABCDEF"
};
/*显示温度的单位*/
ucharcodetable_tempature_signal[]=
0x10,0x06,0x09,0x08,
0x08,0x09,0x06,0x00
voidmain(void)
lcd1602_init();
read_ds18b20_rom();
ds18b20_rom_display();
TIME0_Init();
while
(1)
ds18b20_init();
display_temperature[0]=ds18b20_read();
//读取温度低八位
display_temperature[1]=ds18b20_read();
//读取温度的八位
ds18b20_temperature_display();
ShiZhong_display();
KEY_Scan_And_Control();
voidread_ds18b20_rom(void)
uchartemp;
ds18b20_write(0x33);
for(temp=0;
temp<
temp++)
table_rom[temp]=ds18b20_read();
voidds18b20_rom_display(void)
lcd1602_write_com(0x80+0x40+0x0e);
lcd1602_write_dat(table_number[table_rom[0]/16]);
lcd1602_write_dat(table_number[table_rom[0]%16]);
lcd1602_write_com(0x80+0x40+0x0c);
lcd1602_write_dat(table_number[table_rom[1]/16]);
lcd1602_write_dat(table_number[table_rom[1]%16]);
lcd1602_write_com(0x80+0x40+0x0a);
lcd1602_write_dat(table_number[table_rom[2]/16]);
lcd1602_write_dat(table_number[table_rom[2]%16]);
lcd1602_write_com(0x80+0x40+0x08);
lcd1602_write_dat(table_number[table_rom[3]/16]);
lcd1602_write_dat(table_number[table_rom[3]%16]);
lcd1602_write_com(0x80+0x40+0x06);
lcd1602_write_dat(table_number[table_rom[4]/16]);
lcd1602_write_dat(table_number[table_rom[4]%16]);
lcd1602_write_com(0x80+0x40+0x04);
lcd1602_write_dat(table_number[table_rom[5]/16]);
lcd1602_write_dat(table_number[table_rom[5]%16]);
lcd1602_write_com(0x80+0x40+0x02);
lcd1602_write_dat(table_number[table_rom[6]/16]);
lcd1602_write_dat(table_number[table_rom[6]%16]);
lcd1602_write_com(0x80+0x40+0x00);
lcd1602_write_dat(table_number[table_rom[7]/16]);
lcd1602_write_dat(table_number[table_rom[7]%16]);
voidds18b20_temperature_display(void)
if((display_temperature[1]&
0xf8)==0xf8)
flag1=1;
display_temperature[1]=~display_temperature[1];
display_temperature[0]=~display_temperature[0];
if(display_temperature[0]==0xff)
display_temperature[0]=0;
display_temperature[1]=display_temperature[1]+1;
else
flag1=0;
display_temperature[0]=display_temperature[0]+1;
display_temperature[2]=display_temperature[1]*16+display_temperature[0]/16;
display_temperature[3]=display_temperature[0]%16*10/16;
lcd1602_write_com(0x80+0x00);
lcd1602_write_dat(table_number[display_temperature[2]/100]);
lcd1602_write_dat(table_number[display_temperature[2]%100/10]);
lcd1602_write_dat(table_number[display_temperature[2]%10]);
lcd1602_write_dat('
.'
);
lcd1602_write_dat(table_number[display_temperature[3]]);
lcd1602_write_com(0x40);
lcd1602_write_dat(table_tempature_signal[temp]);
lcd1602_write_com(0x80+0x05);
lcd1602_write_dat(0x00);
if(flag1==1)
lcd1602_write_com(0x80+0x00);
lcd1602_write_dat('
-'
voidShiZhong_display(void)
if(flag1==0)
lcd1602_write_com(0x80+0x0e);
lcd1602_write_dat(table_number[miao/10]);
lcd1602_write_dat(table_number[miao%10]);
lcd1602_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 昌乐 单片机 课程设计