/*
晶振11.0592
波特率 115200
*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC; //ADC control register
sfr ADC_RES = 0xBD; //ADC hight 8-bit result register
sfr ADC_RESL = 0xBE; //ADC low 2-bit result register
sfr P1ASF = 0x9D; //P1 secondary function control register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE CHS = 0; //ADC channel NO.
void main()
{
InitUart(); //初始化串口
InitADC(); //初始化ADC
IE = 0xa0; //使能ADC中断
//开始AD转换
//P1M0 = P1M1 = 0X01;
while (1);
}
/*----------------------------
ADC interrupt service routine
----------------------------*/
/*----------------------------
ADC中断服务程序
----------------------------*/
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
SendData(CHS); //显示通道号
//SendData(ADC_RES); //读取高8位结果并发送到串口
SendData(ADC_RESL); //显示低位结果
// if (++ch > 7) ch = 0; //切换到下一个通道
//ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | CHS;
ADC_CONTR = 0xE8;//ADC_开始转换,速度90个时钟周期转换一次 P1.0作为AD输入通道
}
/*----------------------------
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
//AUXR1 = 0x04; //采集高二位,低八位
P1ASF = 0x01; //设置P1.0口为AD寄存器
ADC_RES = 0; //清除结果寄存器
//ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | CHS;
ADC_CONTR = 0xE8;
Delay(2); //ADC上电并延时,开始转换,通道CHS
}
/*----------------------------
Initial UART
----------------------------*/
void InitUart()
{
SCON = 0x5a; //8 bit data ,no parity bit
TMOD = 0x20; //设置定时器1为8位自动重装载模式
AUXR = 0x40; //定时器1为1T模式
TH1 = TL1 = 0xFD; //115200 bps(256 - 18432000/32/115200)
TR1 = 1;
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (!TI); //等待前一个数据发送完成
TI = 0; //清除发送标志
SBUF = dat; //发送当前数据
}
/*----------------------------
Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}