改这样试试,未经验证,自行完善。
- #include "stc8hxx.h"
- #include "adc.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- unsigned int line_bat_0; //通道0的ADC结果,送显示用的
- unsigned int line_bat_1; //通道1的ADC结果,送显示用的
- unsigned int line_bat_2; //通道2的ADC结果,送显示用的
- unsigned long int ADC_DATA0; // ADC0数据
- unsigned long int ADC_DATA1; // ADC1数据
- unsigned long int ADC_DATA2; // ADC2数据
- u8 count0; // ADC通道0转换次数记录
- u8 count1; // ADC通道1转换次数记录
- u8 count2; // ADC通道2转换次数记录
- u8 ADC_LINE; // ADC通道记录
- //ADC口初始化
- void STC8ADC_INIT() //STC8ADC初始化
- {
- P1M0=0x00;
- P1M1=0x07; //设定P1.4567通道为高阻
- P_SW2|=0X80; //打开特殊功能寄存器
- ADCTIM=0X3F; //设置ADC内部时序
- P_SW2&=0X7F; //关闭特殊功能寄存器
- ADCCFG=0x2f; //设置ADC的时钟和转换结果存放格式
- ADC_CONTR=0x80; //使能ADC模块
- ADC_LINE=0x80; //通道0
- DelayXms(5); //等待5ms
- ADC_CONTR=ADC_CONTR|0x40; //启动ADC
- EADC=1; //打开ADC中断开关
- }
- void UART1_Isr(unsigned char ADCch,unsigned char ADCcount,unsigned long int ADCadd)
- {
- unsigned char buf[8];
- unsigned char i;
- buf[0]=ADCch&0x0f;
- buf[1]=ADCcount;
- buf[2]=ADCadd>>24;
- buf[3]=ADCadd>>16;
- buf[4]=ADCadd>>8;
- buf[5]=ADCadd;
- for(i=0;i<6;i++)
- {
- SBUF = buf[i];
- while(!TI);
- TI = 0;
- }
- }
- void main()
- {
- STC8ADC_INIT();
- SCON = 0x50;
- T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
- T2H = 0xff;
- AUXR = 0x15; //启动定时器
- // ES = 1; //使能串口中断
- EA = 1;
- while(1);
- }
- void ADC_ISR()interrupt 5
- {
- //ADC_CONTR&=~0x20;
- ADC_CONTR=ADC_CONTR&0xdf; //清除中断标志位
- //=============================================================================================================
- if(ADC_LINE==0x80) //选择通道0
- {
- if(count0>=100) //如果通道0转换次数小于32
- {
- line_bat_0=ADC_DATA0/100;
- ADC_DATA0=0x00; //ADC0数据清零
- count0=0x00; //通道0转换次数清零
- }
- ADC_DATA0=ADC_DATA0+(ADC_RES*256+ADC_RESL); //ADC结果处理
- UART1_Isr(ADC_LINE,count0,ADC_DATA0);//串口发送数据
- count0++; //通道0转换次数加1
- ADC_LINE=0x81; //切换下一通道(通道1)
- ADC_CONTR=ADC_LINE; //下一通道值赋给控制寄存器
- }
- //====================================================================
- else if(ADC_LINE==0x81) //选择通道1
- {
- if(count1>=100) //如果通道1转换次数小于32
- {
- line_bat_1=ADC_DATA1/100;
- ADC_DATA1=0x00; //ADC1数据清零
- count1=0x00; //通道1转换次数清零
- }
- ADC_DATA1=ADC_DATA1+(ADC_RES*256+ADC_RESL); //ADC结果处理
- UART1_Isr(ADC_LINE,count1,ADC_DATA1);//串口发送数据
- count1++; //通道1转换次数加1
- ADC_LINE=0x82; //切换下一通道(通道2)
- ADC_CONTR=ADC_LINE; //下一通道值赋给控制寄存器
- }
- //=====================================================================
- else if(ADC_LINE==0x82) //选择通道2
- {
- if(count2<100) //如果通道2转换次数小于32
- {
- line_bat_2=ADC_DATA2/100;
- ADC_DATA2=0x00; //ADC2数据清零
- count2=0x00; //通道2转换次数清零
- }
- ADC_DATA2=ADC_DATA2+(ADC_RES*256+ADC_RESL); //ADC结果处理
- UART1_Isr(ADC_LINE,count2,ADC_DATA2);//串口发送数据
- count2++; //通道2转换次数加1
- ADC_LINE=0x80; //切换下一通道(通道0)
- ADC_CONTR=ADC_LINE; //下一通道值赋给控制寄存器
- }
- //=============================================================================================================
- ADC_CONTR=ADC_CONTR|0x40; //启动ADC
- }
- //=========================================================================================
复制代码 |