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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm8l152c6單片機adc1采集數據在1.0伏進位跳躍變成1.99伏

[復制鏈接]
跳轉到指定樓層
樓主
ID:466148 發表于 2019-4-1 22:56 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用網上茗風的adc測stm8l內部參考電壓程序跑adc1,用的也是他下面的lcd顯示程序,配置如下
開發環境:IAR for stm8 v6.5.3

lixianshen 地板
2019-3-29 19:28
大師,我用你的lcd程序和你的adc程序調試stm8ldiscover套件時發現,stm8l152c 6t6的adc測電壓時,輸入電壓從0伏調到2.99伏,lcd輸出顯示也從0到2.99伏,輸入電壓從2.99到1伏時,輸出顯示2.99到1伏。但是輸入電壓從1伏到0.99伏時,顯示從1伏一下跳到1.99伏,輸入電壓從1伏調到0伏,顯示就從1伏跳到1.99,顯示跟著從1.99伏逐漸降到1.0,1.0伏就是對應輸入電壓的0伏。就可以要多顯示1伏,如果現在輸入又從0伏調大到1伏,顯示就從1增大到1.99伏,然后進位又變成1伏,顯示過了1伏后繼續增加輸入電壓到2.99伏,顯示也從1伏到2.99。而在電腦上的軟件調試程序窗口中顯示的電壓,與輸入電壓是同步增減的,幾乎相等。而單片機輸入電壓是用萬用表和示波器同步看的,輸入調壓是用精密繞線電位器調壓,輸入電壓沒有跳躍。接收adc高位數據,從1到15增加沒有問題,從15降到1之后,又跳到19,而adc的低位數據從255的0,然后從255到0,基本都很有規律。如果用lcd顯示電壓比如說1.95伏不正確時,按重啟鍵,然后lcd顯示就變為0.95伏,就正常顯示,此時調低輸入電壓,顯示也跟著正常變低,一旦調高電壓超過1伏,顯示就成0.99跳到1.99。adc程序從寄存器換成了庫函數,毛病一樣。輸入從pc7換成pf0,毛病一樣。程序觸發等等都試過,情況沒有變化,不知道是那里的問題?請板主和各位大師解答一下。

  1. *硬件平臺:STM8L-DISCOVERY

  2. *功能說明:使用STM8L-DISCOVERY液晶屏顯示一串6位數字

  3. *作    者:茗風

  4. #include"iostm8l152c6.h"

  5. #include"stm8l15x.h”
  6. #define a 0x01

  7. #define b 0x02

  8. #define c 0x04

  9. #define d 0x08

  10. #define e 0x10

  11. #define f 0x20

  12. #define g 0x40

  13. #define m 0x80


  14. const uint8_t LCD_Tab[10] = {

  15.                 a + b + c + d + e + f,                        // Displays "0"

  16.                 b + c,                                        // Displays "1"

  17.                 a + b + m + g + e + d,                        // Displays "2"

  18.                 a + b + m + g + c + d,                        // Displays "3"

  19.                 f + g + m + b + c,                        // Displays "4"

  20.                 a + f + g + m + c +d,                        // Displays "5"

  21.                 a + f + e + d + c + g + m ,                // Displays "6"

  22.                 a + b + c,                                // Displays "7"

  23.                 a + b + c + d + e + f + g + m,                // Displays "8"

  24.                 a + b + c + d + f + g + m                // Displays "9"


  25. };


  26. /******************************************************************************************************

  27. *  名    稱:void LCD_Config(void)

  28. *  功    能:配置DAC,禁用DMA,不使用TIM4觸發,也不用軟件觸發,寫入DHR的數據被立即送入DOR寄存器,

  29. *            立即輸出對應電壓

  30. *  入口參數:無

  31. *  出口參數:無

  32. *  說    明:STM8L152C6屬于中等容量MCU,只有一路DAC輸出,輸出引腳為PF0

  33. *  范    例:無

  34. ******************************************************************************************************/

  35. void LCD_Config(void)

  36. {

  37. //------打開LCD/RTC時鐘------

  38.   CLK_PCKENR2_PCKEN22=1;//打開RTC時鐘,LCD刷新頻率與此時鐘有關

  39.   CLK_PCKENR2_PCKEN23=1;//打開LCD時鐘,讀寫LCD寄存器用到此時鐘

  40.   

  41. //---選擇LSE作為RTC時鐘---

  42.   CLK_CRTCR_RTCSEL0=0;

  43.   CLK_CRTCR_RTCSEL1=0;

  44.   CLK_CRTCR_RTCSEL2=0;

  45.   CLK_CRTCR_RTCSEL3=1;

  46. /* 0000: No clock selected

  47.    0001: HSI clock used as RTC clock source

  48.    0010: LSI clock used as RTC clock source

  49.    0100: HSE clock used as RTC clock source

  50.    1000: LSE clock used as RTC clock sourc*/

  51.   

  52. //----設置RTC時鐘分頻值----

  53.   CLK_CRTCR_RTCDIV0=0;

  54.   CLK_CRTCR_RTCDIV1=0;

  55.   CLK_CRTCR_RTCDIV2=0;

  56. /*000: RTC clock source/1

  57.   001: RTC clock source /2

  58.   010: RTC clock source /4

  59.   011: RTC clock source /8

  60.   100: RTC clock source /16

  61.   101: RTC clock source /32

  62.   110: RTC clock source /64

  63.   111: RTC clock source /128*/

  64.   

  65. //----設置LCD預分頻值----  

  66.   LCD_FRQ_PS0=0;// 2^PS[3:0]

  67.   LCD_FRQ_PS1=0;//分頻值為1

  68.   LCD_FRQ_PS2=0;

  69.   LCD_FRQ_PS3=0;

  70.   

  71. //----設置LCD分頻值----  

  72.   LCD_FRQ_DIV0=1;//DIV[3:0]+16

  73.   LCD_FRQ_DIV1=1;//分頻值為15+16=31

  74.   LCD_FRQ_DIV2=1;

  75.   LCD_FRQ_DIV3=1;  



  76. //以上分頻值的設置,最為了得到適合的LCD的刷新頻率,如果增大分頻值,會導致

  77. //LCD刷新頻率變低,會看到LCD顯示出現閃爍

  78. //比如,我們將PS[3:0]設置為0011,會看到液晶閃爍  

  79.   

  80. //----1/4 duty----  

  81.   LCD_CR1_DUTY0=1;//1/4 duty

  82.   LCD_CR1_DUTY1=1;

  83. /* Duty ratio selection

  84.    00: Static duty

  85.    01: 1/2 duty

  86.    10: 1/3 duty

  87.    11: 1/4 duty      */


  88. //----1/3 bias----     

  89.   LCD_CR1_B2=0;//1/3 bias

  90. /* 0: 1/3 bias

  91.    1: 1/2 bias  */


  92. //----內部電壓源----   

  93.   LCD_CR2_VSEL=0;

  94.   

  95. //----打開引腳的SEG功能----     

  96. // LCD_PM0=0xFF;//頭文件這個地方定義錯誤,無法直接向LCD_PM0寫入數據

  97. // LCD_PM1=0xFF;//PM0寄存器定義錯誤,導致PM1也無法直接寫入

  98. // LCD_PM2=0xFF;//PM0寄存器定義錯誤,導致PM2也無法直接寫入

  99.   *((uint8_t *)0x5404)=0xFF;//直接向LCD_PM0寄存器的地址寫入數據

  100.   *((uint8_t *)0x5405)=0xFF;//直接向LCD_PM1寄存器的地址寫入數據

  101.   *((uint8_t *)0x5406)=0xFF;//直接向LCD_PM2寄存器的地址寫入數據

  102.   

  103. //----To set contrast to mean value----   

  104.   LCD_CR2_CC0=0;//對比度

  105.   LCD_CR2_CC1=1;

  106.   LCD_CR2_CC2=0;

  107. /*  000: VLCD0  2.6V

  108.     001: VLCD1  2.7V

  109.     010: VLCD2  2.8V

  110.     011: VLCD3  2.9V

  111.     100: VLCD4  3.0V

  112.     101: VLCD5  3.1V

  113.     110: VLCD6  3.2V

  114.     111: VLCD7    */

  115.         

  116. //----Dead time 0----         

  117.   LCD_CR3_DEAD0=0;//no dead time

  118.   LCD_CR3_DEAD1=0;  

  119.   LCD_CR3_DEAD2=0;

  120. //----LCD_PulseOnDuration_1----

  121.   LCD_CR2_PON0=1;

  122.   LCD_CR2_PON1=0;  

  123.   LCD_CR2_PON2=0;         

  124. /*  000: 0 CLKps pulses

  125.     001: 1 CLKps pulses

  126.     010: 2 CLKps pulses

  127.     011: 3 CLKps pulses

  128.     100: 4 CLKps pulses

  129.     101: 5 CLKps pulses

  130.     110: 6 CLKps pulses

  131.     111: 7 CLKps pulses  */

  132.         

  133. //----Enable LCD peripheral----        

  134.   LCD_CR3_LCDEN=1;

  135. }


  136. /******************************************************************************************************

  137. *  名          稱:LCD_DisplayNum(uint8_t number)

  138. *  功            能:控制段式液晶屏的數字顯示部分

  139. *  入口參數:number:要顯示的數字

  140. *  出口參數:無

  141. *  說          明:根據數字的長度,判斷要顯示的長度,長度大于6位,只顯示后六位

  142. *  范          例:無

  143. ******************************************************************************************************/

  144. void LCD_DisplayNum(uint32_t number)

  145. {

  146.   uint8_t cnts=0,tmp=0;

  147.   

  148.   if(number<10)cnts=1;

  149.   else if(number<100)cnts=2;

  150.   else if(number<1000)cnts=3;

  151.   else if(number<10000)cnts=4;

  152.   else if(number<100000)cnts=5;

  153.   else if(number<(uint32_t) 1000000)cnts=6;

  154.   else cnts=6;


  155.   //判斷需要顯示數字的長度,確定在LCD屏上需要的位數

  156.   switch(cnts)

  157.   {

  158.     case 6:

  159.            tmp = LCD_Tab[number%1000000/100000];

  160.            ((tmp&m)==0)?(LCD_RAM0&=~0x02):(LCD_RAM0 |=0x02) ;

  161.            ((tmp&e)==0)?(LCD_RAM0&=~0x01):(LCD_RAM0 |=0x01) ;

  162.            ((tmp&g)==0)?(LCD_RAM2&=~0x80):(LCD_RAM2 |=0x80) ;

  163.            ((tmp&b)==0)?(LCD_RAM2&=~0x40):(LCD_RAM2 |=0x40) ;

  164.            ((tmp&f)==0)?(LCD_RAM6&=~0x08):(LCD_RAM6 |=0x08) ;

  165.            ((tmp&a)==0)?(LCD_RAM6&=~0x04):(LCD_RAM6 |=0x04) ;

  166.            ((tmp&c)==0)?(LCD_RAM3&=~0x20):(LCD_RAM3 |=0x20) ;

  167.            ((tmp&d)==0)?(LCD_RAM3&=~0x10):(LCD_RAM3 |=0x10) ;                     

  168.     case 5:

  169.            tmp = LCD_Tab[number%100000/10000];

  170.            ((tmp&m)==0)?(LCD_RAM0&=~0x08):(LCD_RAM0 |=0x08) ;

  171.            ((tmp&e)==0)?(LCD_RAM0&=~0x04):(LCD_RAM0 |=0x04) ;

  172.            ((tmp&g)==0)?(LCD_RAM2&=~0x20):(LCD_RAM2 |=0x20) ;

  173.            ((tmp&b)==0)?(LCD_RAM2&=~0x10):(LCD_RAM2 |=0x10) ;

  174.            ((tmp&f)==0)?(LCD_RAM6&=~0x02):(LCD_RAM6 |=0x02) ;

  175.            ((tmp&a)==0)?(LCD_RAM6&=~0x01):(LCD_RAM6 |=0x01) ;

  176.            ((tmp&c)==0)?(LCD_RAM3&=~0x80):(LCD_RAM3 |=0x80) ;

  177.            ((tmp&d)==0)?(LCD_RAM3&=~0x40):(LCD_RAM3 |=0x40) ;           

  178.            

  179.     case 4:

  180.            tmp = LCD_Tab[number%10000/1000];


  181.            ((tmp&m)==0)?(LCD_RAM0&=~0x20):(LCD_RAM0 |=0x20) ;

  182.            ((tmp&e)==0)?(LCD_RAM0&=~0x10):(LCD_RAM0 |=0x10) ;

  183.            ((tmp&g)==0)?(LCD_RAM2&=~0x08):(LCD_RAM2 |=0x08) ;

  184.            ((tmp&b)==0)?(LCD_RAM2&=~0x04):(LCD_RAM2 |=0x04) ;

  185.            ((tmp&f)==0)?(LCD_RAM5&=~0x80):(LCD_RAM5 |=0x80) ;

  186.            ((tmp&a)==0)?(LCD_RAM5&=~0x40):(LCD_RAM5 |=0x40) ;

  187.            ((tmp&c)==0)?(LCD_RAM4&=~0x02):(LCD_RAM4 |=0x02) ;

  188.            ((tmp&d)==0)?(LCD_RAM4&=~0x01):(LCD_RAM4 |=0x01) ;           

  189.     case 3:

  190.            tmp = LCD_Tab[number%1000/100];

  191.            ((tmp&m)==0)?(LCD_RAM0&=~0x80):(LCD_RAM0 |=0x80) ;

  192.            ((tmp&e)==0)?(LCD_RAM0&=~0x40):(LCD_RAM0 |=0x40) ;

  193.            ((tmp&g)==0)?(LCD_RAM2&=~0x02):(LCD_RAM2 |=0x02) ;

  194.            ((tmp&b)==0)?(LCD_RAM2&=~0x01):(LCD_RAM2 |=0x01) ;

  195.            ((tmp&f)==0)?(LCD_RAM5&=~0x20):(LCD_RAM5 |=0x20) ;

  196.            ((tmp&a)==0)?(LCD_RAM5&=~0x10):(LCD_RAM5 |=0x10) ;

  197.            ((tmp&c)==0)?(LCD_RAM4&=~0x08):(LCD_RAM4 |=0x08) ;

  198.            ((tmp&d)==0)?(LCD_RAM4&=~0x04):(LCD_RAM4 |=0x04) ;


  199.    case 2:

  200.            tmp = LCD_Tab[number%100/10];

  201.            ((tmp&m)==0)?(LCD_RAM1&=~0x02):(LCD_RAM1 |=0x02) ;

  202.            ((tmp&e)==0)?(LCD_RAM1&=~0x01):(LCD_RAM1 |=0x01) ;

  203.            ((tmp&g)==0)?(LCD_RAM1&=~0x80):(LCD_RAM1 |=0x80) ;

  204.            ((tmp&b)==0)?(LCD_RAM1&=~0x40):(LCD_RAM1 |=0x40) ;

  205.            ((tmp&f)==0)?(LCD_RAM5&=~0x08):(LCD_RAM5 |=0x08) ;

  206.            ((tmp&a)==0)?(LCD_RAM5&=~0x04):(LCD_RAM5 |=0x04) ;

  207.            ((tmp&c)==0)?(LCD_RAM4&=~0x20):(LCD_RAM4 |=0x20) ;

  208.            ((tmp&d)==0)?(LCD_RAM4&=~0x10):(LCD_RAM4 |=0x10) ;


  209.    case 1:

  210.            tmp = LCD_Tab[number%10];

  211.            ((tmp&m)==0)?(LCD_RAM1&=~0x08):(LCD_RAM1 |=0x08) ;

  212.            ((tmp&e)==0)?(LCD_RAM1&=~0x04):(LCD_RAM1 |=0x04) ;

  213.            ((tmp&g)==0)?(LCD_RAM1&=~0x20):(LCD_RAM1 |=0x20) ;

  214.            ((tmp&b)==0)?(LCD_RAM1&=~0x10):(LCD_RAM1 |=0x10) ;

  215.            ((tmp&f)==0)?(LCD_RAM5&=~0x02):(LCD_RAM5 |=0x02) ;

  216.            ((tmp&a)==0)?(LCD_RAM5&=~0x01):(LCD_RAM5 |=0x01) ;

  217.            ((tmp&c)==0)?(LCD_RAM4&=~0x80):(LCD_RAM4 |=0x80) ;

  218.            ((tmp&d)==0)?(LCD_RAM4&=~0x40):(LCD_RAM4 |=0x40) ;

  219.     break;


  220.     default:break;

  221.   }

  222. }

  223. void main(void)

  224. {

  225.   LCD_Config();

  226.   LCD_DisplayNum(201609);

  227. //  asm("rim");               //enable interrupts

  228.   while(1)

  229.   {

  230.     asm("wfi");

  231.   }

  232. }
復制代碼

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

使用道具 舉報

沙發
ID:466148 發表于 2019-4-2 10:02 來自手機 | 只看該作者
今天早上看了一下,感覺是lcd顯示程序有問題,調用lcdconfig()在程序中放的位置不同,就會有退位后已經是0伏,仍然還顯示1,另外兩位也會出現同樣問題。
回復

使用道具 舉報

板凳
ID:466148 發表于 2019-4-10 07:59 來自手機 | 只看該作者
問題已經解決了,主要是原程序中沒有清屏語句,在寫入數據到顯示緩存之前加上lcd_clear()函數就沒有問題了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品免费久久久久久日本 | 天天干视频| 成人福利网站 | 可以免费观看的av片 | 国产精品99精品久久免费 | 国产黄色av网站 | 日韩中文字幕视频在线 | 日韩精品一区二区三区 | 免费一级黄色电影 | 伊人超碰 | 56pao在线| 欧美韩一区二区三区 | 国产ts人妖系列高潮 | 最近日韩中文字幕 | 亚洲精品日本 | 91麻豆精品国产91久久久久久 | 国产激情亚洲 | 99热首页| 日本高清中文字幕 | 亚洲成人中文字幕 | 日韩二区 | 欧美天堂在线 | 日韩精品在线看 | 亚洲精品久久久9婷婷中文字幕 | 中文字幕第49页 | 高清欧美性猛交 | 亚洲一区影院 | 夜夜操天天艹 | 国产999精品久久久 日本视频一区二区三区 | 伊人伊成久久人综合网站 | 精品视频一区二区三区在线观看 | 成人动慢| 久久精品二区 | 亚洲人成网站777色婷婷 | 国产三级一区二区 | 国产欧美日韩精品在线观看 | 欧美成年人 | 国内精品久久久久久久 | 欧美视频二区 | 在线观看免费观看在线91 | 精品在线观看一区二区 |