ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:190.79KB ,
资源ID:5442881      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5442881.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(余昌乐单片机课程设计.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、余昌乐单片机课程设计单片机课程设计题 目 单片机课程设计 院 系 信息与电气工程学院 班 级 电子信息工程一班 学 号 158840011 学生姓名 余昌乐 指导教师 许童羽 成 绩 2013年12月1、设计目的用51单片机(本次设计用STC89C52)控制温度传感器(本次用数字温度传感器DS18B20)来实现实时的温度测量,然后用单片机控制显示器件(本次设计用LCD1602)来把温度显示出来。就我个人而言,除了这部分的基本操作之外,还设计了一部分扩展功能,就是实时时钟的实现,并用显示器件将其显示出来。2、设计原理1、STC89C52STC89C52是STC公司生产的一种低功耗、高性能CMOS

2、8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑

3、操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。2、DS18B20DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。

4、耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。独特的一线接口,只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 C至+125 C。华氏相当于是-67F到257华氏度 -10C至+85C范围内精度为0.5 C。3、LCD16021602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间

5、距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。3、设计功能模块本部分主要是进行相关的软件模块的设计,因为我们都知道不可能把所有的程序都写到一个主源文件中,这样不但写程序不好写,就连可读性也大大下降了,所以模块化的程序是必须的。模块化设计就是通过相应的头文件和源文件的设计,同时一定要注意模块的高内聚、低耦

6、合。1、延时模块的设计延时模块的头文件:#ifndef _DELAY_H#define _DELAY_H#include reg52.h#define uchar unsigned char#define uint unsigned intvoid delay_ms(uint ms);void delay_us(uint us);#endif延时模块的源文件:#include reg52.h#include intrins.h#include delay.h#define uchar unsigned char#define uint unsigned int/毫秒的延时函数void dela

7、y_ms(uint ms) uchar i; while(ms-) for(i=0;i115;i+); /微妙的延时函数void delay_us(uint us) while(us-) _nop_(); 2、实时时钟走时模块的设计,主要通过定时器来产生秒定时,并通过定时器中断来实现。实时时钟走时的头文件:#ifndef _TIME_H#define _TIME_H#include reg52.h#define uchar unsigned char#define uint unsigned intvoid TIME0_Init(void);#endif实时时钟的源文件:#include re

8、g52.h#include time.h#define uchar unsigned char#define uint unsigned intuchar time0_count;uchar shi,fen,miao;void TIME0_Init(void) TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1;void TIME0(void) interrupt 1 time0_count=time0_count+1; TH0=(65536-50000)/256; TL0=(65536-500

9、00)%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#define uchar unsigned char#define uint unsigned intsbit DQ=P33; /d

10、s18b20数据位接口bit ds18b20_start(void);void ds18b20_write(uchar dat);uchar ds18b20_read(void);void ds18b20_init(void);#endifDS18B20源文件:#include reg52.h#include intrins.h#include ds18b20.h#include delay.h#define uchar unsigned char#define uint unsigned intuchar table_rom8;/*ds18b20的开始函数设置*/bit ds18b20_st

11、art(void) uchar time; bit flag; DQ=1; _nop_(); _nop_(); DQ=0; for(time=0;time200;time+); DQ=1; for(time=0;time20;time+); flag=DQ; for(time=0;time100;time+); return flag;/*向ds18b20中写入数据*/void ds18b20_write(uchar dat) uchar i,time; for(i=0;i8;i+) DQ=1; _nop_(); DQ=0; _nop_(); DQ=dat&0x01; for(time=0;t

12、ime10;time+); DQ=1; for(time=0;time1; for(time=0;time5;time+);/*从ds18b20中读数*/uchar ds18b20_read(void) uchar i,time; uchar dat; for(i=0;i8;i+) DQ=1; _nop_(); DQ=0; _nop_(); DQ=1; for(time=0;time1; if(DQ=1) dat=dat|0x80; else dat=dat|0x00; for(time=0;time10;time+); return dat;/*ds18b20的初始化函数*/void ds1

13、8b20_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_rom0); ds18b20_write(table_rom1); ds18b20_write(table_rom2); ds18b20_wr

14、ite(table_rom3); ds18b20_write(table_rom4); ds18b20_write(table_rom5); ds18b20_write(table_rom6); ds18b20_write(table_rom7); ds18b20_write(0x44); delay_ms(400); ds18b20_start(); ds18b20_write(0x55); ds18b20_write(table_rom0); ds18b20_write(table_rom1); ds18b20_write(table_rom2); ds18b20_write(table_

15、rom3); ds18b20_write(table_rom4); ds18b20_write(table_rom5); ds18b20_write(table_rom6); ds18b20_write(table_rom7); ds18b20_write(0xbe);4、LCD1602模块设计,主要是液晶模块的初始化,为温度和实时时钟的显示提供支持。LCD1602模块的头文件:#ifndef _LCD1602_H#define _LCD1602_H#include reg52.h#include intrins.h#include delay.h#define uchar unsigned

16、char#define uint unsigned intvoid lcd1602_write_com(uchar com);void lcd1602_write_dat(uchar dat);void lcd1602_init(void);#endifLCD1602模块的源文件:#include reg52.h#include intrins.h#include lcd1602.h#include delay.h#define uchar unsigned char#define uint unsigned intsbit lcdrs=P20; /指令、数据选择位sbit lcdrw=P21

17、; /读、写选择位sbit lcden=P22; /LCD1602使能位/*向lcd1602中写指令的函数*/void lcd1602_write_com(uchar com) lcdrs=0; lcdrw=0; lcden=0; P0=com; delay_ms(1); lcden=1; delay_ms(1); lcden=0;/*向lcd1602中写数据的子函数*/void lcd1602_write_dat(uchar dat) lcdrs=1; lcdrw=0; lcden=0; P0=dat; delay_ms(1); lcden=1; delay_ms(1); lcden=0;/

18、*lcd1602初始化配置函数*/void lcd1602_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 t

19、ime.h#define uchar unsigned char#define uint unsigned intsbit K5=P14; /K5控制校时的类型sbit K6=P15; /K6加一计数sbit K7=P16; /K7减一计数uchar flag,flag1,K5_Num; /flag时间控制与显示的标志位,flag1 温度的负号标志位void read_ds18b20_rom(void); /读取DS18B20的64位ROMvoid ds18b20_rom_display(void); /DS18B20ROM显示在LCD1602上void ds18b20_temperature

20、_display(void); /温度显示void ShiZhong_display(void); /时钟显示void KEY_Scan_And_Control(void); /通过扫描按键的校时函数extern uchar table_rom8; /存放DS18B20的64位ROM值extern uchar shi,fen,miao; /存储时间的三个全局变量uchar display_temperature4; /存储温度数据uchar code table_number= 0123456789ABCDEF;/*显示温度的单位*/uchar code table_tempature_sig

21、nal= 0x10,0x06,0x09,0x08, 0x08,0x09,0x06,0x00;void main(void) lcd1602_init(); read_ds18b20_rom(); ds18b20_rom_display(); TIME0_Init(); while(1) ds18b20_init(); display_temperature0=ds18b20_read(); /读取温度低八位 display_temperature1=ds18b20_read(); /读取温度的八位 ds18b20_temperature_display(); ShiZhong_display(

22、); KEY_Scan_And_Control(); void read_ds18b20_rom(void) uchar temp; ds18b20_start(); ds18b20_write(0x33); for(temp=0;temp8;temp+) table_romtemp=ds18b20_read(); void ds18b20_rom_display(void) lcd1602_write_com(0x80+0x40+0x0e); lcd1602_write_dat(table_numbertable_rom0/16); lcd1602_write_dat(table_numbe

23、rtable_rom0%16); lcd1602_write_com(0x80+0x40+0x0c); lcd1602_write_dat(table_numbertable_rom1/16); lcd1602_write_dat(table_numbertable_rom1%16); lcd1602_write_com(0x80+0x40+0x0a); lcd1602_write_dat(table_numbertable_rom2/16); lcd1602_write_dat(table_numbertable_rom2%16); lcd1602_write_com(0x80+0x40+0

24、x08); lcd1602_write_dat(table_numbertable_rom3/16); lcd1602_write_dat(table_numbertable_rom3%16); lcd1602_write_com(0x80+0x40+0x06); lcd1602_write_dat(table_numbertable_rom4/16); lcd1602_write_dat(table_numbertable_rom4%16); lcd1602_write_com(0x80+0x40+0x04); lcd1602_write_dat(table_numbertable_rom5

25、/16); lcd1602_write_dat(table_numbertable_rom5%16); lcd1602_write_com(0x80+0x40+0x02); lcd1602_write_dat(table_numbertable_rom6/16); lcd1602_write_dat(table_numbertable_rom6%16); lcd1602_write_com(0x80+0x40+0x00); lcd1602_write_dat(table_numbertable_rom7/16); lcd1602_write_dat(table_numbertable_rom7

26、%16);void ds18b20_temperature_display(void) uchar temp; if(display_temperature1&0xf8)=0xf8) flag1=1; display_temperature1=display_temperature1; display_temperature0=display_temperature0; if(display_temperature0=0xff) display_temperature0=0; display_temperature1=display_temperature1+1; else flag1=0;

27、display_temperature0=display_temperature0+1; display_temperature2=display_temperature1*16+display_temperature0/16; display_temperature3=display_temperature0%16*10/16; lcd1602_write_com(0x80+0x00); lcd1602_write_dat(table_numberdisplay_temperature2/100); lcd1602_write_dat(table_numberdisplay_temperat

28、ure2%100/10); lcd1602_write_dat(table_numberdisplay_temperature2%10); lcd1602_write_dat(.); lcd1602_write_dat(table_numberdisplay_temperature3); lcd1602_write_com(0x40); for(temp=0;temp8;temp+) lcd1602_write_dat(table_tempature_signaltemp); lcd1602_write_com(0x80+0x05); lcd1602_write_dat(0x00); if(flag1=1) lcd1602_write_com(0x80+0x00); lcd1602_write_dat(-); void ShiZhong_display(void) if(flag1=0) lcd1602_write_com(0x80+0x0e); lcd1602_write_dat(table_numbermiao/10); lcd1602_write_dat(table_numbermiao%10); lcd1602_

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

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