/***********************************************************
程序功能:STC12C5A60S2自帶ADC采集電壓信號+DS18B20溫度傳感器+LCD1602液晶顯示
MCU型號: STC12C5A60S2
晶振頻率:11.0892MHz
整理時間:2012年4月25號
************************************************************/
#include"STC12c5a60s2.h" //頭文件在STC公司主頁上下載
#include "intrins.h"
//sfr P4 = 0XC0;
//sfr ADC_CONTR = 0XBC;
//sfr ADC_RES = 0XBD;
sfr ADC_LOW2 = 0XBE;
//sfr P1ASF = 0X9D;
typedef unsigned char BYTE;
typedef unsigned int WORD;
#include "1602.h"
#include "DS18B20.h"
#define ADC_POWER 0X80
#define ADC_FLAG 0X10
#define ADC_START 0X08
#define ADC_SPEEDLL 0X00
#define ADC_SPEEDL 0X20
#define ADC_SPEEDH 0X40
#define ADC_SPEEDHH 0X60
unsigned char vr[17],vl[14];
unsigned int V1,V3;
void InitADC();
void Delay(WORD n);
WORD GetADCResult(BYTE ch);
void DisplayADCResult(int num);
void DisplayTemperature(int num);
unsigned char temp;
char qian=0,bai=0,shi=0,ge=0;
BYTE ly_dis[4];//定義顯示緩沖區
unsigned int AD_get(unsigned char channel)
{
ADC_CONTR=0x88|channel; //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10)); //等待轉換完成
ADC_CONTR&=0xe7; //關閉AD轉換,ADC_FLAG位由軟件清0
return(ADC_RES*4+ADC_RESL); //返回AD轉換完成的10位數據(16進制)
}
float AD_work(unsigned char channel)
{
float AD_val; //定義處理后的數值AD_val為浮點數
unsigned char i;
for(i=0;i<10;i++)
AD_val+=AD_get(channel); //轉換10次求平均值(提高精度)
AD_val/=10;
AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機上的5v,所以乘5即為實際電壓值
return AD_val;
}
void UsartConfiguration() //工作方式一 計數器工作方式2 波特率4800
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF3;
TL1=0XF3;
TR1=1;
}
void chuankou_send(int num);//串口初始化 不加int型參數串口不好用
void main()
{
WORD i=0;
float tt;
int ltemp;
LCDInit();
UsartConfiguration();
DisplayListChar(0, 0, "Temp:");
while(1)
{
if(i==0)
tmpchange(); //溫度轉換
if(i==100)
{
tt=tmp()*0.0625; //得到真實十進制溫度值,因為DS18B20
//可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度。
ltemp=tt*10+0.5; //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。
if(ltemp<0)
{ //判斷第一位顯示整數還是負號
ly_dis[0]=0xbf;
ltemp=0-ltemp;
}
else
ly_dis[0]=ltemp/1000;//顯示百位值
ltemp=ltemp%1000;
ly_dis[1]=ltemp/100; //顯示溫度十位值
ltemp=ltemp%100;
ly_dis[2]=ltemp/10; //顯示溫度個位值
ly_dis[3]=ltemp%10; //顯示小數點后一位
}
i++;
if(i==150)
{
DisplayADCResult(0);
i=0;
}
DisplayTemperature(6); //調用顯示
// chuankou_send(0);
}
}
void DisplayADCResult(int num)
{
V1=AD_work(6)*10000; //采集上電位器的AD數據,保留4位小數
V3=AD_work(5)*10000; //采集下電位器的AD數據,保留4位小數
vr[7]=V1%10+'0'; vr[6]=V1/10%10+'0'; vr[5]=V1/100%10+'0';
vr[4]=V1/1000%10+'0'; vr[3]='.'; vr[2]=V1/10000%10+'0';
vr[1]=':'; vr[0]='X';
vr[16]=V3%10+'0'; vr[15]=V3/10%10+'0'; vr[14]=V3/100%10+'0';
vr[13]=V3/1000%10+'0'; vr[12]='.'; vr[11]=V3/10000%10+'0';
vr[10]=':'; vr[9]='S'; vr[8]=' ';
//DisplayOneChar(0,1,vr[0]);
DisplayOneChar(1,1,vr[1]);
// SBUF=vr[1];
// while(!TI);
// TI=0;
DisplayOneChar(2,1,vr[2]);
// SBUF=vr[2];
// while(!TI);
// TI=0;
DisplayOneChar(3,1,vr[3]);
// SBUF=vr[3];
// while(!TI);
// TI=0;
DisplayOneChar(4,1,vr[4]);
// SBUF=vr[4];
// while(!TI);
// TI=0;
DisplayOneChar(5,1,vr[5]);
// SBUF=vr[5];
// while(!TI);
// TI=0;
DisplayOneChar(6,1,vr[6]);
// SBUF=vr[6];
// while(!TI);
// TI=0;
DisplayOneChar(7,1,vr[7]);
// SBUF=vr[7];
// while(!TI);
// TI=0;
DisplayOneChar(8,1,vr[9]);
// SBUF=vr[9];
// while(!TI);
// TI=0;
DisplayOneChar(9,1,vr[10]);
// SBUF=vr[10];
// while(!TI);
// TI=0;
DisplayOneChar(10,1,vr[11]);
// SBUF=vr[11];
// while(!TI);
// TI=0;
DisplayOneChar(11,1,vr[12]);
// SBUF=vr[12];
// while(!TI);
// TI=0;
DisplayOneChar(12,1,vr[13]);
// SBUF=vr[13];
// while(!TI);
// TI=0;
DisplayOneChar(13,1,vr[14]);
// SBUF=vr[14];
// while(!TI);
// TI=0;
DisplayOneChar(14,1,vr[15]);
// SBUF=vr[15];
// while(!TI);
// TI=0;
DisplayOneChar(15,1,vr[16]);
// SBUF=vr[16];
// while(!TI);
// TI=0;
DisplayOneChar(16,1,vr[0]);
// SBUF=vr[0];
// while(!TI);
// TI=0;
//DisplayOneChar();
// qian=GetADCResult(Channel)/1000;
// bai=GetADCResult(Channel)%1000/100;
// shi=GetADCResult(Channel)%1000%100/10;
// ge=GetADCResult(Channel)%10;
// if(0==qian)
// DisplayOneChar(5,1,' ');
// else
// DisplayOneChar(5,1,table[qian]);
//
// if(0==bai&&0==qian)
// DisplayOneChar(6,1,' ');
// else
// DisplayOneChar(6,1,table[bai]);
//
// DisplayOneChar(7,1,table[shi]);
// DisplayOneChar(8,1,table[ge]);
//
// DisplayOneChar(9, 1, 'v');
//
}
void DisplayTemperature(int num) //溫度加串口
{
if(0==ly_dis[0])
DisplayOneChar(5, 0, ' ');
else
DisplayOneChar(5, 0, table[ly_dis[0]]);
SBUF='T';
while(!TI);
TI=0;
SBUF=':';
while(!TI);
TI=0;
DisplayOneChar(6, 0, table[ly_dis[1]]);
SBUF=table[ly_dis[1]];
while(!TI);
TI=0;
DisplayOneChar(7, 0, table[ly_dis[2]]);
SBUF=table[ly_dis[2]];
while(!TI);
TI=0;
DisplayOneChar(8, 0,'.');
SBUF='.';
while(!TI);
TI=0;
DisplayOneChar(9, 0, table[ly_dis[3]]);
SBUF=table[ly_dis[3]];
while(!TI);
TI=0;
DisplayOneChar(10, 0, 0xdf);
DisplayOneChar(11, 0, 'C');
SBUF=' ';
while(!TI);
TI=0;
SBUF='\n';
while(!TI);
TI=0;
// Delay(2); //延時后刷新數據過慢 所以注釋掉
}
WORD GetADCResult(BYTE ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG;
return ADC_RES*4+ADC_LOW2;
}
void InitADC()
{
P1ASF = 0XFF;
ADC_RES = 0;
ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
Delay(2);
}
void Delay(WORD t)
{
WORD x;
while(t--)
{
x = 5000;
while(x--);
}
}
//void chuankou_send(int num) 不好用
//{
// SBUF='T';
// while(!TI);
// TI=0;
// SBUF=':';
// while(!TI);
// TI=0;
// SBUF=table[ly_dis[1]];
// while(!TI);
// TI=0;
// SBUF=table[ly_dis[2]];
// while(!TI);
// TI=0;
// SBUF='.';
// while(!TI);
// TI=0;
// SBUF=table[ly_dis[3]];
// while(!TI);
// TI=0;
//// SBUF=vr[1];
//// while(!TI);
//// TI=0;
//// SBUF=vr[2];
//// while(!TI);
//// TI=0;
//// SBUF=vr[3];
//// while(!TI);
//// TI=0;
//// SBUF=vr[4];
//// while(!TI);
//// TI=0;
//// SBUF=vr[5];
//// while(!TI);
//// TI=0;
//// SBUF=vr[6];
//// while(!TI);
//// TI=0;
//// SBUF=vr[7];
//// while(!TI);
//// TI=0;
//// SBUF=vr[8];
//// while(!TI);
//// TI=0;
//// SBUF='S';
//// while(!TI);
//// TI=0;
//// SBUF=vr[10];
//// while(!TI);
//// TI=0;
//// SBUF=vr[11];
//// while(!TI);
//// TI=0;
//// SBUF=vr[12];
//// while(!TI);
//// TI=0;
//// SBUF=vr[13];
//// while(!TI);
//// TI=0;
//// SBUF=vr[14];
//// while(!TI);
//// TI=0;
//// SBUF=vr[15];
//// while(!TI);
//// TI=0;
//// SBUF=vr[16];
//// while(!TI);
//// TI=0;
//// SBUF=vr[0];
//// while(!TI);
//// TI=0;
// SBUF='\n';
// while(!TI);
// TI=0;
// Delay(2);
//} |