以下是ADC采集程序:
#include "config.h"
#include "timer.h"
#include "GPIO.h"
#include "adc.h"
#define POW_19V_ON P54 //定義電源控制腳
#define Farad_ON P55 //定義法拉電容供電控制腳
#define PC_OFF P31 //定義PC斷電后的關斷信號輸出
/************* GPIO端口功能說明 **************
本例程基于STC8G1K08A-8PIN 為主控芯片的編寫測試
1)P3.3的ADC3端采樣超級電容充放電電壓狀態
2)P3.2的ADC2端口采樣外部24V失電后下降速率。
3)P5.4使能DC_DC開關電源對PC供電。條件是P3.2失電低于22.8V使能DC_DC開始供電PC。
4)P5.5使能超級電容向外部供電。條件是P3.2采樣外部24V電壓下降到22.8V。
******************************************/
/************************ IO口輸出推挽配置 ****************************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //結構定義
GPIO_InitStructure.Pin = GPIO_Pin_0|GPIO_Pin_1; //指定要初始化的IO, GPIO_Pin_0 GPIO_Pin_1
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO推挽的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_4|GPIO_Pin_5; //指定要初始化的IO, GPIO_Pin_4 GPIO_Pin_5
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO推挽的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化
}
/********************* 配置P3.2與P3.3的ADC端口浮空輸入 **************************/
void GPIO_config_HighZ(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //結構定義
GPIO_InitStructure.Pin = GPIO_Pin_2|GPIO_Pin_3; //指定要初始化的IO, GPIO_Pin_2, GPIO_Pin_3
GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO浮空輸入方式
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
}
/******************* AD配置函數 *******************/
void ADC_config(void)
{
ADC_InitTypeDef ADC_InitStructure; //結構定義
ADC_InitStructure.ADC_SMPduty = 31; //ADC 模擬信號采樣時間控制, 0~31(注意: SMPDUTY 一定不能設置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道選擇時間控制 0(默認),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道選擇保持時間控制 0,1(默認),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X16T; //設置 ADC 工作時鐘頻率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_Power = ENABLE; //ADC功率允許/關閉 ENABLE,DISABLE
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC結果調整,右對齊 ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_InitStructure.ADC_Polity = Polity_0; //指定中斷優先級(低到高) Polity_0,Polity_1,Polity_2,Polity_3
ADC_InitStructure.ADC_Interrupt = DISABLE; //中斷允許 ENABLE,DISABLE
ADC_Inilize(&ADC_InitStructure); //初始化
// ADCCFG = 0x26; // 轉換數據右對齊,設置AD工作時鐘頻率 SYSclk/2/6
// P_SW2 |= 0x80; //打開操作特殊功能寄存器
// ADCTIM = 0x3f;
// P_SW2 |= 0x7f; //關閉操作特殊功能寄存器
}
/******************** 主函數**************************/
void main(void)
{
u16 DC_Data = 0; //AD轉換數據緩沖
u16 DC_Data24V = 0;
GPIO_config();
Timer_config();
GPIO_config_HighZ();
ADC_config();
EA = 1; //開放所有中斷
TR1 = 1; //允許定時器1運行
PC_OFF = 0; //不激活觸發PC關閉信號
POW_19V_ON = 1; //打開19V的DC_DC電源
Farad_ON = 0;
while(1)
{
ADC_CONTR = 0x82; //打開AD轉換電源,選擇AD的第二通道
ADC_CONTR |= 0x40; //啟動AD轉換
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & 0x20)); //查詢轉換結束標志
ADC_CONTR &= (~0x20); //清除轉換標志
DC_Data = ((u16)ADC_RES << 8) | ADC_RESL; //ADC_RES強制轉換成16位,與低八位轉換數據邏輯或后生成最終轉換數據
DC_Data24V = DC_Data*6; //24v分壓取樣比例為6,,真實值為DC_Data的6倍
if(DC_Data24V < 24)
PC_OFF = 1; //點亮一個LED
else
PC_OFF = 0;
}
}
|