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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9521|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

如何用STC15單片機(jī)內(nèi)部AD讀取并在數(shù)碼管顯示電壓值?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:592477 發(fā)表于 2019-8-21 16:43 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
5黑幣
MCU用的是STC15F2K60S2,外部硬件電路為一個20K的電位器,中間腳滑動端接AD輸入引腳P1.0,另外兩邊引腳分別接GND和VCC,目前代碼可以通過旋轉(zhuǎn)電位器實(shí)現(xiàn)在四位一體共陰數(shù)碼管上顯示0~1023的數(shù)值,但是下一步想嘗試顯示電壓值卻總是格式不對顯示不正常?參考了幾個例程文件,還是不能弄出。代碼部分的計算電壓值時:adcnum=adcnum*500/1024;結(jié)果顯示到數(shù)碼管上就不正常了?以下是代碼
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. sfr T2H = 0xd6; //定時器2高8位
  6. sfr T2L = 0xd7; //定時器2低8位
  7. sfr AUXR  = 0x8e; //輔助寄存器
  8. sfr ADC_CONTR  = 0xBC; //ADC控制寄存器
  9. sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
  10. sfr ADC_RESL = 0xBE; //ADC低2位結(jié)果
  11. sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
  12. sfr CLK_DIV = 0x97;

  13. sbit LSA=P3^2;
  14. sbit LSB=P3^3;
  15. sbit LSC=P3^4;

  16. uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

  18. uchar DisplayData[8];



  19. void Delay_ms(unsigned int ms)//ms級延時
  20. {
  21.         unsigned int a,b;
  22.         for(a=ms;a>0;)
  23.         {
  24.                 for(b=1000;b>0;)
  25.                 {
  26.                 b=b-1;
  27.                 }
  28.                 a--;
  29.         }
  30. }
  31. void ADC_int()                //ADC初始化
  32. {
  33.                                 ADC_CONTR=0X80;         
  34.                                 P1ASF=0X01;         
  35.         CLK_DIV=0X20;            
  36.         ADC_RESL=0;                                                                        
  37.         ADC_RES=0;                                       
  38.         Delay_ms(10);                               
  39. }
  40. unsigned int ADC_Read()   
  41. {
  42.         unsigned int a=0;
  43.         ADC_CONTR = 0X88;                                                                        
  44.                                 Delay_ms(1);                                                                
  45.         while(!(ADC_CONTR&0X10));  
  46.         a=ADC_RES*256+ADC_RESL;
  47.                                 ADC_CONTR&=~0x10;                                       
  48.         return a;               
  49. }
  50. void DigDisplay()
  51. {
  52.         uchar i;
  53.         for(i=0;i<8;i++)
  54.         {
  55.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  56.                 {
  57.                         case(0):
  58.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  59.                         case(1):
  60.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  61.                         case(2):
  62.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  63.                         case(3):
  64.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  65.                         case(4):
  66.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  67.                         case(5):
  68.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  69.                         case(6):
  70.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  71.                         case(7):
  72.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位       
  73.                 }
  74.                 P2=DisplayData[i];//發(fā)送段碼
  75.                 Delay_ms(1);//間隔一段時間掃描       
  76.                 P2=0x00;//消隱
  77.         }
  78. }

  79. void datapros()
  80. {
  81.         uint adcnum;
  82.         adcnum=ADC_Read();
  83.         adcnum=adcnum*500/1024;
  84.         DisplayData[0]=smgduan[adcnum%1000%100%10/1];  //顯示個位
  85.         DisplayData[1]=smgduan[adcnum%1000%100/10];                //顯示十位
  86.         DisplayData[2]=smgduan[adcnum%1000/100];    //顯示百位
  87.         DisplayData[3]=smgduan[adcnum/1000];        //顯示千位
  88.         Delay_ms(10);
  89.        
  90. }

  91. void main()
  92. {
  93.   ADC_int(); //初始化ADC
  94.         while(1)
  95.   {
  96.                 datapros();    //數(shù)碼管數(shù)據(jù)處理函數(shù)
  97.                 DigDisplay();  //數(shù)碼管顯示函數(shù)       
  98.                
  99.         }
  100. }
復(fù)制代碼



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

使用道具 舉報

沙發(fā)
ID:236982 發(fā)表于 2019-8-21 17:35 | 只看該作者
        uint adcnum;
        adcnum=ADC_Read();
        adcnum=adcnum*500/1024; 數(shù)據(jù)超范圍啦
回復(fù)

使用道具 舉報

板凳
ID:592477 發(fā)表于 2019-8-21 18:48 | 只看該作者
suuy79 發(fā)表于 2019-8-21 17:35
uint adcnum;
        adcnum=ADC_Read();
        adcnum=adcnum*500/1024; 數(shù)據(jù)超范圍啦

但是我看別人程序的,他用串口發(fā)送給電腦的卻能正常顯示?
  1.         void adcsend()
  2.         {
  3.                                 unsigned char a[4],b;
  4.         send=send*500/1024;        //電壓計算
  5.                          a[0]=send%10+'0';               
  6.        a[1]=send/10%10+'0';               
  7.        a[2]='.';                                                  
  8.        a[3]=send/100+'0';               
  9.                 for(b=4;b>0;b--)             
  10.                 Uartsend(a[b-1]);     //從4-1=[3]個位開始依次[2][1][0]發(fā)送給數(shù)據(jù)
  11. }
復(fù)制代碼
回復(fù)

使用道具 舉報

地板
ID:155507 發(fā)表于 2019-8-21 19:01 | 只看該作者
給你改了一下試試。

  1. #include "reg52.h"
  2. #include "intrins.h"

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. typedef unsigned long ulong;

  6. sfr T2H = 0xd6; //定時器2高8位
  7. sfr T2L = 0xd7; //定時器2低8位
  8. sfr AUXR  = 0x8e; //輔助寄存器
  9. sfr ADC_CONTR  = 0xBC; //ADC控制寄存器
  10. sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
  11. sfr ADC_RESL = 0xBE; //ADC低2位結(jié)果
  12. sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
  13. sfr CLK_DIV = 0x97;

  14. sbit LSA=P3^2;
  15. sbit LSB=P3^3;
  16. sbit LSC=P3^4;

  17. uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  18.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

  19. uchar DisplayData[8];



  20. void Delay_ms(unsigned int ms)//ms級延時
  21. {
  22.         unsigned int a,b;
  23.         for(a=ms;a>0;)
  24.         {
  25.                 for(b=1000;b>0;)
  26.                 {
  27.                         b=b-1;
  28.                 }
  29.                 a--;
  30.         }
  31. }
  32. void ADC_int()                //ADC初始化
  33. {
  34.         ADC_CONTR=0X80;         
  35.         P1ASF=0X01;         
  36.         CLK_DIV=0X20;            
  37.         ADC_RESL=0;                                                                        
  38.         ADC_RES=0;                                       
  39.         Delay_ms(10);                                
  40. }
  41. unsigned int ADC_Read()   
  42. {
  43.         unsigned int a=0;
  44.         ADC_CONTR = 0X88;                                                                        
  45.         Delay_ms(1);                                                                 
  46.         while(!(ADC_CONTR&0X10));  
  47.         a=ADC_RES*256+ADC_RESL;
  48.         ADC_CONTR&=~0x10;                                       
  49.         return a;               
  50. }
  51. void DigDisplay()
  52. {
  53.         uchar i;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  57.                 {
  58.                         case(0):
  59.                         LSA=0;LSB=0;LSC=0; break;//顯示第0位
  60.                         case(1):
  61.                         LSA=1;LSB=0;LSC=0; break;//顯示第1位
  62.                         case(2):
  63.                         LSA=0;LSB=1;LSC=0; break;//顯示第2位
  64.                         case(3):
  65.                         LSA=1;LSB=1;LSC=0; break;//顯示第3位
  66.                         case(4):
  67.                         LSA=0;LSB=0;LSC=1; break;//顯示第4位
  68.                         case(5):
  69.                         LSA=1;LSB=0;LSC=1; break;//顯示第5位
  70.                         case(6):
  71.                         LSA=0;LSB=1;LSC=1; break;//顯示第6位
  72.                         case(7):
  73.                         LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  74.                 }
  75.                 P2=DisplayData[i];//發(fā)送段碼
  76.                 Delay_ms(1);//間隔一段時間掃描        
  77.                 P2=0x00;//消隱
  78.         }
  79. }

  80. void datapros()
  81. {
  82.         ulong adcnum;
  83.         adcnum=ADC_Read();
  84.         adcnum=adcnum*500/1024;
  85.         DisplayData[0]=smgduan[adcnum%1000%100%10/1];  //顯示個位
  86.         DisplayData[1]=smgduan[adcnum%1000%100/10];    //顯示十位
  87.         DisplayData[2]=smgduan[adcnum%1000/100];       //顯示百位
  88.         DisplayData[3]=smgduan[adcnum/1000];           //顯示千位
  89.         Delay_ms(10);
  90.        
  91. }

  92. void main()
  93. {
  94.         ADC_int(); //初始化ADC
  95.         while(1)
  96.         {
  97.                 datapros();    //數(shù)碼管數(shù)據(jù)處理函數(shù)
  98.                 DigDisplay();  //數(shù)碼管顯示函數(shù)        
  99.                
  100.         }
  101. }

復(fù)制代碼
回復(fù)

使用道具 舉報

5#
ID:531987 發(fā)表于 2019-8-21 22:20 | 只看該作者
先將數(shù)據(jù)化為強(qiáng)制類型轉(zhuǎn)換為整形,再將adcnum=adcnum*500/1024;里的500變?yōu)?00.0,將結(jié)果轉(zhuǎn)換為浮點(diǎn)型應(yīng)該就行了,這問題我也遇到過
回復(fù)

使用道具 舉報

6#
ID:65956 發(fā)表于 2019-8-22 08:52 | 只看該作者
adcnum=adcnum*500/1024;關(guān)鍵就是這個算出來都是浮點(diǎn)數(shù),所以當(dāng)然不對,你應(yīng)是定義為浮點(diǎn)數(shù)計算,然后再把結(jié)果數(shù)據(jù)放大為整數(shù),然后再進(jìn)行BCD解碼,這樣就OK了
回復(fù)

使用道具 舉報

7#
ID:466112 發(fā)表于 2020-2-17 23:23 | 只看該作者
將“adcnum=adcnum*500/1024"改為“adcnum=adcnum*0.49”就OK了。
回復(fù)

使用道具 舉報

8#
ID:445996 發(fā)表于 2020-3-26 18:57 | 只看該作者
根據(jù)樓上說的 你先乘0.49 然后乘100 得到49 *上前面的模擬值 然后模擬值會變成千位 你取千位和百位就可以避免浮點(diǎn)數(shù)運(yùn)算
回復(fù)

使用道具 舉報

9#
ID:707815 發(fā)表于 2020-3-31 10:58 | 只看該作者
suuy79 發(fā)表于 2019-8-21 17:35
uint adcnum;
        adcnum=ADC_Read();
        adcnum=adcnum*500/1024; 數(shù)據(jù)超范圍啦

沒有超吧
回復(fù)

使用道具 舉報

10#
ID:30165 發(fā)表于 2024-4-17 08:54 | 只看該作者
adcnum=adcnum*500/1024; 要進(jìn)行強(qiáng)制數(shù)據(jù)轉(zhuǎn)換
改成 adcnum=500*(unsigned long)adcnun/1024
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧洲激情 | 亚洲精品视频免费看 | 亚洲三区在线观看 | 日韩有码一区 | 亚洲精品9999| 青青99| 欧美一区二区三区,视频 | 国产精品永久久久久久久www | av中文字幕在线播放 | 97人人澡人人爽91综合色 | 免费在线一区二区 | 在线视频国产一区 | 欧美在线亚洲 | 亚洲成人国产精品 | 亚洲一区精品在线 | 亚洲一区二区三区在线视频 | 国产一区二区三区四区 | 中文字幕日韩一区 | 成年人网站免费视频 | 欧产日产国产精品国产 | 亚洲精品美女视频 | 精品日韩一区二区 | 亚洲一在线 | 999免费观看视频 | 日日噜 | 男人的天堂亚洲 | 九九视频在线观看 | 91精品国产一区 | 成人av在线播放 | 伊人狠狠操 | 精品视频在线免费观看 | 久久狠狠| 免费看黄视频网站 | 亚洲a视频 | 一区二区三区久久 | 一区二区三区国产在线观看 | 毛片a | 国产精品久久久久久久毛片 | 一区二区在线 | 青久草视频 | 久久国产一区二区 |