久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9293|回復: 4
打印 上一主題 下一主題
收起左側

基于MS83F0802A的adc轉換,io,pwm輸出

[復制鏈接]
跳轉到指定樓層
樓主
/*                      ----------------
*  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是共陽led,pwm暫時當做普通IO
//這是一個失敗的程序,因為沒有達到預期功能,ADC結果寄存器始終數值不變


#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);//所有時鐘初始化
void io_init(void);//所有io初始化
void adc_init(void);//adc模塊初始化
void Delay_xms(unsigned int x);//延時程序
void start_tran_adc(void);//adc轉化程序
float get_adc_value(void);//獲取adc轉化的數值
float avg_adc_value(int);//平均計算adc轉化的值,這樣更精確穩定,默認是四次
void act_led(void);//根據adc轉化的值處理燈閃爍狀態



unsigned int  ADC_time=10; //全局變量,主程序與中斷程序間傳遞數值
float adc_avg_value=0;//作為轉燈函數的輸入接口




/*********************************************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
////////關鍵數據//////////////
    OPTION=0B00001000;//time0定時器,PORTA上拉使能,PC1下降沿中斷,內部時鐘,預分頻器給看門狗使用,1:1分頻
    OSCCON=0B11010011;//低頻,256Khz,timer0每一指令周期加1,2M系統時鐘focs
    WDTCON=0B00010111;//看門狗時鐘源32khz,65565分頻,溢出周期為32khz/65535,軟件打開看門狗(sbit<0>)
    ADCON1=0B10110000;//256Khz轉換時鐘
////////關鍵數據//////////////*


    //T1CON=0B10000101;//time1定時器,高電平有效,1:1分頻,內部時鐘
    //T2CON&=0B11111000;//time2定時器關閉
    /*全局中斷及time1中斷在此設置*/

    INTCON|=0B10100000;//全局中斷使能


}

void io_init(void)
{
     //GPIO 設置為輸出時,弱上拉會自動關斷,此點可作為測試關鍵點
    CMCON0=0B00000111;//關閉PA6引腳的比較模式
    MSCKCON=0B00000000;

     TRISA=0B00000000;//全部porta引腳配置為輸出
      TRISC=0B00000100;//除PC2配置為AN輸入外,其他全部配置為輸入
      PORTA=0B00000000;//初始化porta端口,全部低電平
      PORTC=0B00000000;//初始化portc端口,全部低電平
      ANSEL=0B01000000;//除AN6通道為模擬輸入外,其他全部設置為數字IO

       WPUA=0B10111111;//PORTA6外,全部弱上拉使能
       WPUC=0B00000000;//上拉外,其余pc2端口全部允許弱上拉
        WPD=0B00000100;//除pc2為an6通道設置為下拉外,PA4,PC1,PC3都不
}


void adc_init(void)
{
    ADCON0=0B10111000;//右對齊,內部2v參考電壓,AN6模擬通道,轉換完成,禁止ADC開始(sbit<0>)
        //ADCON0=0B10111100;//1/4VDD an7
}



void start_tran_adc(void)
{
    if(!GO_DONE)
    {
        CLRWDT();
        ADIF=0;//adc中斷標志位清零
        ADON=1;//轉換使能開啟,允許ADC轉換
        Delay_xms(20);//等待使能穩定
        GO_DONE=1;//開始轉換
        while(GO_DONE)//如果轉換未完成,等待
                CLRWDT();
        ADON=0;//如果轉換完成,將轉換使能關閉,結束本次轉換
    }
}


float get_adc_value(void)//獲取adc轉換結果寄存器數據
{
   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;//參考電壓為內部2v,如果想要改變參考電壓,在ADCON0寄存器修改
    return ADC_value;
}

float avg_adc_value(int avg_init)//平均多次轉換結果,使轉換結果更穩定
{
        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)//根據adc轉換的平均結果控制閃燈
{
    CLRWDT();
    float tmp=adc_avg_value;
    if(tmp>=4.16)//大于4.16v充滿,綠燈常亮
    {
        //{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以及其它狀態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, 下載次數: 211)

原理圖

原理圖

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:436758 發表于 2018-12-17 23:20 | 只看該作者
這個芯片穩定
回復

使用道具 舉報

板凳
ID:287515 發表于 2019-9-11 22:32 | 只看該作者
這個芯片抗電磁干擾不是很強,比不上PIC12F675
回復

使用道具 舉報

地板
ID:832983 發表于 2021-1-30 08:47 | 只看該作者
學習學習,這芯片便宜
回復

使用道具 舉報

5#
ID:436758 發表于 2021-2-3 00:48 | 只看該作者
才4毛的東東,要求別太高
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线视频 | 亚洲精品成人网 | 国内自拍偷拍视频 | 国产资源在线视频 | 超碰国产在线 | 亚洲综合字幕 | 欧美群妇大交群中文字幕 | 国产成人综合久久 | 午夜免费视频 | 亚洲综合在线播放 | 麻豆久久久9性大片 | 成年人黄色免费视频 | 2018天天干天天操 | 伊人91在线| 色综网 | av在线免费观看网址 | 91原创视频| 国产高清在线观看 | 岛国视频 | 香蕉av免费 | 日韩欧美一区二区三区四区 | 欧美日韩一区精品 | 日韩天堂av | 精品一区二区三区在线视频 | 亚洲九色 | 国产亚洲一区二区三区在线观看 | 中文一级片 | 麻豆av在线免费观看 | 成人在线一区二区三区 | 91精品国产一区二区三区 | 91成人在线视频 | 亚洲五码在线 | 色婷婷久久久亚洲一区二区三区 | 国产欧美一区二区三区久久手机版 | 国产免费av在线 | 天堂一区二区三区 | 欧美影院| 午夜激情视频在线 | 范冰冰一级做a爰片久久毛片 | 中文字幕国产精品视频 | 精品国产一区二区三区观看不卡 |