- //測量第九通道(bandgap)值算出VCC
- #include <STC15WXX.h> //MCU:stc15w404as
- #include<stdio.h>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define FOSC 11059200L
- #define BAUD 9600
- //工作頻率11.0592MHz 串口波特率9600
- //-----------------------------------------
- //ADC相關設定參數
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個時鐘
- #define ADC_SPEEDL 0x20 //360個時鐘
- #define ADC_SPEEDH 0x40 //180個時鐘
- #define ADC_SPEEDHH 0x60 //90個時鐘
- //-----------------------------------------
- //BandGap相關參數
- #define ID_ADDR_RAM 0xef //對于只有256字節RAM的MCU(大部分系列)存放地址為0EFH
- //#define ID_ADDR_RAM 0x6f //對于只有128字節RAM的MCU(stc15f/w100系列)存放地址為06fH
- //注意:需要在下載代碼時選擇"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
- //容量不同的單片機請更改不同數值
- //#define ID_ADDR_ROM 0x03f7 //1K程序空間的MCU
- //#define ID_ADDR_ROM 0x07f7 //2K程序空間的MCU
- //#define ID_ADDR_ROM 0x0bf7 //3K程序空間的MCU
- //#define ID_ADDR_ROM 0x0ff7 //4K程序空間的MCU
- //#define ID_ADDR_ROM 0x13f7 //5K程序空間的MCU
- #define ID_ADDR_ROM 0x1ff7 //8K程序空間的MCU
- //#define ID_ADDR_ROM 0x27f7 //10K程序空間的MCU
- //#define ID_ADDR_ROM 0x2ff7 //12K程序空間的MCU
- //#define ID_ADDR_ROM 0x3ff7 //16K程序空間的MCU
- //#define ID_ADDR_ROM 0x4ff7 //20K程序空間的MCU
- //#define ID_ADDR_ROM 0x5ff7 //24K程序空間的MCU
- //#define ID_ADDR_ROM 0x6ff7 //28K程序空間的MCU
- //#define ID_ADDR_ROM 0x7ff7 //32K程序空間的MCU
- //#define ID_ADDR_ROM 0x9ff7 //40K程序空間的MCU
- //#define ID_ADDR_ROM 0xbff7 //48K程序空間的MCU
- //#define ID_ADDR_ROM 0xcff7 //52K程序空間的MCU
- //#define ID_ADDR_ROM 0xdff7 //56K程序空間的MCU
- //#define ID_ADDR_ROM 0xeff7 //60K程序空間的MCU
- //-----------------------------------------
- //聲明
- void InitUart();
- void InitADC();
- void SendData(uchar dat);
- uint GetADCResult(uchar ch);
- void Delay(uint n);
- void ShowResult(uchar ch);
- void main()
- {
- InitUart(); //初始化串口
- InitADC(); //初始化ADC
- P1M1=0X01; //高阻輸入
- while (1)
- {
- ShowResult(0); //顯示通道0
- //ShowResult(1); //顯示通道1
- // ShowResult(2); //顯示通道2
- //ShowResult(3); //顯示通道3
- //ShowResult(4); //顯示通道4
- //ShowResult(5); //顯示通道5
- //ShowResult(6); //顯示通道6
- //ShowResult(7); //顯示通道7
- Delay(100);
- }
- }
- /*----------------------------
- 發送ADC結果
- ----------------------------*/
- void ShowResult(uchar ch)
- {
- uint adc_res10,//測量設定通道adc值
- bandgap, //bandgap預儲存校準值,單位毫伏
- adc_9gallery_res; //測量第九通道(bandgap)值
- float power_voltage, //系統供電電壓,單位毫伏
- ADC_voltage; //設定通道電壓值,單位毫伏
- uchar code *cptr; //定義ROM(代碼)區指針
- //uchar idata *iptr;//定義RAM(內存)區指針
- cptr = ID_ADDR_ROM; //從程序區讀取BandGap電壓值(單位:毫伏mV)
- bandgap=*cptr++;
- bandgap<<=8;
- bandgap+=*cptr;
- /*iptr = ID_ADDR_RAM; //從內存區讀取BandGap電壓值(單位:毫伏mV)
- bandgap=*iptr++; //兩種方法結果一樣,上面的方法需要在下載式勾選"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
- bandgap<<=8; //下面的方法不需要
- bandgap+=*iptr; */
- //測量設定通道adc值
- ADC_RES = 0; //清除結果寄存器
- P1ASF = 0xff; //設置P1口為AD口
- GetADCResult(ch);
- GetADCResult(ch); //讀三次獲得穩定
- adc_res10= GetADCResult(ch);
- //測量第九通道(bandgap)值
- ADC_RES = 0; //清除結果寄存器
- P1ASF = 0x00; //設置讀第九通道
- GetADCResult(0); //測bandgap時,調用此函數時通道數只能填0
- GetADCResult(0); //讀三次獲得穩定
- adc_9gallery_res=GetADCResult(0);
- //計算系統供電電壓
- power_voltage=(float)bandgap*1024/adc_9gallery_res;
- //計算ADC通道測得電壓值
- ADC_voltage=(float)bandgap*adc_res10/adc_9gallery_res;
- printf("P1.%d ADC result:%d\n",(uint)ch,adc_res10);
- printf("BandGap standard:%d mV\n",bandgap);
- printf("BandGap value:%d \n",adc_9gallery_res);
- printf("system power voltage:%.0f mV\n",power_voltage);
- printf("ADC voltage:%.0f mV\n",ADC_voltage);
- }
- /*----------------------------
- 讀取ADC結果
- ----------------------------*/
- uint GetADCResult(uchar ch)
- {
- uint ADC_10BIT_RES;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //等待4個NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
- ADC_CONTR &= ~ADC_FLAG; //關閉 ADC
- ADC_10BIT_RES=ADC_RES; //得到高8位
- ADC_10BIT_RES<<=2;
- ADC_10BIT_RES+=ADC_RESL; //得到低2位
- return ADC_10BIT_RES; //返回ADC結果
- }
- /*----------------------------
- 初始化串口
- ----------------------------*/
- void InitUart()
- {
- SCON = 0x5a; //設置串口為8位可變波特率
- T2L = 0xE0; //設定定時初值
- T2H = 0xFE; //設定定時初值
- AUXR = 0x14; //T2為1T模式, 并啟動定時器2
- AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器
- }
- /*----------------------------
- 初始化ADC
- ----------------------------*/
- void InitADC()
- {
- P1ASF = 0xff; //設置P1口為AD口
- ADC_RES = 0; //清除結果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- Delay(2); //ADC上電并延時
- }
- /*----------------------------
- 軟件延時
- ----------------------------*/
- void Delay(uint n)
- {
- uint x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
復制代碼 |