单片机应用课程设计(电子时钟和温度测量,两份合集)绝对靠谱 -

更新时间:2024-06-22 06:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机应用课程设计

设计课题: 电子钟及温度控制器

院(系、部): 机械工程系 专 业: 机械设计制造及其自动化专业 学 生 姓 名: 学 生 学 号: 指 导 教 师: 孙继*

2012年6月22日

中原工学院信息商务学院课程设计

一、单片机电子时钟的设计

目录

一、前言.....................................................................................2 二、 设计任务与要求...............................................................2 三 、系统主要功能与方案设计...............................................3

3.1系统主要功能...................................................................3 3.2 电子时钟方案..................................................................3 3.3 数码管显示方案...............................................................3

四 、电路硬件与软件设计........................................................4

4.1 系统及设计.......................................................................44.2 主要元器件清单................................................................74.3 软件设计流程..................................................................8 4.4 源程序代码................................................................... 10五、 课程设计体会..................................................................15 六、 参考文献..........................................................................16

2

中原工学院信息商务学院课程设计

一.前言

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。

目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

单片机模块中最常见的是数字钟,数字时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。本设计由单片机AT89S51芯片和LED数码管为核心,运用DS1302时钟芯片,辅以必要的电路,构成了一个单片机电子时钟。

二.设计任务与要求

设计一个基于单片机的电子时钟,画出硬件电路图、编写相应的软件,完成电子时钟的任务,并进行proteus仿真。该控制任务应该完成下列功能: 1. 电子时钟显示用LED数码管显示,格式为: XX XX XX,由左向右分别为:

时、分、秒,比如:23 20 40表示23时20分40秒,刚开始工作时应该显示为:年月日和学号; 2. 实现对时、分、秒进行校准;

2

中原工学院信息商务学院课程设计

3. 设计电子时钟原理图,学习用PROTEL画出该原理图,并用proteus进行仿

真;设计和绘制软件流程图,编写程序,进行调试。

三.系统的主要功能与方案设计

3.1主要功能

电子时钟显示用LED数码管显示,格式为: XX XX XX,由左向右分别为: 时、分、秒,比如:23 20 40表示23时20分40秒,刚开始工作时应该显示为:年月日和学号;可实现对时、分、秒进行校准,简单报时功能。

3.2数字时钟方案

数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。 方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。

基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。

3.3数码管显示方案

方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多

3

中原工学院信息商务学院课程设计

时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。

从节省I/O口和降低能耗出发,本设计采用方案二。

四. 硬件设计原理及电路原理图

4.1系统说明

利用单片机(AT89S51)制作简易电子时钟,由六个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。6个PNP管(9012)分别控制六个数码管的亮灭,一个按键用于时间调整。

4.1.1系统框图

六位LED共 按键 阳显示

AT89C52

DS1302时钟蜂鸣器闹铃

模块

4.1.2电路原理图

4

中原工学院信息商务学院课程设计

图4-1

4.1.3 Proteus 仿真图 显示学号时:

5

中原工学院信息商务学院课程设计

图4-2

显示时间时:

6

中原工学院信息商务学院课程设计

4.2 主要元器件清单

名称 芯片 六位一体数码管 按键 晶振 电容

数量 1片 1个 4个 2个 2个 1个 型号 AT89S52 共阳极 12M 30p 7

蜂鸣器 中原工学院信息商务学院课程设计

排阻 元件清单图 8个 220欧 电阻

发光三极管 4.3 软件设计流程

主程序开始 设定定时器常数,开中断 到1秒? 显示时间

11个 1.5k 7个 T0中断 现场保护 重装定时器初值 满20次否? 秒值加1 满60秒否? 秒缓冲单元清零 分值加1 满60分否? 分缓冲单元清零 时值加1 满24小时否? 时缓冲单元清零 恢复现场 结束 8

中原工学院信息商务学院课程设计

时钟调整程按键k2时间关闭显k2是否示,省按下 分钟闪烁,调时时钟闪按键k2时烁,调时间t<0.5 状态 分值加1 按键k2时间t<0.5 分值=60? 时值加分值清零 时值=24? 时值清返回显示 9

中原工学院信息商务学院课程设计

4.4 源程序代码

#include #include

#define uchar unsigned char #define uint unsigned int uchar

data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; /*段码*/

uchar hour,min,sec; uchar year,mon,day; sbit shi=P1^0; sbit fen=P1^1; sbit miao=P1^2;

sbit key4=P1^3; /*时分秒切换调节键*/ sbit rst=P1^4; sbit sck=P1^5; sbit io=P1^6;

sbit fm=P1^7; /*函数声明:*/

void write_ds1302_byte(uchar dat);

void write_ds1302(uchar add,uchar dat); uchar read_ds1302(uchar add); void read_rtc(); void set_rtc(); void read_rtd(); void set_rtd(); void display(); void display1(); void delay(int n); void show(); void fmzz();

/*DS1302单字节写入:*/

void write_ds1302_byte(uchar dat) {

uchar i;

for (i=0;i<8;i++) {

sck=0;

io=dat&0x01; dat=dat>>1; sck=1;

10

中原工学院信息商务学院课程设计

} }

/*DS1302多字节写入:*/

void write_ds1302(uchar add,uchar dat) {

rst=0;_nop_(); sck=0;_nop_(); rst=1;_nop_();

write_ds1302_byte(add); write_ds1302_byte(dat); rst=0;_nop_(); io=1; sck=1; }

/*DS1302读取:*/

uchar read_ds1302(uchar add) {

uchar i,value; rst=0;_nop_(); sck=0;_nop_(); rst=1;_nop_();

write_ds1302_byte(add); for (i=0;i<8;i++) {

value=value>>1; sck=0;

if (io) value=value|0x80; sck=1; }

rst=0;_nop_();

sck=0;_nop_(); sck=1; io=1;

return value; }

/*调整时间:*/ void set_rtc() {

if (shi==0) delay(100); if (shi==0) {

hour=(hour>>4)*10+(hour&0x0f); hour++;

if (hour==24) hour=0;

11

中原工学院信息商务学院课程设计

hour=((hour/10)<<4)+(hour); write_ds1302(0x84,hour); }

if (fen==0) delay(100); if (fen==0) {

min=(min>>4)*10+(min&0x0f); min++;

if (min==60) min=0;

min=((min/10)<<4)+(min); write_ds1302(0x82,min); }

if (miao==0) delay(100); if (miao==0) {

sec=(sec>>4)*10+(sec&0x0f); sec++;

if (sec==60) sec=0;

sec=((sec/10)<<4)+(sec); write_ds1302(0x80,sec); } }

/*调整日期:*/ void set_rtd() {

if (shi==0) delay(100); if (shi==0) {

year=(year>>4)*10+(year&0x0f); year++;

if (year==99) year=0;

year=((year/10)<<4)+(year); write_ds1302(0x8C,year); }

if (fen==0) delay(100); if (fen==0) {

mon=(mon>>4)*10+(mon&0x0f); mon++;

if (mon==13) mon=0;

mon=((mon/10)<<4)+(mon);

12

中原工学院信息商务学院课程设计

write_ds1302(0x88,mon); }

if (miao==0) delay(100); if (miao==0) {

day=(day>>4)*10+(day&0x0f); day++;

if (day==31) sec=0;

day=((day/10)<<4)+(day); write_ds1302(0x86,day); } }

/*读取时间:*/ void read_rtc() {

hour=read_ds1302(0x85); min=read_ds1302(0x83); sec=read_ds1302(0x81); }

/*读取日期*/ void read_rtd() {

year=read_ds1302(0x8D); mon=read_ds1302(0x89); day=read_ds1302(0x87); }

/*显示时间:*/ void display() {

unsigned int a=1;

P2=0x01;P0=data_7seg[hour/16];delay(a); P2=0x02;P0=data_7seg[hour];delay(a); P2=0x04;P0=data_7seg[min/16];delay(a); P2=0x08;P0=data_7seg[min];delay(a); P2=0x10;P0=data_7seg[sec/16];delay(a); P2=0x20;P0=data_7seg[sec];delay(a); }

/*显示日期:*/ void display1()

13

中原工学院信息商务学院课程设计

{

unsigned int a=1;

P2=0x01;P0=data_7seg[year/16];delay(a); P2=0x02;P0=data_7seg[year];delay(a); P2=0x04;P0=data_7seg[mon/16];delay(a); P2=0x08;P0=data_7seg[mon];delay(a); P2=0x10;P0=data_7seg[day/16];delay(a); P2=0x20;P0=data_7seg[day];delay(a);

}

/*蜂鸣:*/ void fmzz() {

uint i;

for (i=0;i<100;i++) {

fm=!fm; delay(2); } }

/*延时程序:*/ void delay(int n) {

unsigned int i,j; for(i=0;i

for(j=0;j<121;j++) {;} } }

/*显示学号:*/ void show() {

unsigned int m; for(m=0;m<20;m++) {

uint a=10;

P2=0x01;P0=data_7seg[0];delay(a); P2=0x02;P0=data_7seg[2];delay(a); P2=0x04;P0=data_7seg[4];delay(a); P2=0x08;P0=data_7seg[2];delay(a); P2=0x10;P0=data_7seg[2];delay(a); P2=0x20;P0=data_7seg[2];delay(a); }

14

中原工学院信息商务学院课程设计

}

/*主程序:*/ void main() {

show();

delay(100);

write_ds1302(0x84,0x12); //初始化 write_ds1302(0x82,0x00); write_ds1302(0x80,0x00); write_ds1302(0x8C,0x12); //初始化 write_ds1302(0x88,0x06); write_ds1302(0x86,0x02); while (1) {

if(key4==0) {

set_rtc(); read_rtc(); display(); } else {

set_rtd(); read_rtd(); display1(); }

if(min==0) { if(sec==0) {fmzz();} } } }

五.课程设计体会

通过这次数字电子钟的课程设计,我们才把学到的东西与实践相结合。从中对我们学的知识有了更进一步的理解,而且更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。也锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。虽然这只是一次简单的课程设计,但通过这次课程设计我们了解了课程设计的一般步骤,和设计中应注意的问题。设计本身并不是有很重要的意义,而是同学们对待问题时的态度和处理事情的能力。各

15

中原工学院信息商务学院课程设计

个芯片能够完成什么样的功能,使用芯片时应该注意那些要点。同一个电路可以用那些芯片实现,各个芯片实现同一个功能的区别。

单片机最小系统电路与显示器之间的线路多而且比较杂乱,这主要是和我们的经验不足所致。老师也给许多指导,这是使我们受益匪浅。过程中我发现:(1)元器件的分布不合理,接线端口的不正确使用,在实际的工作中要求是相当高的,我们从每一次课程设计汲取教训,多思考比较简单而又高效的接线方法,我们总结此类问题,找出合适的方法。(2)我们采用C语言程序,抛弃了繁琐的汇编程序,但是也存在很多问题。关于消息响应机制:本次设计中在消息响应方面处理还有所欠缺。真正的消息响应机制应该是由一个独立的进程不断循环接收外部事件,并在接收到外部事件的同时把消息传递给主程序进行处理。本次试验只是在程序中加入判断,该判断基本能够达到类似的效果。但是日后如果对系统进行改进,现有的机制肯定不能满足需求。因此须采用独立线程进行消息的响应。(3)之前接触到的电子系统设计不多,所以一开始,感觉难以入手,后来请求同学的帮助,了解了要对各种芯片编写程序时首先应找到该芯片的数据手册,根据数据手册上的说明、时序要求及流程图编写对应程序。(4)巩固了Keil C51工程文件的建立,程序编写以及编译的掌握程度。(5)掌握了Proteus的使用方法,从实际操作中认识到Proteus在仿真方面的优越性,激发了自己学习Proteus的兴趣;

六.参考文献

[1]《单片机原理、接口技术与应用》杨学昭,王东云主编.西安电子科技大学出版社 .2009年2月

[2]《微型计算机原理与接口技术》 冯博琴,吴宁编.清华大学出版社 .2007年8月 [3]《电子技术基础》康光华等 编著. 高等教育出版社 .2005年3月

[4]《基于AT89051单片机与DS18B20的温度测量系统》蔺鹏,柴世红.甘肃科技.2008年第9期

[6] 《基于 DS18B20 测温系统的设计》颜丽娜,张铁民.机械与电子.2010 年 第 11 期 [7]《51单片机C语言教程------入门、提高、开发、拓展全攻略》郭天祥编著.电子工业出版社.2009年12月

16

中原工学院信息商务学院课程设计

二、基于DS18B20的温度测量

目 录

一.设计任务与要求 ............................... 19 二.系统的主要功能与方案设计 ..................... 19

2.1基于DS18B20的温度测量系统 ........................ 19 2.2系统设计方案...................................... 20 2.2.1方案论证...................................... 21 2.2.2方案二的总体设计框图 .......................... 21 2.3系统组成 ......................................... 22

三. 电路硬件及软件设计 ........................... 22

3.1 DS18B20介绍...................................... 22 3.2 DS18B20初始化 .................................... 22 3.3部分电路图设计 .................................... 25 3.4 软件流程图 ...................................... 26 3.4.1主程序设计 .................................... 26 3.4.2读温度子程序 .................................. 27 3.4.3温度转换命令子程序 ............................ 28 3.4.4计算温度子程序 ................................ 28 3.4.5总程序 ....................................... 28

四.原理图、仿真与实物 ............................ 34

4.1 原理图 .......................................... 34

17

中原工学院信息商务学院课程设计

4.2 仿真图 .......................................... 34 4.3 实物图 .......................................... 35

五. 课程设计体会 ................................. 36 六. 参考文献 ..................................... 37

18

中原工学院信息商务学院课程设计

一.设计任务与要求

通过该课程设计使学生进一步了解和加深智能化仪器设计的一般原则;熟练掌握智能化仪器与装置的软、硬件设计方法;掌握仪器的软件调试及软硬件联合统调方法与技能。掌握仪器的接口技术;熟练掌握仪表总线的工作原理、设计步骤、编程及调试;掌握VC或汇编设计软件的编程与调试方法。

1、巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力。

2.、培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力。

3、通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。

设计一个基于单片机的温度控制器。设计要求:(1) 9V供电;(2) 温度采集采用DS18B20;(3) 4位LED显示;(4) 4个按键;(5) 设计温度控制器原理图,学习用PROTEL画出该原理图,并用proteus进行仿真;设计和绘制软件流程图,编写程序;焊接硬件电路,进行调试。

二.系统的主要功能与方案设计

2.1基于DS18B20的温度测量系统

此次课程设计,就是用单片机[1]实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。本次采用DS18B20数字温度传感器来实现基于51单片机的数字温度计的设计。

该数字温度计利用AD590集成温度传感器及其接口电路完成温度的测量并转换成模拟电压信号,经由模数转换器ADC0804转换成单片机能够处理的数字信号,然后送到单片机AT89C51中进行处理变换,最后将温度值显示在D4、D3、D2、D1共4位七段码LED显示器上。系统以AT89C51单片机为控制核心,加上AD590测温电路、ADC模数转换电路、4位温度数据显示电路以及外围电源、时钟电路等组成。

19

中原工学院信息商务学院课程设计

2.2系统设计方案

提及到温度的检测,我们首先会考虑传统的测温元件有热电偶和热电阻,而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试也复杂,制作成本高。

因此,本数字温度计设计采用智能温度传感器DS18B20作为检测元件,测温范围为-55°C至+125°C,最大分辨率可达0.0625°C。DS18B20可以直接读出被测量的温度值,而采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

按照系统设计功能的要求,确定系统由三个模块组成:主控制器STC89C51,温度传感器DS18B20,驱动显示电路。总体电路框图如下:

图4-1 系统总体框图

该系统主要由温度测量和数据采集两部分电路组成,实现的方法有很多种,下面将列出两种在日常生活中和工农业生产中经常用到的实现方案。

采用数字温度芯片DS18B20 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100 摄氏度时,最大线形偏差小于1 摄氏度。DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89S51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51 单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以与PC 机通信上传数据,另外AT89S52 在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。

该系统利用AT89S52芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同

20

中原工学院信息商务学院课程设计

时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。方案的测温装置电路简单、精确度较高、实现方便、软件设计也比较简单。

2.21方案论证

方案一:由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

所以,他的设计理论不符合本次设计的方案要求,应继续考虑另一可行方案。 方案二:进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

因此,从以上两种方案很容易看出,方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

2.2.2方案二的总体设计框图

温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。DS18B20 采用3 脚PR-35 封装或8 脚SOIC 封装。

报警点按键调整 单片机复位 LED显 主 示 控制

时钟振荡 器温 度 传 感器

21

中原工学院信息商务学院课程设计

图2.2 总体设计方框图

主控制器:单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。

显示电路:显示电路采用3位共阳LED数码管,从P3口RXD,TXD串口输出段码。

2.3系统组成

本课题以是89C52单片机为核心设计的一种数字温度控制系统,系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等组成。系统框图主要由主控制器、单片机复位、报警按键设置、时钟振荡、LED显示、温度传感器组成。系统框图如图4-2所示。

单片机复位LED显示报警按键设置主控制器时钟振荡温度传感器

图4-2 系统基本方框图

三. 电路硬件及软件设计

3.1 DS18B20介绍

DS18B20引脚如图4-3所示。

22

中原工学院信息商务学院课程设计

图4-3 DS18B20引脚图

DS18B20的性能特点如下:

●独特的单线接口仅需要一个端口引脚进行通信;

●多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V; ●零待机功耗;

●温度以9或12位数字; ●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; ●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。数字温度传感器DS18B20是一种体积小、适用于多种场合、且适用电压更宽、更经济器件。DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度传感器的种类众多,在应用与高精度、高可靠性的场合时 DALLAS(达拉斯)公司生产的 DS18B20 温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得 DS18B20 更受欢迎。 TO-92封装的DS18B20的引脚排列见图4-4

23

中原工学院信息商务学院课程设计

图4-4 DS18B20的引脚分布图

DS18B20详细引脚功能描述: (1)、GND:地信号。

(2)、DQ:数据输入/输出引脚。开漏单总线接口引脚。

(3)、VDD:可选的VDD引脚。当工作于寄生电源时,此引脚必须接地。

DS18B20测温原理:低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。

24

中原工学院信息商务学院课程设计

3.2 DS18B20初始化

开始C51寄存器初始化N18B20存在?Y温度转换命令读取温度温度数据处理温度显示N温度比较超出范围?Y报警

图 5-2 DS18B20初始化流程图

3.3部分电路图设计 3.3.1 晶振设计

80C52单片机内部带有时钟电路,只需在片外通过XTAL1和XTAL2引脚接入定时控制元件(12MHZ晶振和电容)即可构成一个稳定的自激振荡器。XTAL1和XTAL2分别是80C52内部高增益反响放大器的输入端和输出端 时钟频率为 12MHz.

此部分为其使能和复位电路,该电路采用上电自动复位方式,通过复位电容

25

中原工学院信息商务学院课程设计

C1的充电来实现,接通电源就实现了系统的复位初始化。

3.3.2 报警电路设计

单片机一个引脚控制蜂鸣器,当温度超过设定的值时,他就可以报警,下图为PNP型三极管给低电平即可以实现报警。

3.4 软件流程图

系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。

3.4.1 主程序

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图7所示。

26

中原工学院信息商务学院课程设计

初始化 调用显示子程序 N 1S到? Y Y 初次上电 N 读出温度值温度计算处理显示数据刷新

发DS18B20 复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 Y 发温度转换开始命令 结束 移入温度暂存器 N 9字节完? Y CRC校验正?N

3.12主程序流程图 图3-13 读温度流程图

3.4.2 读温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图8示

发DS18B20复位命令 发跳过ROM命令

发温度转换开始命令 27

结束 中原工学院信息商务学院课程设计

图3.13 温度转换流程图

3.4.3 温度转换命令子程序

温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图3.14所示

3.4.4 计算温度子程序

计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.15所示

开始 N 温度零下? Y N 温度数据移入显示寄存器 十位数0? 温度值取补码置置“+”标志 Y 百位数0? N 计算小数位温度BCD值 Y 十位数显示符号百位数显示数据(不显示符号) 计算整数位温度BCD值 百位数不显示

结束 结束 图3-14 计算温度流程图 图3-15显示数据刷新流程图

3.4.5软件总程序:

//DS18B20 的读写程序,数据脚

P2.5 //

28

中原工学院信息商务学院课程设计

//温度传感器18B20 汇编程序,采用器件默认的12 位转化//

//最大转化时间750 微秒,显示温度-55 到+125 度,显示精度//

//为0.1 度,显示采用4 位LED 共阳显示测温值//

//P0 口为段码输入,P20~P24 为位选//

/***************************************************/

#include \#include

\

//_nop_();延时函数用

#define dm P0 //段码输出口 #define uchar unsigned char #define uint unsigned int sbit DQ=P2^5; //温度输入口 sbit w0=P2^3; //数码管4 sbit w1=P2^2; //数码管3 sbit w2=P2^1; //数码管2 sbit w3=P2^0; //数码管1 sbit beep=P1^7; //蜂鸣器和指示灯

sbit set=P1^0; //温度设置切换键

sbit add=P1^1; //温度加 sbit dec=P1^2;

int temp1=0; //显示当前温度和设置温度的标志位为0 时显示当前温度

uint h; uint temp; uchar r;

uchar high=40,low=15;

uchar sign; uchar q=0; uchar tt=0; uchar scale;

//**************温度小数部分用查表法***********//

uchar

code

ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//小数断码表 uchar

code

table_dm[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//共阴LED 段码表\\不亮\

uchar

table_dm1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //个位带小数点的断码表

uchar data

temp_data[2]={0x00,0x00}; //读出

温度暂放

uchar

data

display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4 个数据和一个运算暂用

/*****************11us 延时函数*************************/

void delay(uint t) {

for (;t>0;t--);

2

中原工学院信息商务学院课程设计

}

void scan() { int j;

for(j=0;j<4;j++) {

switch (j) { case

0:

dm=table_dm[display[0]];w0=0;del

ay(50);w0=1;//xiaoshu

case

1:

dm=table_dm1[display[1]];w1=0;de

lay(50);w1=1;//gewei

case

2:

dm=table_dm[display[2]];w2=0;del

ay(50);w2=1;//shiwei

case

3:

dm=table_dm[display[3]];w3=0;del

ay(50);w3=1;//baiwei

//

else{dm=table_dm[b3];w3=0;delay(50);w3=1;}

} } }

//***************DS18B20 复位函数************************/

ow_reset(void) {

char presence=1; while(presence) {

while(presence)

{

DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;

delay(50); //550 us DQ=1;

delay(6); //66 us

presence=DQ; //presence=0 复

位成功,继续下一步

}

delay(45); //延时500 us

presence=~DQ; }

DQ=1; //拉高电平

}

/****************DS18B20 写

命令

************************/

//向1-WIRE 总线上写1 个字节 void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) {

DQ=1;_nop_();_nop_(); //从高拉倒低

DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us

DQ=val&0x01; //最低位移出 delay(6); //66 us val=val/2; //右移1 位 } DQ=1; delay(1);

3

中原工学院信息商务学院课程设计

}

/****************DS18B20 读1 字

************************/

//从总线上取1 个字节 uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) {

DQ=1;_nop_();_nop_(); value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us

DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us

if(DQ)value|=0x80; delay(6); //66 us } DQ=1;

return(value); }

/*****************读出温度函数************************/

read_temp() {

ow_reset(); //总线复位 delay(200);

write_byte(0xcc); //发命令 write_byte(0x44); //发转换命令

ow_reset(); delay(1);

write_byte(0xcc); //发命令 write_byte(0xbe);

temp_data[0]=read_byte(); //读温度值的第字节

temp_data[1]=read_byte(); //读温度值的高字节

temp=temp_data[1]; temp<<=8;

temp=temp|temp_data[0]; // 两字节合成一个整型变量。

return temp; //返回温度值 }

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

/********************************************************/

work_temp(uint tem) {

uchar n=0;

if(tem>6348) // 温度值正负判断

{tem=65536-tem;n=1;} // 负温度求补码,标志位置1

display[4]=tem&0x0f; // 取小数部分的值

display[0]=ditab[display[4]]; // 存入小数部分显示值

display[4]=tem>>4; // 取中间

4

中原工学院信息商务学院课程设计

八位,即整数部分的值

display[3]=display[4]/100; // 取百位数据暂存

display[1]=display[4]0; // 取后两位数据暂存

display[2]=display[1]/10; // 取十位数据暂存

display[1]=display[1]; //个位数据

r=display[1]+display[2]*10+display[3]*100;

/////符号位显示判断///// if(!display[3]) {

display[3]=0x0a; //最高位为0 时不显示

if(!display[2]) {

display[2]=0x0a; //次高位为0 时不显示

} }

if(n){display[3]=0x0b;} //负温度时最高位显示\

}

void BEEP() {

if((r>=high&&r<129)||r

beep=!beep; } else { beep=0;

} }

//*********设置温度显示转换************//

void xianshi(int horl) { int n=0; if(horl>128) {

horl=256-horl;n=1; }

display[3]=horl/100; display[3]=display[3]&0x0f; display[2]=horl0/10; display[1]=horl; display[0]=0; if(!display[3]) {

display[3]=0x0a; //最高位为0 时不显示

if(!display[2]) {

display[2]=0x0a; //次高位为0 时不显示

} } if(n) {

display[3]=0x0b; //负温度时最高位显示\

} }

//*********按键查询程序**************//

5

中原工学院信息商务学院课程设计

void keyscan() {

int temp1; //最高温度和最低温xianshi(low); if(add==0) {

度标志位

if(set==0) { while(1) {

delay(500);//消抖if(set==0) { temp1++; while(!set) scan(); }

if(temp1==1) {

xianshi(high); scan(); if(add==0) {

while(!add) scan(); high+=1; }

if(dec==0) {

while(!dec) scan(); high-=1; } }

if(temp1==2) {

while(!add) scan(); low+=1; }

if(dec==0) {

while(!dec) scan(); low-=1; } scan(); }

if(temp1>=3) { temp1=0; break; } } } }

/****************主函数************************/

void main() {

dm=0x00; //初始化端口 w0=0; w1=0; w2=0; w3=0;

for(h=0;h<4;h++) //开机显示\

6

中原工学院信息商务学院课程设计

{

display[h]=0; }

ow_reset(); //开机先转换一次 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令

for(h=0;h<100;h++) //开机显示\

{ scan(); } while(1)

{

if (temp1==0) {

work_temp(read_temp()); //处理温度数据

BEEP();

scan(); //显示温度值 keyscan(); } else keyscan(); } }

四.原理图、仿真与实物

4.1 原理图

4.2 仿真图

7

中原工学院信息商务学院课程设计

图8-1 仿真1

4.3 实物图

如下面包板实物图显示29.58

2

五. 课程设计体会

一分耕耘,一分收获。只有亲自用实践来验证这句话,在能得其要领。经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。

在实验的开始几天,基本上没有收获,不知何从下手,不知所措。为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。

在这四周,我们在孙继卫老师的指导下进行了更有意义的课程设计,题目是基于DS18B20的温度测量系统,这个系统要求能够比较精确的测量除温度,并且在温度超过界限时可以自动报警。这次我和李浩楠同学一组,我们配合得比较默契,很快就完成了原理图的绘制,由于需要特定的软件进行画图,所以花费了一点时间学习如何操作。并且学会了PROTEL 99 的基本操作。由于粗心,没有在三极管驱动前加电阻,虽然没什么大的影响,但还是美中不足。然后就是编写程序,由于我的c语言学的不好,程序是结合网上搜索的并且稍加改进得到的,但是还是没能很好的理解每一步的具体含义。大概意思算是明白了。老师检查过原理图和程序后便开始领取原件,开始连接实物图。连图的过程很快,但是等到下载程序时,却遇到了麻烦,程序下不进去,检查了检查,程序下进去但是不正常显示,有不断调试程序,检查电路,经过持久的不懈努力终于搞定了。

经过这次的课程设计,我感到由衷的开心和兴奋,当然也有很多的体会。首先就是基本软件的学习和操作,这就是自学的能力和学习效率的问题。其次是具体实践操作,原理图设计一定要便于操作,越简洁越好。还有就是要有一定的耐心,遇到不顺利的时候要静下心来,一步一步认真排查问题所在,不能急躁,不能急于求成。最最重要的就是要学会团队合作,互相弥补不足。总之,这次的课程设计让我有所收获,让我更加自信。

中原工学院信息商务学院课程设计

六.参考文献

[1]《单片机原理、接口技术与应用》杨学昭,王东云主编.西安电子科技大学出版社 .2009年2月

[2]《微型计算机原理与接口技术》 冯博琴,吴宁编.清华大学出版社 .2007年8月 [3]《电子技术基础》康光华等 编著. 高等教育出版社 .2005

[4]《基于AT89051单片机与DS18B20的温度测量系统》蔺鹏,柴世红.甘肃科技. 2008年第9期

[6] 《基于 DS18B20 测温系统的设计》颜丽娜,张铁民.机械与电子.2010 年 第 11 期 [7]《51单片机C语言教程------入门、提高、开发、拓展全攻略》郭天祥编著.电子工业出版社.2009年12月

2

本文来源:https://www.bwwdw.com/article/83h3.html

Top