- //测量第九通道(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--);
- }
- }
复制代码 |