余昌乐单片机课程设计.docx

上传人:b****4 文档编号:5442881 上传时间:2022-12-16 格式:DOCX 页数:20 大小:190.79KB
下载 相关 举报
余昌乐单片机课程设计.docx_第1页
第1页 / 共20页
余昌乐单片机课程设计.docx_第2页
第2页 / 共20页
余昌乐单片机课程设计.docx_第3页
第3页 / 共20页
余昌乐单片机课程设计.docx_第4页
第4页 / 共20页
余昌乐单片机课程设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

余昌乐单片机课程设计.docx

《余昌乐单片机课程设计.docx》由会员分享,可在线阅读,更多相关《余昌乐单片机课程设计.docx(20页珍藏版)》请在冰豆网上搜索。

余昌乐单片机课程设计.docx

余昌乐单片机课程设计

 

单片机课程设计

 

题目单片机课程设计

院系信息与电气工程学院

班级电子信息工程一班

学号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_

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

当前位置:首页 > 经管营销 > 销售营销

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

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