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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我有一個STC8G1k08—20PIN的多通道內部ADC查詢測量程序,想改成定時器加中斷檢測該...

[復制鏈接]
跳轉到指定樓層
樓主
ID:589833 發表于 2020-6-18 17:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 619247581 于 2020-6-18 17:16 編輯
  1. #include<stc8g.h>                //STC8G系列單片機頭文件,可去最新版stc—isp里下載
  2. #include "intrins.h"
  3. #include "stdio.h"
  4. #include "codetab.h"
  5. #include "LQ12864.h"

  6. /******************************+**********************************
  7. 函數功能: 采AD轉換完成的值
  8. 說    明:
  9. 入口參數: channel 定義ADC口,范圍:0x00~0x07    0x08~0x0e    0x0f
  10.                                                                    P1.0~P1.7        P3.0~P3.6  單片機VCC腳
  11. 出口參數: tes
  12. *****************************************************************/
  13. unsigned int AD_get(unsigned char channel)
  14. {
  15.    int tes;     //定義一個變量tes,用來儲存ADC讀取的結果
  16.    ADC_CONTR = 0x80|0x40|channel; //啟動 AD 轉換
  17.    _nop_();
  18.    _nop_();
  19.    while (!(ADC_CONTR & 0x20)); //查詢 ADC 完成標志
  20.    ADC_CONTR &= ~0x20; //清完成標志
  21.    tes = ADC_RES; //讀取 ADC 結果
  22.    return tes;          //返回AD轉換完成的值
  23. }
  24. /****************************************************************
  25. 函數功能: 讀取8個采到的AD值,求其平均值并返回所求值
  26. 說    明:先取兩次AD值,并丟棄,再采8個AD值,求其平均值,再返回值
  27. 入口參數: channel 定義ADC口,范圍:0x00~0x07    0x08~0x0e    0x0f
  28.                                                                    P1.0~P1.7        P3.0~P3.6  單片機VCC腳
  29. 出口參數: res
  30. *****************************************************************/
  31. unsigned int AD_work(unsigned char channel)
  32. {       
  33.     char i;

  34.     unsigned int res=0;   
  35.         AD_get(channel);
  36.     AD_get(channel); //前兩個數據丟棄,在切換通道的時候更加穩定
  37.         res = 0;   //res清零

  38.         for (i=0; i<8; i++)
  39.         {
  40.                 res += AD_get(channel); //讀取 8 次數據
  41.         }

  42.         res=res/8; //取平均值
  43.     return res;         //返回完成的值
  44. }
  45. //主函數
  46. void main()
  47. {       
  48.         unsigned int vcc;                //定義無符號整形變量vcc,存儲AD_val運算完后的整數值
  49.         unsigned int vcc1;                //定義無符號整形變量vcc1,存儲AD_val運算完后的小數值
  50.         unsigned int vcc2;                //定義無符號整形變量vcc2,存儲AD_vcc運算完后的整數值
  51.         unsigned int vcc3;                //定義無符號整形變量vcc3,存儲AD_vcc運算完后的小數值

  52.         unsigned int AD_val;        //定義無符號整形變量AD_val,存儲P1.0采到的AD值
  53.         unsigned int AD_vcc;    //定義無符號整形變量AD_vcc,存儲P1.1采到的AD值

  54.         unsigned char s[8]={0};        //定義無符號整形數組s,存儲AD_val的值
  55.         unsigned char t[8]={0};        //定義無符號整形數組t,存儲AD_vcc的值

  56.         P0M0 = 0x00; //設置P0.0~P0.7為雙向口模式
  57.         P0M1 = 0x00;
  58.         P1M0 = 0x00; //設置P1.0~P1.7為雙向口模式
  59.         P1M1 = 0x00;
  60.         P2M0 = 0x00; //設置P2.0~P2.7為雙向口模式
  61.         P2M1 = 0x00;
  62.         P3M0 = 0x00; //設置P3.0~P3.7為雙向口模式
  63.         P3M1 = 0x00;
  64.         P4M0 = 0x00; //設置P4.0~P4.7為雙向口模式
  65.         P4M1 = 0x00;
  66.         P5M0 = 0x00; //設置P5.0~P5.7為雙向口模式
  67.         P5M1 = 0x00;
  68.         P1M0 = 0x00; //設置 P1.0和P1.1,P1.4 為 ADC 口,也就是高阻輸入模式
  69.     P1M1 = 0x13;
  70.         P3M0 = 0x00; //設置P3.1~P3.6為ADC 口
  71.         P3M1 = 0x7e;
  72.         ADCCFG = 0x0f; //設置 ADC 時鐘為系統時鐘/2/16/16
  73.         ADC_CONTR = 0x80; //使能 ADC 模塊
  74.         OLED_Init(); //OLED初始化                       
  75.         while(1)
  76.         {       
  77.             AD_val=AD_work(0x00);           //將P1.0口的返回值儲存到變量AD_val
  78.                 AD_vcc=AD_work(0x01);           //將P1.1口的返回值儲存到變量AD_vcc

  79.                 vcc=AD_val*20/1024;           //取模作為顯示電壓1的整數
  80.                 vcc1=AD_val*20%1024;          //取余作為顯示電壓1的小數
  81.                 vcc2=AD_vcc*20/1024;           //取模作為顯示電壓2的整數
  82.                 vcc3=AD_vcc*20%1024;          //取余作為顯示電壓2的小數

  83.                 if(vcc1<10)          //如果小數部分小于10,則在數組里小數部分前置兩個零
  84.                 {
  85.                         sprintf(s,"%d.00%dv",vcc,vcc1); //打印電壓值到數組s
  86.                 }
  87.                 else if(vcc1<100)  //如果小數部分小于100,則在數組里小數部分前置一個零
  88.                 {
  89.                         sprintf(s,"%d.0%dv",vcc,vcc1); //打印電壓值到數組s
  90.                 }
  91.         else if(vcc1>=1000)  //如果小數部分小于1000,則在數組里小數部分強制減去18
  92.                 {
  93.                         sprintf(s,"%d.%dv",vcc,vcc1-18); //打印電壓值到數組s
  94.                 }
  95.                 else          //如果小數部分大于1000,無特殊要求
  96.                 {
  97.                         sprintf(s,"%d.%dv",vcc,vcc1); //打印電壓值到數組s
  98.                 }


  99.                 if(vcc3<10)         //如果小數部分小于10,則在數組里小數部分前置兩個零
  100.                 {
  101.                         sprintf(t,"%d.00%dv",vcc2,vcc3);
  102.                 }
  103.                 else if(vcc3<100)  //如果小數部分小于100,則在數組里小數部分前置一個零
  104.                 {
  105.                         sprintf(t,"%d.0%dv",vcc2,vcc3); //打印電壓值到數組t
  106.                 }
  107.         else if(vcc3>=1000)        //如果小數部分小于1000,則在數組里小數部分強制減去18
  108.                 {
  109.                         sprintf(t,"%d.%dv",vcc2,vcc3-18); //打印電壓值到數組t
  110.                 }
  111.                 else                                 //如果小數部分大于1000,無特殊要求
  112.                 {
  113.                         sprintf(t,"%d.%dv",vcc2,vcc3); //打印電壓值到數組t
  114.                 }


  115. //                sprintf(s,"%d",AD_val);                //把AD_val的值打印成一個字符串保存在數組s中
  116. //                sprintf(t,"%d",AD_vcc);                //把AD_vcc的值打印成一個字符串保存在數組s中
  117.                 delay(2000);                                //延時2秒,防止數據刷新太快
  118.                
  119.                 OLED_P6x8Str(24,0,"Voltage tester");
  120.                 OLED_P6x8Str(0,1,"V1:");                                 
  121.                 OLED_P6x8Str(19,1,s);                //在顯示屏顯示數組s里的值
  122.                 OLED_P6x8Str(0,2,"I1:");
  123.                 OLED_P6x8Str(0,4,"V3:");

  124.                 OLED_P6x8Str(0,5,"I3:");
  125.                 OLED_P6x8Str(0,7,"V5:");
  126.                                
  127.                 OLED_P6x8Str(64,1,"V2:");
  128.                 OLED_P6x8Str(83,1,t);                //在顯示屏顯示數組t里的值
  129.                 OLED_P6x8Str(64,2,"I2:");
  130.             OLED_P6x8Str(64,4,"V4:");

  131.                 OLED_P6x8Str(64,5,"I4:");
  132.                 OLED_FormLine(0,3);
  133.                 OLED_FormLine(0,6);
  134.                 AD_val=0;                                          //清零
  135.                 AD_vcc=0;                                          //清零

  136.                 vcc=0;                                                  //清零
  137.                 vcc1=0;                                                  //清零
  138.                 vcc2=0;                                                  //清零
  139.                 vcc3=0;                                                  //清零

  140.         }
  141. }
復制代碼

如題,想改成定時器加中斷檢測內部多通道ADC的函數,不知道該怎么改,請求大佬們給點思路
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:838744 發表于 2021-7-7 21:01 | 只看該作者
看看你的代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九九视频在线 | 97国产精品视频人人做人人爱 | 欧美精品在线免费 | 久久国产精品免费一区二区三区 | 九九热在线观看 | 麻豆久久久久 | 日日射影院| 成人不卡 | 亚洲少妇综合网 | 欧美videosex性极品hd | 亚洲国产精品99久久久久久久久 | 在线观看av网站永久 | 巨大黑人极品videos精品 | 伊人伊人 | 精品久久久久久久人人人人传媒 | 国产精品伦一区二区三级视频 | 亚洲瑟瑟 | 精品美女 | 亚洲一区二区三区在线 | 2021狠狠天天天 | 第一区在线观看免费国语入口 | 欧美一区二区三区大片 | 欧美日韩1区2区 | www久久国产| 久久伊人免费视频 | 国产一区二区在线视频 | 欧美成人不卡 | 6080亚洲精品一区二区 | 成人国产精品色哟哟 | 精品国产精品国产偷麻豆 | 国产十日韩十欧美 | 精品日韩 | 国产精品一区在线观看 | 亚洲欧洲中文 | 国产亚洲一区二区三区 | 在线观看国产精品一区二区 | 爱爱小视频 | 亚洲欧美中文字幕在线观看 | 欧美另类视频 | 在线一区视频 | 国产不卡视频在线 |