单片机设计数字温度计Word下载.docx

上传人:b****2 文档编号:13598723 上传时间:2022-10-12 格式:DOCX 页数:13 大小:1.19MB
下载 相关 举报
单片机设计数字温度计Word下载.docx_第1页
第1页 / 共13页
单片机设计数字温度计Word下载.docx_第2页
第2页 / 共13页
单片机设计数字温度计Word下载.docx_第3页
第3页 / 共13页
单片机设计数字温度计Word下载.docx_第4页
第4页 / 共13页
单片机设计数字温度计Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

单片机设计数字温度计Word下载.docx

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

单片机设计数字温度计Word下载.docx

相比热敏电阻来说,DS18B20单总线数字式温度传感器灵敏度高,精度高,但本次课程设计对温度精度的要求不高,且因为DS18B20温度传感器需要初始化,价格也比热敏电阻高,综合考虑,本设计采用热敏电阻对温度信号进行采集。

3)显示器的选取:

显示系统是单片机控制系统的重要组成部分,主要用于显示各种参数的值,常用的显示器有CRT、LED、LCD等。

本设计用LED数码管显示需求片数并不多,观察方便,而LED数码管相对于其他显示器价格也比较便宜,成本也较低,所以本系统采用LED数码管显示。

(2)整体电路

图3-2

(3)单元电路设计

1)晶振电路:

瓷片电容C1、C2是用来驱动晶振Y1的,因为晶振的

大小是16M,所以选用20P的电容。

图3-3-1

 

2)复位电路:

复位电路选用了10nF的电解电容和10K的电阻。

图3-3-2

3)温度显示数码管驱动电路:

PE0~PE3是进行位选通的控制,PD口进行段选通的控制。

图3-3-3

(4)说明电路工作原理

本设计使系统可以检测-50~110℃范围内的温度,考虑到测温精度,设置显示数值精确到0.5℃并且设置温度的上下限,当温度值超过上下限温度时,报警电路中的蜂鸣器鸣响,报警灯闪。

根据STM8S105C6T6的引脚特性,本设计中采用PB0~PB2和PD口作为四位数码管的驱动引脚,PA3~PA5作为外部中断的输入,PB4作为热敏电阻与单片机之间的信息传送。

PB5与蜂鸣器相接,控制蜂鸣器是否鸣响。

RST作为复位输入,当振荡器工作时,RST引脚出现2个机器周期以上高电平使单片机复位。

PB5与正常工作指示灯相连接,PB7引脚与报警灯相接,控制报警灯是否闪亮。

XTAL1振荡器反相放大器及内部时钟发生器的输入端。

XTAL2振荡器反相放大器的输出端。

四、电路和程序调试过程与结果

(1)设计逻辑图:

(2)部分程序代码

#include<

reg52.h>

//调用单片机头文件

#defineucharunsignedchar//无符号字符型宏定义变量范围0~255

#defineuintunsignedint//无符号整型宏定义变量范围0~65535

//数码管段选定义0123456789

ucharcodesmg_du[]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05,

//ABCDEF不显示

0x06,0xa4,0x9c,0x64,0x8c,0x8e,0xff};

//断码

//数码管位选定义

sbitsmg_we1=P2^0;

//数码管位选定义

sbitsmg_we2=P2^2;

sbitsmg_we3=P2^4;

sbitsmg_we4=P2^6;

uchardis_smg[8]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84};

ucharsmg_i=3;

//显示数码管的个位数

sbitdq=P3^3;

//18b20IO口的定义

bitflag_wd_z_f;

//正负温度

inttemperature;

//

/***********************1ms延时函数*****************************/

voiddelay_1ms(uintq)

{

uinti,j;

for(i=0;

i<

q;

i++)

for(j=0;

j<

120;

j++);

}

/***********************小延时函数*****************************/

voiddelay_uint(uintq)

while(q--);

/***********************数码位选函数*****************************/

voidsmg_we_switch(uchari)

switch(i)

{

case0:

smg_we1=0;

smg_we2=1;

smg_we3=1;

smg_we4=1;

break;

case1:

smg_we1=1;

smg_we2=0;

case2:

smg_we3=0;

case3:

smg_we4=0;

}

/***********************数码显示函数*****************************/

voiddisplay()

staticuchari;

i++;

if(i>

=smg_i)

i=0;

P0=0xff;

//消隐

smg_we_switch(i);

//位选

P0=dis_smg[i];

//段选

/***********************18b20初始化函数*****************************/

voidinit_18b20()

bitq;

dq=1;

//把总线拿高

delay_uint

(1);

//15us

dq=0;

//给复位脉冲

delay_uint(80);

//750us

//把总线拿高等待

delay_uint(10);

//110us

q=dq;

//读取18b20初始化信号

delay_uint(20);

//200us

//把总线拿高释放总线

/*************写18b20内的数据***************/

voidwrite_18b20(uchardat)

uchari;

8;

{//写数据是低位开始

dq=0;

//把总线拿低写时间隙开始

dq=dat&

0x01;

//向18b20总线写数据了

delay_uint(5);

//60us

dq=1;

//释放总线

dat>

>

=1;

/*************读取18b20内的数据***************/

ucharread_18b20()

uchari,value;

//把总线拿低读时间隙开始

value>

//读数据是低位开始

if(dq==1)//开始读写数据

value|=0x80;

//60us读一个时间隙最少要保持60us的时间

}

returnvalue;

//返回数据

/*************读取温度的值读出来的是小数***************/

uintread_temp()

uintvalue;

ucharlow;

init_18b20();

//初始化18b20

write_18b20(0xcc);

//跳过64位ROM

write_18b20(0x44);

//启动一次温度转换命令

delay_uint(50);

//500us

init_18b20();

//初始化18b20

EA=0;

write_18b20(0xbe);

//发出读取暂存器命令

low=read_18b20();

//读温度低字节

value=read_18b20();

//读温度高字节

EA=1;

value<

<

=8;

//把温度的高位左移8位

value|=low;

//把读出的温度低位放到value的低八中

if((value&

0xf000)==0xf000)

flag_wd_z_f=1;

//负温度

else

flag_wd_z_f=0;

//正温度

value*=0.625;

//转换到温度值小数

//返回读出的温度

/*************定时器0初始化程序***************/

voidtime_init()

//开总中断

TMOD=0X01;

//定时器0、定时器1工作方式1

ET0=1;

//开定时器0中断

TR0=1;

//允许定时器0定时

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

voidmain()

P0=P1=P2=P3=0xff;

time_init();

//初始化定时器

temperature=read_temp();

//先读出温度的值

delay_1ms(650);

//先读出温度的值

dis_smg[0]=smg_du[temperature%10];

//取温度的小数显示

dis_smg[1]=smg_du[temperature/10%10]&

0xfb;

//取温度的个位显示

dis_smg[2]=smg_du[temperature/100%10];

//取温度的十位显示

while

(1)

{

temperature=read_temp();

//先读出温度的值

if(flag_wd_z_f==1)//负温度

{

smg_i=4;

dis_smg[0]=smg_du[temperature%10];

dis_smg[1]=smg_du[temperature/10%10]&

dis_smg[2]=smg_du[temperature/

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

当前位置:首页 > 总结汇报 > 学习总结

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

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