NTC测温 变化大 一会22一会23 请教下大佬们 程序如下
#include <stc15.h>#include "intrins.h"
#include"ntc.h"
//#define FOSC 11059200UL
//#define BAUD 115200
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL0x20 //360个时钟
#define ADC_SPEEDH0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
//#define CLK_DIV 0X97;
#defineadcbo 0.09 //滤波系数
//typedef unsigned int u16; //对数据类型进行声明定义
//typedef unsigned char u8;
u16 temp,temp2;
s16 temp1;
u8 disp;
u8 xdata SMG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sbit v1=P1^2;
sbit v2=P1^3;
sbit v3=P1^4;
bit busy;
char wptr;xdata
char rptr;
char buffer;
u8 ddy;
void Beep();
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void Delayms(u16 k)
{
while(k)
{
Delay1ms();
k--;
}
}
void UartInit(void) //4800bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x8F; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
ES = 1; //打开串口中断
EA =1; //打开总中断
}
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer = SBUF;
wptr &= 0x0f;
}
}
void InitADC()
{
// PCON2=0X20;
CLK_DIV |= 0x20; //ADC_RES高8位
P1ASF = 0x02; //设置P1.1口为AD口
ADC_RES = 0;
ADC_RESL=0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
Delayms(5); //ADC上电并延时
}
u16 GetADCResult(u8 ch)
{
u16 weidu;
u16 mun=0;
u8 count=0, n=100;
ADC_CONTR = ADC_POWER | ADC_SPEEDHH|ch| ADC_START;
_nop_();
_nop_(); //等待5个NOP
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
// weidu=ADC_RESL; //返回ADC结果
// weidu=weidu<<8;
// weidu|=ADC_RES;
weidu=ADC_RES; //返回ADC结果
weidu=weidu<<8;
weidu|=ADC_RESL;
for(count=0;count<n;count++) //求100次的平均值
{
mun+=weidu;
}
return (mun/n);
// return weidu;
}
u16 adcc(u16 k) //k为ADC数值返回adata为经过一阶低涌滤波后数值
{
static ndata; //上一次的计算值
u16 adata; //本次的计算值
adata=(k*adcbo)+(1-adcbo)*ndata; //计算
ndata=adata; // 存下本次值
return adata; //返回数据
}
void SMG_DigDisplay()
{
u8 i;
for(i=0;i<3;i++)//位选,选择点亮的数码管
{
switch(i)
{
case (0):v1=1;v2=0;v3=0;break;//显示最高位
case (1):v1=0;v2=1;v3=0;break;
case (2):v1=0;v2=0;v3=1;break;
}
P3=disp;
Delayms(2);
// P3=0xff;
}
}
void Smgxx()
{
static s16 vis=0;
// static u16 vis1=0;
u8 con=0;
// temp=GetADCResult(1);
// if(vis1!=temp)
// {
//
// vis1=temp;
//
//
temp=GetADCResult(1);
temp2=adcc(temp);
temp1=Temperature(temp2);
if(vis!=temp1)
{
vis=temp1;
if(temp1<0)
{
disp =0xbf ; //-
temp1 *=-1;
}
else
{
disp = 0xc0; //不显示
}
disp = SMG;
disp = SMG;
}
// }
}
void main()
{
P3M0 = 0x00; P3M1 = 0x00;
// P1M0 = 0x1c; P1M1 = 0x02;
P1M0 = 0x00; P1M1 = 0x02;
InitADC(); //初始化ADC
// IE = 0xa0; //使能ADC中断
// UartInit();
Delayms(1000); //延时开机
while(1)
{
// UartSend(temp);
//// UartSend(temp);
// Delayms(1000);
// disp = SMG;
// disp = SMG;
// disp = SMG;
Smgxx();
SMG_DigDisplay();
}
}
参考下我们 STC8H 实验箱的参考程序
深圳国芯人工智能有限公司-实验箱 (stcai.com)
要是温度显示不稳定你来打我
谢谢我去看看
页:
[1]