改這樣試試,未經驗證,自行完善。
- #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
- }
- //=========================================================================================
復制代碼 |