#include "STC15.h"
#include "intrins.h"
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#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個時鐘
uchar code adwd[101] = {
0xBD,0xBB,0xB9,0xB6,0xB4,0xB2,0xAF,0xAD,0xAA,0xA8,
0xA5,0xA3,0xA0,0x9D,0x9B,0x98,0x96,0x93,0x91,0x8E,
0x8B,0x89,0x86,0x84,0x81,0x7F,0x7C,0x7A,0x77,0x75,
0x72,0x70,0x6E,0x6B,0x69,0x67,0x65,0x62,0x60,0x5E,
0x5C,0x5A,0x58,0x56,0x54,0x52,0x50,0x4E,0x4C,0x4B,
0x49,0x47,0x46,0x44,0x42,0x41,0x3F,0x3E,0x3C,0x3B,
0x39,0x38,0x37,0x35,0x34,0x33,0x32,0x30,0x2F,0x2E,
0x2D,0x2C,0x2B,0x2A,0x29,0x28,0x27,0x26,0x25,0x24,
0x23,0x22,0x22,0x21,0x20,0x1F,0x1F,0x1E,0x1D,0x1D,
0x1C,0x1B,0x1B,0x1A,0x19,0x19,0x18,0x18,0x17,0x17,
0x16
};//采樣AD 從大到小
uchar code wd[101] = {
0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,
50,51,52,53,54,55,56,57,58,59,
60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,
90,91,92,93,94,95,96,97,98,99,
100
};//AD對應的溫度值 從低到高
void UartInit(void) //115200bps@12.000MHz
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x40; //定時器時鐘1T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
TMOD &= 0x0F; //設置定時器模式
TL1 = 0xE6; //設置定時初始值
TH1 = 0xFF; //設置定時初始值
ET1 = 0; //禁止定時器%d中斷
TR1 = 1; //定時器1開始計時
}
/*----------------------------
軟件延時
----------------------------*/
void Delay(uint n)
{
uint x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*發送一個字節*/
void SendData(uchar ch)
{
SBUF = ch; //寫數據到UART數據寄存器
while(TI == 0);
TI = 0;
}
/*發送字符串*/
void SendString(uchar *s)
{
while (*s) //檢測字符串結束標志
{
SendData(*s++); //發送當前字符
}
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //設置P1.0口為AD口
ADC_RES = 0; //清除結果寄存器高8位
ADC_CONTR = ADC_POWER ; //ADC上電
Delay(2);
}
uchar adc()
{
uchar ad;
ADC_CONTR = 0x88; //ADC上電并啟動(轉換完成自動關閉ADC,每次轉換都要先啟動ADC)
Delay(2);
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
ADC_CONTR &= ~ADC_FLAG; //清零ADC標志位
ad=ADC_RES; //得到高8位
return ad;
}
uint htd(uint a)//十六進制轉十進制
{
uint b,c;
b=a%10;
c=b;
a=a/10;
b=a%10;
c=c+(b<<4);
a=a/10;
b=a%10;
c=c+(b<<8);
a=a/10;
b=a%10;
c=c+(b<<12);
return c;
}
void main()
{
uchar y,j;
UartInit(); //初始化串口
InitADC(); //初始化ADC
while (1)
{
y=adc();
for(j=0; j<100; j++) //查溫度表
{
if(y>=adwd[j]) //AD數組從大到小逐次比較
break;
}
SendData(htd(wd[j]));//溫度值轉十進制發送
Delay(400);
}
}
|