|
/* ----------------
* VDD-----------|1(VDD) (GND)8|------------GND
* RED-----------|2(RA6) (PA0)7|------------NC
* GREEN--------|3(PC3) (PA1)6|------------NC
* AD6-----------|4(PC2) (PC4)5|------------PWM
* ----------------
*/
//RED,GREEN是共陽(yáng)led,pwm暫時(shí)當(dāng)做普通IO
//這是一個(gè)失敗的程序,因?yàn)闆](méi)有達(dá)到預(yù)期功能,ADC結(jié)果寄存器始終數(shù)值不變
#include "MS83Fxx02.h"
#include "syscfg.h"
#define _XTAL_FREQ 4000000
#define red_on PA6=0;
#define red_off PA6=1;
#define green_on PC3=0;
#define green_off PC3=1;
#define pwm_on PC4=0;
#define pwm_off PC4=1;
#define TMR0_NUM 1
void colck_init(void);//所有時(shí)鐘初始化
void io_init(void);//所有io初始化
void adc_init(void);//adc模塊初始化
void Delay_xms(unsigned int x);//延時(shí)程序
void start_tran_adc(void);//adc轉(zhuǎn)化程序
float get_adc_value(void);//獲取adc轉(zhuǎn)化的數(shù)值
float avg_adc_value(int);//平均計(jì)算adc轉(zhuǎn)化的值,這樣更精確穩(wěn)定,默認(rèn)是四次
void act_led(void);//根據(jù)adc轉(zhuǎn)化的值處理燈閃爍狀態(tài)
unsigned int ADC_time=10; //全局變量,主程序與中斷程序間傳遞數(shù)值
float adc_avg_value=0;//作為轉(zhuǎn)燈函數(shù)的輸入接口
/*********************************************main*****************************************************************************/
void main(void)
{
CLRWDT();
colck_init();
io_init();
adc_init();
while(ADC_time>1000)//time0每溢出一次ADC_time增加一次
{
CLRWDT();
ADC_time=0;
adc_avg_value=0;
adc_avg_value=avg_adc_value(4);
act_led();
}
}
/*********************************************************************************************************************/
void colck_init(void)
{
//UCFG0
////////關(guān)鍵數(shù)據(jù)//////////////
OPTION=0B00001000;//time0定時(shí)器,PORTA上拉使能,PC1下降沿中斷,內(nèi)部時(shí)鐘,預(yù)分頻器給看門(mén)狗使用,1:1分頻
OSCCON=0B11010011;//低頻,256Khz,timer0每一指令周期加1,2M系統(tǒng)時(shí)鐘focs
WDTCON=0B00010111;//看門(mén)狗時(shí)鐘源32khz,65565分頻,溢出周期為32khz/65535,軟件打開(kāi)看門(mén)狗(sbit<0>)
ADCON1=0B10110000;//256Khz轉(zhuǎn)換時(shí)鐘
////////關(guān)鍵數(shù)據(jù)//////////////*
//T1CON=0B10000101;//time1定時(shí)器,高電平有效,1:1分頻,內(nèi)部時(shí)鐘
//T2CON&=0B11111000;//time2定時(shí)器關(guān)閉
/*全局中斷及time1中斷在此設(shè)置*/
INTCON|=0B10100000;//全局中斷使能
}
void io_init(void)
{
//GPIO 設(shè)置為輸出時(shí),弱上拉會(huì)自動(dòng)關(guān)斷,此點(diǎn)可作為測(cè)試關(guān)鍵點(diǎn)
CMCON0=0B00000111;//關(guān)閉PA6引腳的比較模式
MSCKCON=0B00000000;
TRISA=0B00000000;//全部porta引腳配置為輸出
TRISC=0B00000100;//除PC2配置為AN輸入外,其他全部配置為輸入
PORTA=0B00000000;//初始化porta端口,全部低電平
PORTC=0B00000000;//初始化portc端口,全部低電平
ANSEL=0B01000000;//除AN6通道為模擬輸入外,其他全部設(shè)置為數(shù)字IO
WPUA=0B10111111;//PORTA6外,全部弱上拉使能
WPUC=0B00000000;//上拉外,其余pc2端口全部允許弱上拉
WPD=0B00000100;//除pc2為an6通道設(shè)置為下拉外,PA4,PC1,PC3都不
}
void adc_init(void)
{
ADCON0=0B10111000;//右對(duì)齊,內(nèi)部2v參考電壓,AN6模擬通道,轉(zhuǎn)換完成,禁止ADC開(kāi)始(sbit<0>)
//ADCON0=0B10111100;//1/4VDD an7
}
void start_tran_adc(void)
{
if(!GO_DONE)
{
CLRWDT();
ADIF=0;//adc中斷標(biāo)志位清零
ADON=1;//轉(zhuǎn)換使能開(kāi)啟,允許ADC轉(zhuǎn)換
Delay_xms(20);//等待使能穩(wěn)定
GO_DONE=1;//開(kāi)始轉(zhuǎn)換
while(GO_DONE)//如果轉(zhuǎn)換未完成,等待
CLRWDT();
ADON=0;//如果轉(zhuǎn)換完成,將轉(zhuǎn)換使能關(guān)閉,結(jié)束本次轉(zhuǎn)換
}
}
float get_adc_value(void)//獲取adc轉(zhuǎn)換結(jié)果寄存器數(shù)據(jù)
{
CLRWDT();
int ADC_num=0;
float ADC_value=0.0;
ADC_num=ADRESH;
ADC_num=ADC_num<<8;
ADC_num=ADC_num|ADRESL;
ADC_value=(ADC_num/1023)*2.0;//參考電壓為內(nèi)部2v,如果想要改變參考電壓,在ADCON0寄存器修改
return ADC_value;
}
float avg_adc_value(int avg_init)//平均多次轉(zhuǎn)換結(jié)果,使轉(zhuǎn)換結(jié)果更穩(wěn)定
{
CLRWDT();
float value_tmp=0;
for(int T=0;T<avg_init;T++)
{
start_tran_adc();
CLRWDT();
value_tmp+=get_adc_value();
}
return (value_tmp/avg_init);
}
void act_led(void)//根據(jù)adc轉(zhuǎn)換的平均結(jié)果控制閃燈
{
CLRWDT();
float tmp=adc_avg_value;
if(tmp>=4.16)//大于4.16v充滿(mǎn),綠燈常亮
{
//{red_off;pwm_off;}
green_on;
}
else if(tmp>=3.0&&tmp<4.16)//3.0v~4.16v快充階段,綠燈常亮,紅燈快閃
{
//pwm_off;
green_on;
for(int cir=0;cir<50;cir++)
{
red_on;Delay_xms(500);red_off;Delay_xms(250);
}
}
else if(tmp>=0&&tmp<3.0)//0v~3.0v涓充階段,紅燈慢閃
{
// {green_off;pwm_off;}
for(int cir=0;cir<50;cir++)
{
red_on;Delay_xms(2000);red_off;Delay_xms(1000);
}
}
else//小于0以及其它狀態(tài)pwm常亮
{
CLRWDT();
//{green_off;red_off;}
pwm_on;
Delay_xms(100);
}
}
void Delay_xms(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++)
{
__delay_ms(1);
CLRWDT();
}
}
void interrupt ISR(void){
if(T0IE&&T0IF==1){
T0IF=0;
TMR0=TMR0_NUM;//賦初值
ADC_time++;
}
}
/////////////////////////////////////////////
|
-
loser.png
(125.79 KB, 下載次數(shù): 211)
下載附件
2018-9-12 17:31 上傳
原理圖
評(píng)分
-
查看全部評(píng)分
|