#include "stc8h.h"
#include "eeprom.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/************* ±¾µØ³£Á¿ÉùÃ÷ **************/
//1~16,使用的ADC轉換通道數量,必須和[ADC_DMA通道使能寄存器(DMA_ADC_CHSWx)]中啟用的ADC通道數量一致
#define ADC_CH_NUM 1
//ADC轉換次數,必須和[ADC_DMA配置寄存器2(DMA_ADC_CFG2)]設置的一致
#define ADC_SAMPLES_NUM 8
//每個通道ADC轉換數據總字節數=2*轉換次數+4
#define ADC_DATA_SIZE (ADC_SAMPLES_NUM*2 + 4)
//存儲ADC DMA轉換結果,即ADC DMA的目的地址
u8 xdata adc_samples_buff[ADC_CH_NUM][ADC_DATA_SIZE];
//ADC DMA轉換完成標志
bit DmaFlag;
void Uart1_Init(void); //4800bps@11.0592MHz
void sendByte(char dat);
void sendString(unsigned char *dat);
char putchar(char c);
void adc_dma_config(void);
void Delay500ms(void); //@11.0592MHz
void ADC_Init(void);
void main()
{
u8 i,j;
u16 adc_value;
float voltage;
Uart1_Init();
ADC_Init();
EA = 1;
printf("Hello");
while(1)
{
if(DmaFlag)
{
DmaFlag = 0;
adc_value=(adc_samples_buff[0][16]<<8)+adc_samples_buff[0][17];
voltage = (5*adc_value)/4096;
printf("voltage: %.2fV\r\n",voltage);
DMA_ADC_CR = 0xC0;
}
Delay500ms();
}
}
void adc_dma_config(void)
{
P_SW2 = 0x80;
DMA_ADC_STA = 0x00; //清零ADC DMA狀態寄存器
DMA_ADC_CFG = 0x80; //開啟ADC DMA中斷
DMA_ADC_RXAH = (u8)((u16)(&adc_samples_buff) >> 8); //ADC轉換數據存儲地址,即ADC DMA目的地址
DMA_ADC_RXAL = (u8)((u16)(&adc_samples_buff));
DMA_ADC_CFG2 = 0x0A; //每個通道ADC轉換次數:8
DMA_ADC_CHSW0 = 0x01; //使能ADC通道1
DMA_ADC_CHSW1 = 0x00;
DMA_ADC_CR = 0xC0; //啟動ADC DMA轉換
}
void ADC_Init(void)
{
P1M0=0x00; //設置P10為高阻輸入
P1M1=0x01;
ADCTIM = 0x3F; //設置ADC內部時許
ADCCFG = 0x2F; //設置ADC時鐘為系統時鐘,數據右對齊
ADC_CONTR = 0x80; //使能ADC模塊
}
void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數據位,可變波特率
AUXR &= 0xBF; //定時器時鐘12T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFA;
TH1 = 0xFA;
ET1 = 0;
TR1 = 1;
}
void sendByte(char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void sendString(unsigned char *dat)
{
while(*dat != '\0')
{
sendByte(*dat++);
}
}
char putchar(char c)
{
sendByte(c);
return c;
}
void ADC_DMA_Interrupt(void) interrupt 13
{
DMA_ADC_STA = 0;
DmaFlag = 1;
}
void Delay500ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
|