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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12系列單片機ADC中斷使用

[復制鏈接]
跳轉到指定樓層
樓主
ID:336427 發表于 2021-3-11 17:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下程序為使用STC12C5A60S2單片機,采用ADC中斷掃描模式,并且初始化定時器P進行WM輸出,用串口輸出溫度數值:
難點:ADC中斷與PWM輸出靠定時器0發生并且串口通訊波特率靠定時器1發生,這幾個中斷在代碼編寫與調試過程中,發現這幾個程序獨立應用的代碼直接移植過來,并不能正常使用,這幾個中斷的優先級順序和初始化順序會產生相互干擾,因此經過查找相關資料,最終解決了這個問題,下面為詳細代碼(注釋是手打上去的,不知道為啥從keil往這里粘貼會出現問題)


void PWM_init() //PWM初始化函數,初始化占空比為0
{
        CMOD=0x02;        //0000 0010 空閑時不計數,不產生中斷,時鐘源fosc/2,因此輸出占用率fosc/512
        CL=0x00;
        CH=0x00;
        CCAPM0=0x42; //0100 001,8位PWM
        CCAP0L=0x00;
        CCAP0H=0x00; //PWM實現方法,因為是8位,CL基礎計算器從0xFF遞減到0x00,溢出后將CCAPOH的值加載到CCAPOL,若CL遞減過程中,若大于CCAPOL,則輸出高電平,否則為低電平
        CCAPM1=0x42;
        CCAP1H=0x00;
        CCAP1L=0x00;
        CR = 1;          //開啟PCA計數器
}
void PWM_set(uchar x,uchar y) //占空比設置函數     引腳為P1.3和P1.4
{
                CCAP0H=x*2.55;    /占空比公式D=(256-CCAPnH)/256(8位PWM模式)
                CCAP0L=x*2.55;                //乘2.55轉換為0--100%
                CCAP1H=y*2.55;
                CCAP1L=y*2.55;
}
void Timer0_Init(void)
{
        TH0=(65536-TIME)/256;           //開定時器0
    TL0=(65536-TIME)%256;
    EA=1;                             //開全局中斷
    ET0=1;                             //允許定時器0中斷
        TR0=1;
               
                IE = 0xa0;
}
void timer0() interrupt 1     //interrupt 1: ¶¨ê±Æ÷0£¬interrupt3£o¶¨ê±Æ÷3
{
    TH0=(65536-TIME)/256;       //高八位,(需要表示Xms的定時,計數器由65536-X數到65536,由于16位,只能分高低位)
    TL0=(65536-TIME)%256;     /低八位
        num++;
        if(num==500)
        {
                flagTime ++;
                num = 0;
        }
        Init_ADC();
}
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void Init_UART  (void)
{
        SCON = 0x50;                //8位數據,可變波特率
        TMOD |= 0x20;                //設定定時器1為16位自動重裝方式
        TL1 = 0xC0;                //設定定時器高8位初值
        TH1 = 0xFA;                //設定定時器低8位初值
        TR1 = 1;                //啟動定時器
        EA = 1;
}                           
/*------------------------------------------------
                 發送一個字節
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}
/*------------------------------------------------
              發送一個字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0表示字符串結束標志
                /通過檢測是否是字符串末尾
  {
  SendByte(*s);
  s++;
  }

}
/*----------------------------
ADC interrupt service routine
----------------------------*/
void adc_isr() interrupt 5 using 1
{
   //V_5REF=V_1REF*256/da_ref;
   if(ADC_Chanul_Turn%2==0)                     //外部基準電壓
   {   
       temp1=ADC_RES;                                   //獲取轉換結果
       ADC_1Data=((double)temp1/256)*5;     //取八位計算基準電壓Data
           adc1 = ADC_1Data;
       }
   if(ADC_Chanul_Turn%2==1)
   {
       temp0=ADC_RES;                                  //獲取轉換結果
       ADC_0Data=((double)temp0/256)*5;     //取八位計算實際值Data
       adc0 =ADC_0Data;
       }


   ADC_CONTR = ADC_POWER | ADC_SPEEDH | ADC_START | ADC_Chanul_Turn;
   ADC_Chanul_Turn++;
   if(ADC_Chanul_Turn==2)
      ADC_Chanul_Turn=0;
}


/*----------------------------
Initial ADC sfr
----------------------------*/
void Init_ADC()
{
    P1ASF = 0x03;                   //Set all P1 as analog input port
    ADC_RES = 0;                    //Clear previous result
//    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    if(ADC_Chanul_Turn%2==0)//外部基準電壓
    {
        ADC_CONTR=0xF0; //AD轉換控制器,1111,0000 P10口
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ADC_CONTR=0xE8;    //1110,1000 (清0flag,置位start)
     }
    if(ADC_Chanul_Turn%2==1)
    {
        ADC_CONTR=0xF1; // 1111,0001  P11口
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ADC_CONTR=0xE9;    //1110,1001
    }
    delay_1ms(20);                     //ADC power-on delay and Start A/D conversion
}

over(有15分鐘定時關機).zip

99.28 KB, 下載次數: 10, 下載積分: 黑幣 -5

anjianliliaoyi.pdf

355.66 KB, 下載次數: 6, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本久草 | 国产色在线| 午夜一区 | 最新高清无码专区 | 国产日韩一区二区三免费高清 | 正在播放国产精品 | 亚洲天堂av在线 | 一级免费毛片 | 国产精品视频播放 | 日韩一区二区不卡 | 黄色片在线 | 日韩在线观看一区 | 成人精品鲁一区一区二区 | 欧美色综合网 | 成人欧美一区二区三区黑人孕妇 | 日本一区二区三区精品视频 | 91就要激情 | 久久久久中文字幕 | 欧美福利专区 | 日韩精品一区二区三区中文在线 | 国产精品久久久久一区二区三区 | a黄在线观看 | 成人国产网站 | 成人精品一区二区三区四区 | 欧美成人高清视频 | 国产精品久久久久久久久免费樱桃 | 国产视频黄色 | 夜夜爽99久久国产综合精品女不卡 | a级大片免费观看 | 亚洲天堂av网| 国产欧美在线视频 | 91小视频在线 | 亚洲喷水| 欧美午夜视频 | 亚洲一区二区三区视频在线 | 午夜精品久久久久久久久久久久久 | 国产高清在线 | 久久91精品| 日韩综合在线视频 | 日本羞羞影院 | 国产精品亚洲一区 |