標題:
STC單片機電量檢測程序AD轉(zhuǎn)換測量第九通道(bandgap)值
[打印本頁]
作者:
yywxyhnyll
時間:
2021-12-23 16:07
標題:
STC單片機電量檢測程序AD轉(zhuǎn)換測量第九通道(bandgap)值
//測量第九通道(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相關(guān)設(shè)定參數(shù)
#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相關(guān)參數(shù)
#define ID_ADDR_RAM 0xef //對于只有256字節(jié)RAM的MCU(大部分系列)存放地址為0EFH
//#define ID_ADDR_RAM 0x6f //對于只有128字節(jié)RAM的MCU(stc15f/w100系列)存放地址為06fH
//注意:需要在下載代碼時選擇"在ID號前添加重要測試參數(shù)"選項,才可在程序中獲取此參數(shù)
//容量不同的單片機請更改不同數(shù)值
//#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);
}
}
/*----------------------------
發(fā)送ADC結(jié)果
----------------------------*/
void ShowResult(uchar ch)
{
uint adc_res10,//測量設(shè)定通道adc值
bandgap, //bandgap預儲存校準值,單位毫伏
adc_9gallery_res; //測量第九通道(bandgap)值
float power_voltage, //系統(tǒng)供電電壓,單位毫伏
ADC_voltage; //設(shè)定通道電壓值,單位毫伏
uchar code *cptr; //定義ROM(代碼)區(qū)指針
//uchar idata *iptr;//定義RAM(內(nèi)存)區(qū)指針
cptr = ID_ADDR_ROM; //從程序區(qū)讀取BandGap電壓值(單位:毫伏mV)
bandgap=*cptr++;
bandgap<<=8;
bandgap+=*cptr;
/*iptr = ID_ADDR_RAM; //從內(nèi)存區(qū)讀取BandGap電壓值(單位:毫伏mV)
bandgap=*iptr++; //兩種方法結(jié)果一樣,上面的方法需要在下載式勾選"在ID號前添加重要測試參數(shù)"選項,才可在程序中獲取此參數(shù)
bandgap<<=8; //下面的方法不需要
bandgap+=*iptr; */
//測量設(shè)定通道adc值
ADC_RES = 0; //清除結(jié)果寄存器
P1ASF = 0xff; //設(shè)置P1口為AD口
GetADCResult(ch);
GetADCResult(ch); //讀三次獲得穩(wěn)定
adc_res10= GetADCResult(ch);
//測量第九通道(bandgap)值
ADC_RES = 0; //清除結(jié)果寄存器
P1ASF = 0x00; //設(shè)置讀第九通道
GetADCResult(0); //測bandgap時,調(diào)用此函數(shù)時通道數(shù)只能填0
GetADCResult(0); //讀三次獲得穩(wěn)定
adc_9gallery_res=GetADCResult(0);
//計算系統(tǒng)供電電壓
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結(jié)果
----------------------------*/
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轉(zhuǎn)換完成
ADC_CONTR &= ~ADC_FLAG; //關(guān)閉 ADC
ADC_10BIT_RES=ADC_RES; //得到高8位
ADC_10BIT_RES<<=2;
ADC_10BIT_RES+=ADC_RESL; //得到低2位
return ADC_10BIT_RES; //返回ADC結(jié)果
}
/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
SCON = 0x5a; //設(shè)置串口為8位可變波特率
T2L = 0xE0; //設(shè)定定時初值
T2H = 0xFE; //設(shè)定定時初值
AUXR = 0x14; //T2為1T模式, 并啟動定時器2
AUXR |= 0x01; //選擇定時器2為串口1的波特率發(fā)生器
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //設(shè)置P1口為AD口
ADC_RES = 0; //清除結(jié)果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上電并延時
}
/*----------------------------
軟件延時
----------------------------*/
void Delay(uint n)
{
uint x;
while (n--)
{
x = 5000;
while (x--);
}
}
復制代碼
作者:
gongzhu
時間:
2022-5-3 15:55
一定要用內(nèi)部晶振,外部晶振讀不出來bandgap,下載的時候還要勾選 在程序區(qū)結(jié)束處添加重要測試參數(shù)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1