TA的每日心情 | 开心 3 天前 |
---|
签到天数: 71 天 [LV.6]常住居民II
中级会员
- 积分
- 248
|
#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_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
//#define CLK_DIV 0X97;
#define adcbo 0.09 //滤波系数
//typedef unsigned int u16; //对数据类型进行声明定义
//typedef unsigned char u8;
u16 temp,temp2;
s16 temp1;
u8 disp[3];
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[16];
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[wptr++] = 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[i];
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[0] =0xbf ; //-
temp1 *=-1;
}
else
{
disp[0] = 0xc0; //不显示
}
disp[1] = SMG[temp1 /10%10];
disp[2] = SMG[temp1 %10];
}
// }
}
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[0] = SMG[1];
// disp[1] = SMG[2];
// disp[2] = SMG[3];
Smgxx();
SMG_DigDisplay();
}
}
|
|