数字温度计的设计word版本.docx

上传人:b****8 文档编号:9889966 上传时间:2023-02-07 格式:DOCX 页数:35 大小:909.61KB
下载 相关 举报
数字温度计的设计word版本.docx_第1页
第1页 / 共35页
数字温度计的设计word版本.docx_第2页
第2页 / 共35页
数字温度计的设计word版本.docx_第3页
第3页 / 共35页
数字温度计的设计word版本.docx_第4页
第4页 / 共35页
数字温度计的设计word版本.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

数字温度计的设计word版本.docx

《数字温度计的设计word版本.docx》由会员分享,可在线阅读,更多相关《数字温度计的设计word版本.docx(35页珍藏版)》请在冰豆网上搜索。

数字温度计的设计word版本.docx

数字温度计的设计word版本

 

数字温度计的设计

实验六数字温度计的设计

一、设计目的

通过电子技术的综合设计,熟悉一般电子电路综合设计过程、设计要求、应完成的工作内容和具体的设计方法。

通过设计有助于复习、巩固以往的学习内容,达到灵活应用的目的。

设计完成后在实验室进行自行安装、调试,从而加强学生的动手能力。

在该过程中培养从事设计工作的整体概念。

二、设计要求

1、利用所学的知识,通过上网或到图书馆查阅资料,完成数字温度计的设计;要求写出实验原理,画出原理功能框图,描述其功能。

2、需采用单片机STC15W404AS、NTC热敏电阻、共阳数码管等元器件进行设计,试确定设计方案详细工作原理,计算出参数。

3、技术指标:

1)温度范围:

0---+100℃;误差≤±2℃;

2)选择设计方案;

3)根据设计方案分析设计原理及写出详细的硬件电路设计过程;

方案概要

本设计是利用NTC热敏电阻MF52E-10K(B=3950)1%精度,作为温度传感器,其输出的信号通过STC15W404AS内部AD进行模数转换,然后STC15W404AS对该温度数据进行处理,并由一个4位一体共阳数码管显示显示温度值。

实验报告要求原理、计算等)

1、根据设计要求确定数字温度计方案,并完成电路设计,分别说明设计方案、电路工作原理:

2、完成电路连接并进行数字温度计测试:

参考设计电路

图1参考电路图

表1元器件清单

图2参考电路图

表2元器件清单

 

图3数码管引脚图

参考程序:

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

#defineMAIN_Fosc22118400L//定义主时钟

#include"STC15Fxxxx.H"

/******************************用户定义宏***********************************/

#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))//Timer0中断频率,1000次/秒

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

 

#defineDIS_DOT0x20

#defineDIS_BLACK16

#defineDIS_17

#defineAD_Cha2//0-4通道

 

/*************本地常量声明**************/

u8codet_display[]={//标准字库共阳

//0123456789ABCDEF

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,

//black-HJKLNoPUtGQrMy

0xff,0xBF,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,

0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x46};//0.1.2.3.4.5.6.7.8.9.-1

/*

u8codet_display[]={//标准字库

//0123456789ABCDEF

0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

//black-HJKLNoPUtGQrMy

0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,

0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};//0.1.2.3.4.5.6.7.8.9.-1

*/

u8codeT_COM[]={0xEF,0xDF,0xBF,0x7F,0xEF,0xDF,0xBF,0x7F};//位码

 

/*************IO口定义**************/

sbitP_HC595_SER=P4^0;//pin14SERdatainput

sbitP_HC595_RCLK=P5^4;//pin12RCLkstore(latch)clock

sbitP_HC595_SRCLK=P4^3;//pin11SRCLKShiftdataclock

 

/*************本地变量声明**************/

u8LED8[8];//显示缓冲

u8display_index;//显示位索引

bitB_1ms;//1ms标志

u8offled;

u16msecond;

/*************本地函数声明**************/

u16get_temperature(u16adc);

u16Get_ADC10bitResult(u8channel);//channel=0~7

voidDelayms(u16dlayT);

voidDisplayScan(void);

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

voidmain(void)

{

u8i,k;

u16j;

P0M1=0;P0M0=0;//设置为准双向口

P1M1=0;P1M0=0;//设置为准双向口

P2M1=0;P2M0=0;//设置为准双向口

P3M1=0;P3M0=0;//设置为准双向口

P4M1=0;P4M0=0;//设置为准双向口

P5M1=0;P5M0=0;//设置为准双向口

P6M1=0;P6M0=0;//设置为准双向口

P7M1=0;P7M0=0;//设置为准双向口

display_index=4;

offled=0;

P1ASF=0x0F;//P1.0P1.1P1.2P1.3做ADC

ADC_CONTR=0xE0;//90T,ADCpoweron

CLK_DIV=CLK_DIV&0xDF;//CLK_DIV.5ADRJ=0

AUXR=0x80;//Timer0setas1T,16bitstimerauto-reload,

TH0=(u8)(Timer0_Reload/256);

TL0=(u8)(Timer0_Reload%256);

ET0=1;//Timer0interruptenable

TR0=1;//Tiner0run

EA=1;//打开总中断

for(k=11;k>0;k--)

{

for(i=0;i<4;i++)LED8[i]=k-1;//上电消隐

Delayms(1000);

}

while

(1)

{

if(B_1ms)//1ms到

{

B_1ms=0;

if(++msecond>=300)//300ms到

{

msecond=0;

j=Get_ADC10bitResult(AD_Cha);//参数0~7,查询方式做一次ADC,返回值就是结果,==1024为错误

//j=768;

if(j<1024)

{

LED8[0]=j/1000;//显示ADC值

LED8[1]=(j%1000)/100;

LED8[2]=(j%100)/10;

LED8[3]=j%10;

if(LED8[0]==0)LED8[0]=16;

}

else//错误

{

for(i=0;i<4;i++)LED8[i]=14;

}

j=Get_ADC10bitResult(3);//参数0~7,查询方式做一次ADC,返回值就是结果,==1024为错误

j+=Get_ADC10bitResult(3);

j+=Get_ADC10bitResult(3);

j+=Get_ADC10bitResult(3);

if(j<1024*4)

{

LED8[0]=j/1000;//显示ADC值

LED8[1]=(j%1000)/100;

LED8[2]=(j%100)/10;

LED8[3]=j%10;

if(LED8[0]==0)LED8[0]=DIS_BLACK;

j=get_temperature(j);//计算温度值

if(j>=400)F0=0,j-=400;//温度>=0度

elseF0=1,j=400-j;//温度<0度

LED8[4]=j/1000;//显示温度值

LED8[5]=(j%1000)/100;

LED8[6]=(j%100)/10+DIS_DOT;

LED8[7]=j%10;

if(LED8[4]==0)LED8[4]=DIS_BLACK;

if(F0)LED8[4]=DIS_;//显示-

}

else//错误

{

for(i=0;i<8;i++)LED8[i]=DIS_;

}

}

}

}

}

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

//========================================================================

//函数:

u16Get_ADC10bitResult(u8channel)

//描述:

查询法读一次ADC结果.

//参数:

channel:

选择要转换的ADC.

//返回:

10位ADC结果.

//版本:

V1.0,2012-10-22

//========================================================================

u16Get_ADC10bitResult(u8channel)//channel=0~7

{

ADC_RES=0;

ADC_RESL=0;

ADC_CONTR=(ADC_CONTR&0xe0)|0x08|channel;//starttheADC

NOP(4);

while((ADC_CONTR&0x10)==0);//waitforADCfinish

ADC_CONTR&=~0x10;//清除ADC结束标志

return(((u16)ADC_RES<<2)|(ADC_RESL&3));

}

 

//MF52E10Kat25,B=3950,ADC=12bits

u16codetemp_table[]={

140,//;-400

149,//;-391

159,//;-382

168,//;-373

178,//;-364

188,//;-355

199,//;-346

210,//;-337

222,//;-328

233,//;-319

246,//;-3010

259,//;-2911

272,//;-2812

286,//;-2713

301,//;-2614

317,//;-2515

333,//;-2416

349,//;-2317

367,//;-2218

385,//;-2119

403,//;-2020

423,//;-1921

443,//;-1822

464,//;-1723

486,//;-1624

509,//;-1525

533,//;-1426

558,//;-1327

583,//;-1228

610,//;-1129

638,//;-1030

667,//;-931

696,//;-832

727,//;-733

758,//;-634

791,//;-535

824,//;-436

858,//;-337

893,//;-238

929,//;-139

965,//;040

1003,//;141

1041,//;242

1080,//;343

1119,//;444

1160,//;545

1201,//;646

1243,//;747

1285,//;848

1328,//;949

1371,//;1050

1414,//;1151

1459,//;1252

1503,//;1353

1548,//;1454

1593,//;1555

1638,//;1656

1684,//;1757

1730,//;1858

1775,//;1959

1821,//;2060

1867,//;2161

1912,//;2262

1958,//;2363

2003,//;2464

2048,//;2565

2093,//;2666

2137,//;2767

2182,//;2868

2225,//;2969

2269,//;3070

2312,//;3171

2354,//;3272

2397,//;3373

2438,//;3474

2479,//;3575

2519,//;3676

2559,//;3777

2598,//;3878

2637,//;3979

2675,//;4080

2712,//;4181

2748,//;4282

2784,//;4383

2819,//;4484

2853,//;4585

2887,//;4686

2920,//;4787

2952,//;4888

2984,//;4989

3014,//;5090

3044,//;5191

3073,//;5292

3102,//;5393

3130,//;5494

3157,//;5595

3183,//;5696

3209,//;5797

3234,//;5898

3259,//;5999

3283,//;60100

3306,//;61101

3328,//;62102

3351,//;63103

3372,//;64104

3393,//;65105

3413,//;66106

3432,//;67107

3452,//;68108

3470,//;69109

3488,//;70110

3506,//;71111

3523,//;72112

3539,//;73113

3555,//;74114

3571,//;75115

3586,//;76116

3601,//;77117

3615,//;78118

3628,//;79119

3642,//;80120

3655,//;81121

3667,//;82122

3679,//;83123

3691,//;84124

3702,//;85125

3714,//;86126

3724,//;87127

3735,//;88128

3745,//;89129

3754,//;90130

3764,//;91131

3773,//;92132

3782,//;93133

3791,//;94134

3799,//;95135

3807,//;96136

3815,//;97137

3822,//;98138

3830,//;99139

3837,//;100140

3844,//;101141

3850,//;102142

3857,//;103143

3863,//;104144

3869,//;105145

3875,//;106146

3881,//;107147

3887,//;108148

3892,//;109149

3897,//;110150

3902,//;111151

3907,//;112152

3912,//;113153

3917,//;114154

3921,//;115155

3926,//;116156

3930,//;117157

3934,//;118158

3938,//;119159

3942//;120160

};

/********************计算温度***********************************************/

//计算结果:

0对应-40.0度,400对应0度,625对应25.0度,最大1600对应120.0度.

//为了通用,ADC输入为12bit的ADC值.

//电路和软件算法设计:

Coody

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

#defineD_SCALE10//结果放大倍数,放大10倍就是保留一位小数

u16get_temperature(u16adc)

{

u16code*p;

u16i;

u8j,k,min,max;

adc=4096-adc;//Rt接地

p=temp_table;

if(adc

if(adc>p[160])return(0xffff);

min=0;//-40度

max=160;//120度

for(j=0;j<5;j++)//对分查表

{

k=min/2+max/2;

if(adc<=p[k])max=k;

elsemin=k;

}

if(adc==p[min])i=min*D_SCALE;

elseif(adc==p[max])i=max*D_SCALE;

else//min

{

while(min<=max)

{

min++;

if(adc==p[min]){i=min*D_SCALE;break;}

elseif(adc

{

min--;

i=p[min];//min

j=(adc-i)*D_SCALE/(p[min+1]-i);

i=min;

i*=D_SCALE;

i+=j;

break;

}

}

}

returni;

}

 

voidDelayms(u16dlayT)

{

u16i,j;

for(i=0;i

for(j=0;j<1280;j++)

{

_nop_();

}

}

/**********************显示扫描函数************************/

voidDisplayScan(void)

{

u8i;

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

{

P3=0xff;

P1=0xff;

}

P3=t_display[LED8[display_index]];//输出段码

P1=T_COM[display_index];//输出位码

if(++display_index>=8)display_index=4;//8位结束回0

}

 

/**********************Timer01ms中断函数************************/

voidtimer0(void)interruptTIMER0_VECTOR

{

DisplayScan();//1ms扫描显示一位

B_1ms=1;//1ms标志

}

附件:

1、NTC热敏电阻原理及应用

2、STC15Fxxxx.H程序头文件

3、ST

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

当前位置:首页 > 初中教育 > 科学

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

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