余昌乐单片机课程设计.docx
- 文档编号:6979686
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:20
- 大小:190.79KB
余昌乐单片机课程设计.docx
《余昌乐单片机课程设计.docx》由会员分享,可在线阅读,更多相关《余昌乐单片机课程设计.docx(20页珍藏版)》请在冰点文库上搜索。
余昌乐单片机课程设计
单片机课程设计
题目单片机课程设计
院系信息与电气工程学院
班级电子信息工程一班
学号158840011
学生姓名余昌乐
指导教师许童羽
成绩
2013年12月
1、设计目的
用51单片机(本次设计用STC89C52)控制温度传感器(本次用数字温度传感器DS18B20)来实现实时的温度测量,然后用单片机控制显示器件(本次设计用LCD1602)来把温度显示出来。
就我个人而言,除了这部分的基本操作之外,还设计了一部分扩展功能,就是实时时钟的实现,并用显示器件将其显示出来。
2、设计原理
1、STC89C52
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
2、DS18B20
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V至5.5V无需备用电源测量温度范围为-55°C至+125°C。
华氏相当于是-67°F到257华氏度-10°C至+85°C范围内精度为±0.5°C。
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
延时模块的源文件:
#include"reg52.h"
#include"intrins.h"
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
//毫秒的延时函数
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
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
voidTIME0_Init(void);
#endif
实时时钟的源文件:
#include"reg52.h"
#include"time.h"
#defineucharunsignedchar
#defineuintunsignedint
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;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
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
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^3;//ds18b20数据位接口
bitds18b20_start(void);
voidds18b20_write(uchardat);
uchards18b20_read(void);
voidds18b20_init(void);
#endif
DS18B20源文件:
#include"reg52.h"
#include"intrins.h"
#include"ds18b20.h"
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
uchartable_rom[8];
/*ds18b20的开始函数设置*/
bitds18b20_start(void)
{
uchartime;
bitflag;
DQ=1;
_nop_();
_nop_();
DQ=0;
for(time=0;time<200;time++);
DQ=1;
for(time=0;time<20;time++);
flag=DQ;
for(time=0;time<100;time++);
returnflag;
}
/*向ds18b20中写入数据*/
voidds18b20_write(uchardat)
{
uchari,time;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=dat&0x01;
for(time=0;time<10;time++);
DQ=1;
for(time=0;time<10;time++);
dat=dat>>1;
}
for(time=0;time<5;time++);
}
/*从ds18b20中读数*/
uchards18b20_read(void)
{
uchari,time;
uchardat;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
for(time=0;time<2;time++);
dat=dat>>1;
if(DQ==1)
dat=dat|0x80;
else
dat=dat|0x00;
for(time=0;time<10;time++);
}
returndat;
}
/*ds18b20的初始化函数*/
voidds18b20_init(void)
{
ds18b20_start();
/*ds18b20_write(0xcc);//跳过ROM
ds18b20_write(0x44);//温度转换指令
delay_ms(500);//500毫秒的延时
ds18b20_start();
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]);
ds18b20_write(0x44);
delay_ms(400);
ds18b20_start();
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]);
ds18b20_write(0xbe);
}
4、LCD1602模块设计,主要是液晶模块的初始化,为温度和实时时钟的显示提供支持。
LCD1602模块的头文件:
#ifndef__LCD1602_H
#define__LCD1602_H
#include"reg52.h"
#include"intrins.h"
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
voidlcd1602_write_com(ucharcom);
voidlcd1602_write_dat(uchardat);
voidlcd1602_init(void);
#endif
LCD1602模块的源文件:
#include"reg52.h"
#include"intrins.h"
#include"lcd1602.h"
#include"delay.h"
#defineucharunsignedchar
#defineuintunsignedint
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;
delay_ms
(1);
lcden=0;
}
/*向lcd1602中写数据的子函数*/
voidlcd1602_write_dat(uchardat)
{
lcdrs=1;
lcdrw=0;
lcden=0;
P0=dat;
delay_ms
(1);
lcden=1;
delay_ms
(1);
lcden=0;
}
/*lcd1602初始化配置函数*/
voidlcd1602_init(void)
{
lcd1602_write_com(0x38);
delay_ms(10);
lcd1602_write_com(0x0c);
lcd1602_write_com(0x06);
lcd1602_write_com(0x01);
}
5、主函数模块,这部分是本次程序设计的主体,这部分通过对其他几个模块的调用可以很好地实现程序的功能。
#include"reg52.h"
#include"intrins.h"
#include"delay.h"
#include"ds18b20.h"
#include"lcd1602.h"
#include"time.h"
#defineucharunsignedchar
#defineuintunsignedint
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_start();
ds18b20_write(0x33);
for(temp=0;temp<8;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)
{
uchartemp;
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);
for(temp=0;temp<8;temp++)
{
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 昌乐 单片机 课程设计