51单片机课程设计数字温度计报告

更新时间:2023-10-01 12:20:01 阅读量: 综合文库 文档下载

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

基于单片机的数字温度计系统课程设计

电子设计培训设计报告

题目: 数字温度计

学院: 班级: 学号: 姓名: 指导老师: 日期:

1

基于单片机的数字温度计系统课程设计

数字温度计设计任务书

一、 课程设计目的

1、 加强学生理论联系实际的能力,提高学生的动手能力; 2、 学会基本电子元器件的识别和检测;

3、 学会应用EDA软件Proteus进行电路的设计和仿真; 4、 基本掌握单片机的基本原理,并能将其应用于系统的设计。

5、 通过实训,提高学生的学习兴趣,激发自主学习能力,培养创新意识。 二、 设计任务

先焊制一个单片机最小系统,并以制作的单片机最小系统为核心,设计并制作一个数字式温度计应用系统。 三、 设计要求具有以下功能:

(1) 采用DS18B20作为温度传感器进行温度检测; (2) 对采集温度进行显示(显示温度分辨率0.1℃);

(3) 采集温度数值应采用数字滤波措施,保证显示数据稳定; (4) 显示数据,无数据位必须消隐。

2

基于单片机的数字温度计系统课程设计

目录

数字温度计设计任务书 ……………………………………………… 2 1、 设计思路

(1) 设计原理 ………………………………………………………………… 4 (2) 系统方案及总体设计框图 ……………………………………………… 4

2、 数字温度计应用系统的硬件设计

(1) 单片机小系统基本组成及硬件图 (2) 外围电路工作原理及系统硬件图 (3) 主要芯片及其功能 3、 系统软件程序的设计

软件流程框图

4、 系统调试

(1) 仿真器介绍 (2) 调试结果及其分析

(3) 系统设计电路的特点和方案的优缺点

5、 课程设计心得体会

参考文献

附录 程序清单及注释

3

基于单片机的数字温度计系统课程设计

一、 设计思路:

设计方案及其总体设计框图

单片机芯片 1602显示器

晶振控制

温度计设计系统流程图

开始 进入缓冲区初始化 复位 DS18B20发跳过ROM命令 温度转换命令 延时 复位 DS18B20,跳过ROM命令 读存储器命令 读温度命令 将温度转换为BCD码 更新数据缓冲区 AT89S52 温度检测电路 DS18B20 系统设计原理:

本次课程设计是基于单片机的数字温度计设计,在开始课程设计的时候我们要理解并掌握对单片机的开发,学会使用KEIL及Proteus等仿真软件。根据设计任务要求选择好器件,编写好程序运行成功之后进行软件联调,验证系统是否正确。通过筛选,我们组选用单片机AT89S52作为主控制系统;用1602液晶显示模块芯片作为温度数据显示装置;智能温度传感器采用DS18B20器件作为测温电路主要组成部分。

4

基于单片机的数字温度计系统课程设计

二、数字温度计应用系统的硬件设计

1、单片机小系统的基本组成及其选择 (1)单片机 单片机选型参考 ? ? ?

① AT89S51、AT89S52 :具备ISP下载功能 ,可以使用USBASP程序下载线或者并口下载

② STC89C51、STC89C52:使用串口线+MAX232烧写程序。

③AT89C51、AT89C52 :可以在最小系统板上使用,但需要另外用编程器烧写程序

本次课程设计选用AT89S52型号单片机进行操作。

AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system

programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。

AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个 全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 AT89S52引脚图

此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三 种封装形式,以适应不同产品的需求。 (4) 电源 ? ?

①电源适配器供电:DC座(三个管脚) ②usb供电:

5

基于单片机的数字温度计系统课程设计

//初始化DS18B20

//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit() {

//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us unsigned int i; ds = 0;

i = 100; //拉低约800us, 符合协议要求的480us以上 while(i>0) i--;

ds = 1; //产生一个上升沿, 进入等待应答状态 i = 4; while(i>0) i--; }

void dsWait() {

unsigned int i; while(ds);

while(~ds); //检测到应答脉冲 i = 4; while(i > 0) i--; }

//向DS18B20读取一位数据

//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, //之后DS18B20则会输出持续一段时间的一位数据 bit readBit() {

unsigned int i; bit b; ds = 0;

i++; //延时约8us, 符合协议要求至少保持1us ds = 1;

i++; i++; //延时约16us, 符合协议要求的至少延时15us以上 b = ds; i = 8;

while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求 return b;

16

基于单片机的数字温度计系统课程设计

}

//读取一字节数据, 通过调用readBit()来实现 unsigned char readByte() {

unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i++) {

j = readBit();

//最先读出的是最低位数据 dat = (j << 7) | (dat >> 1); }

return dat; }

//向DS18B20写入一字节数据 void writeByte(unsigned char dat) {

unsigned int i; unsigned char j; bit b;

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

b = dat & 0x01;

dat >>= 1;//写\将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1

if(b) {

ds = 0;

i++; i++; //拉低约16us, 符号要求15~60us内 ds = 1;

i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求 }

else //写\将DQ拉低60us~120us {

ds = 0;

i = 8; while(i>0) i--; //拉低约64us, 符号要求

17

基于单片机的数字温度计系统课程设计

ds = 1;

i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了 } } }

//向DS18B20发送温度转换命令 void sendChangeCmd() {

dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); //等待DS18B20应答

delayMs(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0x44); //写入温度转换命令字 Convert T }

//向DS18B20发送读取数据命令 void sendReadCmd() {

dsInit(); dsWait(); delayMs(1);

writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0xbe); //写入读取数据令字 Read Scratchpad }

//获取当前温度值 int getTmpValue() {

unsigned int tmpvalue; int value; //存放温度数值 float t;

unsigned char low, high; sendReadCmd();

//连续读取两个字节数据 low = readByte(); high = readByte();

18

基于单片机的数字温度计系统课程设计

//将高低两个字节合成一个整形变量 //计算机中对于负数是利用补码来表示的

//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue;

//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度

t = value * 0.0625;

//将它放大10倍, 使显示时可显示小数点后一位, 并对小数点后第二位进行4舍5入

//如t=11.0625, 进行计数后, 得到value = 111, 即11.1 度 //如t=-11.0625, 进行计数后, 得到value = -111, 即-11.1 度 value = t * 10 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5 return value; }

void display(int v) {

unsigned char count;

unsigned char datas[] = {0, 0, 0, 0}; unsigned int tmp = abs(v); datas[0] = tmp / 1000; datas[1] = tmp % 1000 / 100; datas[2] = tmp % 100 / 10; datas[3] = tmp % 10; writeComm(0xc0+3); if(v < 0) {

writeString(\ } else {

writeString(\ }

if(datas[0] != 0)

19

基于单片机的数字温度计系统课程设计

{

writeData('0'+datas[0]); }

for(count = 1; count != 4; count++) {

writeData('0'+datas[count]); if(count == 2) {

writeData('.'); } } }

/******************************DS18B20*******************************/

void main() {

uchar table[] = \ delayMs(1);

sendChangeCmd(); init();

writeComm(0x80); writeString(table, 16); while(1) {

delayMs(1000); //温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue()); sendChangeCmd(); } }

20

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

Top