#include "STC8xxxx.H" //頭文件
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
sbit led = P5^5;
int *BGV; //內部1.19V參考信號源值存放在idata中
//idata的EFH地址存放高字節
//idata的F0H地址存放低字節
//電壓單位為毫伏(mV)
bit busy;
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
}
}
void UartInit()
{
SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
AUXR = 0x40;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void ADCInit()
{
P_SW2 |= 0x80;
ADCTIM = 0x3f; //設置ADC內部時序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設置ADC時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x8f; //使能ADC模塊,并選擇第15通道
}
int ADCRead()
{
int res;
ADC_CONTR |= 0x40; //啟動AD轉換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
res = (ADC_RES << 8) | ADC_RESL; //讀取ADC結果
return res;
}
void main()
{
int res;
int vcc;
int i;
P5M0 = 0x00;
P5M1 = 0x00;
BGV = (int idata *)0xef;
ADCInit(); //ADC初始化
UartInit(); //串口初始化
ES = 1;
EA = 1;
// ADCRead();
// ADCRead(); //前兩個數據建議丟棄
res = 0;
for (i=0; i<8; i++)
{
res += ADCRead(); //讀取8次數據
}
res >>= 3; //取平均值
vcc = (int)(1024L * *BGV / res); //(10位ADC算法)計算VREF管腳電壓,即電池電壓
//printf(vcc);
// vcc = (int)(4096L * *BGV / res); //(12位ADC算法)計算VREF管腳電壓,即電池電壓
//注意,此電壓的單位為毫伏(mV)
UartSend(vcc >> 8); //輸出電壓值到串口,顯示為“0D”
UartSend(vcc); //輸出電壓值到串口,顯示為顯示為“14”
//將16進制“0D 14”轉換成10進制是“3348”,請問如何在C語言程序中,將“vcc >> 8”和“vcc”相加等于“3348”?謝謝!
//我想要實現如下的效果,當電壓高于3200毫伏時亮燈
if (vcc > 3200){
led = 0; //LED燈亮起,電量提醒
}
while (1);
}
|