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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM8S光敏測量帶AD值電壓值和擋位的源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:370779 發表于 2018-7-20 00:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
硬件電路為光敏電阻串聯一個20K的分壓電阻 接1602液晶顯示 采用STM8S208MB芯片 內部AIN13通道 可顯示采集到的AD值、轉換后的電壓值以及擋位

STM8S單片機源程序:
  1. /*光敏測量 接20K分壓電阻 可顯示讀取到的AD值 轉換后的電壓值及擋位 AIN13端口PF5*/
  2. /*注意:LCD R/W引腳需要硬件接地 若要軟件接地則GPIO初始化內定義*/

  3. #include"iostm8s208mb.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ushort unsigned short

  7. uchar tab1[]="=ADC2  GUANGMIN="; //初始化后顯示畫面
  8. uchar tab2[]="=      .   V   =";

  9. static uint AD_temp[10]={0,0,0,0,0,0,0,0,0,0}; //建立數組用于存放采集的AD的10個數值
  10. static uint AD_val=0; //全局變量  ADC單次采樣數據
  11. static uint voltage=0; //實際測得的電壓值

  12. #define LCD_EN PF_ODR_ODR4 //LCD使能端
  13. #define LCD_RS PF_ODR_ODR0 //LCD寫端口
  14. #define LCD_DATA PB_ODR    //LCD數據端

  15. void delay(uint z) //約1ms延時
  16. {
  17.   uint i,j;
  18.   while (z--)
  19.   {
  20.     for(i=0;i<50;i++)
  21.       for(j=0;j<20;j++);
  22.   }
  23. }

  24. void GPIO_init(void)
  25. {
  26.   PF_DDR_DDR4=1; //LCD使能端初始化
  27.   PF_CR1_C14=1;
  28.   PF_CR2_C24=1;
  29.   
  30.   PF_DDR_DDR0=1; //LCD寫端口初始化
  31.   PF_CR1_C10=1;
  32.   PF_CR2_C20=1;
  33.   
  34.   PB_DDR=0xff; //LCD數據端初始化
  35.   PB_CR1=0xff;
  36.   PB_CR2=0xff;  
  37.   
  38. }

  39. void write_com(uchar com)  //LCD寫命令 參考時序圖
  40. {
  41.   LCD_RS=0;
  42.   LCD_DATA=com;
  43.   delay(5);
  44.   LCD_EN=1;
  45.   delay(5);
  46.   LCD_EN=0;
  47. }

  48. void write_data(uchar data) //LCD寫數據 參考時序圖
  49. {
  50.   LCD_RS=1;
  51.   LCD_DATA=data;
  52.   delay(5);
  53.   LCD_EN=1;
  54.   delay(5);
  55.   LCD_EN=0;
  56. }

  57. void LCD_init(void)  //LCD初始化
  58. {
  59.   LCD_EN=0;
  60.   write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
  61.   write_com(0x0c); //設置開顯示,不顯示光標
  62.   write_com(0x06); //寫一個字符后地址指針加1
  63.   write_com(0x01); //顯示清0,數據指針清0
  64. }

  65. void LCD_watch(uchar add,uchar data) //LCD顯示計數函數
  66. {
  67.   write_com(0x80+0x40+add);
  68.   write_data(0x30+data); //0x30表示字符表內0-9數字的八位為0011 0000
  69. }

  70. void LCD_DIS2(void) //LCD初始化結束后顯示內容
  71. {
  72.   uchar num;
  73.   write_com(0x80);
  74.   for(num=0;num<16;num++)
  75.   {
  76.     write_data(tab1[num]);
  77.     delay(5);
  78.   }
  79.   write_com(0x80+0x40);
  80.   for(num=0;num<16;num++)
  81.   {
  82.     write_data(tab2[num]);
  83.     delay(5);
  84.   }
  85. }

  86. void ADC_init(void)  //ADC13初始化函數
  87. {
  88.   ADC_CSR=0x0d; //禁止中斷使能 選擇AIN13通道
  89.   ADC_CR1=0x02; //Fmaster2分頻 連續轉換模式
  90.   ADC_CR2=0x08; //禁止外部觸發 右對齊方式
  91.   
  92.   PF_DDR_DDR5=0; //PF5設置為無中斷懸浮輸入
  93.   PF_CR1_C15=0;
  94.   PF_CR2_C25=0;
  95.   
  96.   ADC_TDRH=0xff; //禁止施密特觸發功能
  97.   ADC_TDRL=0xff;
  98. //  ADC_CR1|=0x01; //使能喚醒ADC
  99. }

  100. void ADC_GET(void) //ADC轉換函數
  101. {
  102.   uchar num=0; //num為采集次數
  103.   ADC_CR1|=0x01; //使能喚醒ADC
  104.   ADC_CR1|=0x01; //啟動ADC轉換
  105.   while(num<10) //采集10次結果
  106.   {
  107.     while((ADC_CSR&0x80)==0); //判斷EOC位是否為1 等待轉換結束
  108.     ADC_CSR&=0x7f; //結束后EOC位由軟件清零
  109.     AD_temp[num]=(uint)ADC_DRL; //先賦值低位
  110.     AD_temp[num]|=(uint)ADC_DRH<<8; //高位左移8位后與低位拼合
  111.     num++;   
  112.   }
  113.   ADC_CR1&=0xfe; //關閉ADC轉換
  114. }

  115. void AVG_AD_temp(void) //平均值濾波函數
  116. {
  117.   uchar i,j;
  118.   uint temp; //定義暫存變量暫存數值
  119.   for(i=10;i>=1;i--)
  120.   {
  121.     for(j=0;j<(i-1);j++)
  122.     {
  123.       if(AD_temp[j]>AD_temp[j+1])
  124.       {
  125.         temp=AD_temp[j];
  126.         AD_temp[j]=AD_temp[j+1];
  127.         AD_temp[j+1]=temp;
  128.       }
  129.     }
  130.   }
  131.   for(i=2;i<=7;i++) //將采集到的10個值取中間6個進行累加求平均
  132.   {
  133.     AD_val+=AD_temp[i];
  134.   }
  135.   AD_val=(uint)AD_val/6;
  136. }

  137. void main(void)
  138. {
  139.   uchar qian,bai,shi,ge,qian1,bai1,shi1,ge1,shi2,ge2;
  140.   GPIO_init();
  141.   ADC_init();
  142.   LCD_init();
  143.   LCD_DIS2();
  144.   while(1)
  145.   {
  146.     ADC_GET();
  147.     AVG_AD_temp();
  148. //    delay(50);
  149.    
  150.     /*這里顯示的是AIN13讀取到的AD實際值*/
  151.     qian=AD_val/1000; //千位
  152.     bai=AD_val%1000/100; //百位
  153.     shi=AD_val%100/10; //十位
  154.     ge=AD_val%10; //個位
  155.     LCD_watch(1,qian);
  156.     LCD_watch(2,bai);
  157.     LCD_watch(3,shi);
  158.     LCD_watch(4,ge);
  159.    
  160.     /*這里顯示的是擋位(0-99對應0-1023) 電壓基準來自Vref+*/
  161.     shi2=(uint)(AD_val*0.09766)/10; //十位
  162.     ge2=(uint)(AD_val/0.09766)%10; //個位
  163.     LCD_watch(13,shi2);
  164.     LCD_watch(14,ge2);
  165.    
  166.     voltage=(uint)(AD_val*5.087890625); //獲取的AD值乘以基準值 由于乘積為浮點型所以再次轉換為整形
  167.     AD_val=0; //AD值清零   
  168.    
  169.     /*這里顯示的是AD轉換后的電壓值 電壓基準來自Vref+ 此處和VDD連接 即+5V*/
  170.     qian1=voltage/1000; //千位
  171.     bai1=voltage%1000/100; //百位
  172.     shi1=voltage%100/10; //十位
  173.     ge1=voltage%10; //個位
  174.     LCD_watch(6,qian1);
  175.     LCD_watch(8,bai1);
  176.     LCD_watch(9,shi1);
  177.     LCD_watch(10,ge1);

  178.   }
  179. }
復制代碼

所有資料51hei提供下載:
光敏測量帶AD值電壓值和擋位.rar (272.37 KB, 下載次數: 24)



評分

參與人數 2黑幣 +53 收起 理由
jjjjouy + 3 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:370779 發表于 2018-7-20 00:04 | 只看該作者
稍加改動可移植到8S103/105等單片機上
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩区 | 在线观看毛片网站 | 午夜免费视频 | 国产欧美日韩在线观看 | 性视频网 | 日韩av在线一区 | 日本一道本 | 欧美性一区二区三区 | 日韩一区二区在线播放 | 另类 综合 日韩 欧美 亚洲 | 在线观看中文字幕视频 | 91在线精品视频 | 国产精品乱码一区二区三区 | 香蕉久久a毛片 | 成人一区精品 | 成人精品鲁一区一区二区 | 亚洲欧美网站 | 亚洲视频在线播放 | 国产精品婷婷 | 我爱操| 精品麻豆剧传媒av国产九九九 | 国产天堂 | 亚洲福利一区二区 | 日韩精品一区二区三区在线观看 | 91精品国产91久久久久久密臀 | 精品国产18久久久久久二百 | 天天色图 | 国产极品车模吞精高潮呻吟 | 在线观看视频一区二区三区 | 国产中文字幕在线观看 | 成人午夜免费视频 | 免费午夜视频在线观看 | 福利网址 | 日韩国产在线观看 | 中文字幕一区二区在线观看 | 成人国产午夜在线观看 | 国产精品不卡一区 | 在线黄| 精品国产乱码久久久久久图片 | 欧日韩在线观看 | 一区二区三区视频免费观看 |