include "STC8.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 9600 / 4)
bit busy;
char wptr;
char rptr;
char buffer[16];
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
void UartIsr() interrupt 4 using 1
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x0f;
}
}
void UartInit()
{
SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
AUXR = 0x40;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void InitADC()
{
P1M0 = 0xff;
P1M1 = 0xff;
P0M0 = 0xff;
P0M1 = 0xff;
ADCCFG = 0x0f; //設置ADC時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
}
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR |= (0x40+ch);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~ADC_FLAG; //Close ADC
ADC_CONTR &= ~0x20; //清完成標志
return ADC_RES; //讀取ADC結果
}
void ShowResult(BYTE ch)
{
//UartSend(ch); //Show Channel NO.
UartSend(GetADCResult(ch)); //Show ADC high 8-bit result
//if you want show 10-bit result, uncomment next line
// SendData(ADC_LOW2); //Show ADC low 2-bit result
}
void main()
{
BYTE i=0;
UartInit();
ES = 1;
EA = 1;
//UartSendStr("Uart OK !\r\n");
InitADC(); //Init ADC sfr
while (1)
{
InitADC();
//UartSend(1);
ShowResult(11);
Delay(100);
InitADC();
UartSend(2);
//ShowResult(12);
Delay(100);
InitADC();
UartSend(3);
//ShowResult(13);
Delay(100);
InitADC();
UartSend(4);
//ShowResult(14);
Delay(100);
}
}
|