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

上传人:b****7 文档编号:10670056 上传时间:2023-02-22 格式:DOCX 页数:25 大小:584.40KB
下载 相关 举报
单片机课程设计报告数字温度计.docx_第1页
第1页 / 共25页
单片机课程设计报告数字温度计.docx_第2页
第2页 / 共25页
单片机课程设计报告数字温度计.docx_第3页
第3页 / 共25页
单片机课程设计报告数字温度计.docx_第4页
第4页 / 共25页
单片机课程设计报告数字温度计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

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

《单片机课程设计报告数字温度计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告数字温度计.docx(25页珍藏版)》请在冰豆网上搜索。

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

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

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

 

单片机课程设计报告

 

课题:

基于单片机的数字温度计设计

 

图2.2 总体设计方框图

 

2系统的硬件设计

2.1主控制器

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。

STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能:

8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,stc89c52MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选。

 

 

图3.1时钟电路与复位电路

2.2显示电路

显示采用4位数码管,图3.2.1为数码管段驱动,图3.2.2为数码管位驱动,图3.2.3为温度显示电路

图3.2.1数码管段驱动

图3.2.2数码管位驱动

 

图3.2.3温度显示电路

2.3温度传感器工作原理

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20的性能特点如下:

•独特的单线接口仅需一个端口引脚进行通讯

•简单的多点分布应用

•无需外部器件

•可通过数据线供电

•零待机功耗

•测温范围-55~+125℃,以0.5℃递增。

华氏器件-67~+2570F,以0.90F递增

•温度以9位数字量读出

•温度数字量转换时间200ms(典型值)

•用户可定义的非易失性温度报警设置

•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件

DS18B20的测温原理如图3.3.3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

图3.3.3DS18B20测温原理图

在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:

首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。

考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:

2.4温度传感器接口电路

 

图3.4.1温度传感器接口电路

3系统的软件设计

3.1主程序

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

voidmain()

{uchara;

do

{

tmpchange();

for(a=10;a>0;a--)

{display(tmp());//在数码管上显示温度

}

}

while

(1);

}

3.2温度测量

3.2.1初始化DS18B20

/*---------------初始化DS18B20----------------*/

voiddsreset(void)//sendresetandinitializationcommand初始化DS18B20

{

uinti;

DS=0;

i=103;

while(i>0)

i--;

DS=1;

i=4;

while(i>0)

i--;

}

3.2.2DS18B20读字节

/*----------------读取一位数据----------------*/

bittmpreadbit(void)//readabit读一位

{

uinti;

bitdat;

DS=0;

i++;//i++fordelay小延时一下

DS=1;

i++;

i++;

dat=DS;

i=8;

while(i>0)

i--;

return(dat);

}

uchartmpread(void)//readabytedate读一个字节

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tmpreadbit();

dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat);

}

3.2.3DS18B20写字节

/*----------------写入字节数据----------------*/

voidtmpwritebyte(uchardat)//writeabytetods18b20写一个字节到DS18B20里面

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{testb=dat&0x01;

dat=dat>>1;

if(testb)//write1写1部分

{

DS=0;

i++;

i++;

DS=1;

i=8;

while(i>0)

i--;

}

else

{DS=0;//write0写0部分

i=8;

while(i>0)

i--;

DS=1;

i++;

i++;

}

}

}

3.2.4启动温度测量

/*----------------启动温度测量----------------*/

voidtmpchange(void)//DS18B20beginchange发送温度转换命令

{

dsreset();//初始化DS18B20

delay

(1);//延时

tmpwritebyte(0xcc);//addressalldriversonbus跳过序列号命令

tmpwritebyte(0x44);//initiatesasingletemperatureconversion发送温度转换命令

}

uinttmp()//getthetemperature获得温度

{

floattt;

uchara,b;

dsreset();

delay

(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread();

b=tmpread();

temp=b;

temp<<=8;//twobytecomposeaintvariable两字节合成一个整型变量

temp=temp|a;

tt=temp*0.0625;//得到真实十进制温度值,因为DS18B20

//可以精确到0.0625度,所以读回数据的最低位代表的是

//0.0625度。

temp=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位

//也转换为可显示数字,同时进行一个四舍五入操作。

returntemp;

voiddisplay(uinttemp)//显示程序

{

ucharA1,A2,A2t,A3;

A1=temp/100;

A2t=temp%100;

A2=A2t/10;

A3=A2t%10;

dula=0;

P0=table[A1];//显示百位

dula=1;

dula=0;

wela=0;

P0=0x7e;

wela=1;

wela=0;

delay

(1);

dula=0;

P0=table1[A2];//显示十位

dula=1;

dula=0;

wela=0;

P0=0x7d;

wela=1;

wela=0;

delay

(1);

P0=table[A3];//显示个位

dula=1;

dula=0;

P0=0x7b;

wela=1;

wela=0;

delay

(1);

}

3.2.5算法流程图

 

 

图4.2.5主程序流程图

 

 

开始

温度零下?

温度值取补码置“—”标志

计算小数位温度BCD值

计算整数位温度BCD值

结束

置“+”标志

N

Y

图3.2.5DS18B20初始化流程图

 

发DS18B20复位命令

发跳过ROM命令

发温度转换开始命令

结束

 

图3.2.5温度转换流程图

图3.2.5 计算温度流程图

 

3.3数码管显示

/*----------------数码管显示-----------------*/

voidDisplay()

{

uchari,j;

j=0x08;

for(i=0;i<4;i++)

{

P1=j;//数码管位码输出

LOCK=1;//打开锁存

if(i==2)P0=led[disp[i]]|0x01;//显示小数点

elseP0=led[disp[i]];//数码管段码输出

LOCK=0;//关闭锁存

j=j>>1;//调整位码

Delay(125);

P0=0x00;

}

}

4系统的测试与总结

4.1测试时的图片

图5.1.1温度传感器

图5.1.2测试时室内温度显示

图5.1.3测试时手握住传感器时的温度显示

4.2总结

本次单片机课程设计是我们的第一次单片机设计,第一次总是不顺利的,在过程中我们经历了一些困难,但是通过我们三个的不断努力,最终完成了此次设计。

设计之初,我们先确定了设计题目,安排了一下实验步骤,分配了每个人的任务。

明确了每个步骤的目的与操作,我们便开始了这次的课程设计,编程序和画电路图是比较麻烦的事情,为了能做到更好,我们上网搜索了一些信息,也去图书馆查阅了一些资料,在过程中每个人不仅都认真负责的做好自己的那一部分,还不时的去帮助小伙伴们。

通过此次的课程设计,我们对数字温度计有了进一步的了解,对单片机、ds18b520、晶振电路等有了更深的认识。

此次设计不仅是考验了我们平时学习的课本上的知识,也考验了我们在课外对单片机及相关知识的了解。

虽然在课程设计中,我们遇到了一些问题,有过争吵,有过做不好时的烦闷以及当时一时气话的放弃,但不论怎样我们在争吵、郁闷、生气的后来都重拾了这次设计。

每个人都想更好地做好设计,尽自己最大的努力。

所以此次课程设计,不仅让我们学习了更多的单片机知识,增强了我们的动手能力,锻炼了我们的耐心与细心;还让我们明白了团结的意义,以及合作的快乐。

附录1原理图

附录2源程序清单

#defineucharunsignedchar

voiddelay(uintcount)//delay

{

uinti;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

voiddsreset(void)//sendresetandinitializationcommand初始化DS18B20

{

uinti;

DS=0;

i=103;

while(i>0)

i--;

DS=1;

i=4;

while(i>0)

i--;

}

bittmpreadbit(void)//readabit读一位

{

uinti;

bitdat;

DS=0;

i++;//i++fordelay小延时一下

DS=1;

i++;

i++;

dat=DS;

i=8;

while(i>0)

i--;

return(dat);

}

uchartmpread(void)//readabytedate读一个字节

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tmpreadbit();

dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat);

}

voidtmpwritebyte(uchardat)//writeabytetods18b20写一个字节到DS18B20里面

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{testb=dat&0x01;

dat=dat>>1;

if(testb)//write1写1部分

{

DS=0;

i++;

i++;

DS=1;

i=8;

while(i>0)

i--;

}

else

{DS=0;//write0写0部分

i=8;

while(i>0)

i--;

DS=1;

i++;

i++;

}

}

}

voidtmpchange(void)//DS18B20beginchange发送温度转换命令

{

dsreset();//初始化DS18B20

delay

(1);//延时

tmpwritebyte(0xcc);//addressalldriversonbus跳过序列号命令

tmpwritebyte(0x44);//initiatesasingletemperatureconversion发送温度转换命令

}

uinttmp()//getthetemperature获得温度

{

floattt;

uchara,b;

dsreset();

delay

(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread();

b=tmpread();

temp=b;

temp<<=8;//twobytecomposeaintvariable两字节合成一个整型变量

temp=temp|a;

tt=temp*0.0625;//得到真实十进制温度值,因为DS18B20

//可以精确到0.0625度,所以读回数据的最低位代表的是

//0.0625度。

temp=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位

//也转换为可显示数字,同时进行一个四舍五入操作。

returntemp;

}

voiddisplay(uinttemp)//显示程序

{

ucharA1,A2,A2t,A3;

A1=temp/100;

A2t=temp%100;

A2=A2t/10;

A3=A2t%10;

dula=0;

P0=table[A1];//显示百位

dula=1;

dula=0;

wela=0;

P0=0x7e;

wela=1;

wela=0;

delay

(1);

dula=0;

P0=table1[A2];//显示十位

dula=1;

dula=0;

wela=0;

P0=0x7d;

wela=1;

wela=0;

delay

(1);

P0=table[A3];//显示个位

dula=1;

dula=0;

P0=0x7b;

wela=1;

wela=0;

delay

(1);

}

voidmain()

{uchara;

do

{

tmpchange();

for(a=10;a>0;a--)

{display(tmp());//在数码管上显示温度

}

}

while

(1);

}

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

当前位置:首页 > 工程科技 > 能源化工

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

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