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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10164|回復: 21
收起左側

關于STC12C5A60S2單片機AD采樣電壓跳動不準的問題

[復制鏈接]
ID:309126 發表于 2018-5-17 13:26 | 顯示全部樓層 |閱讀模式
1)為什么我IO口初始的電壓不是為0,而是0.9V到1.3V來回跳動?

2)我實際測得電壓也不準確,測不到3V以下的電壓。
我是通過電阻分壓的方法,將需要測量的電壓進行分壓,然后直接接到對應的IO口去,這樣應該是沒問題的把?還是說我還要繼續施加以下外圍電路嗎?
666.JPG

評分

參與人數 1黑幣 +10 收起 理由
cciejs12345 + 10

查看全部評分

回復

使用道具 舉報

ID:309126 發表于 2018-5-17 13:27 | 顯示全部樓層
這是我的程序,能幫忙看下有什么問題嗎?

  1. #include "reg52.h"                                                   
  2. #include "intrins.h"  
  3.                                                                                                                            
  4. typedef  unsigned char uchar;                                               
  5. typedef  unsigned int uint;   
  6. #define  _Nop() _nop_()

  7. /*------------------------以下為LCD1602顯示模塊定義-----------------------*/
  8. unsigned char data_char_table[]= {"0123456789ABCDEF"};                        //LCD數據
  9. unsigned char Lcd_Dis1_table[] = {"Position:No.    "};                        //第一行顯示框架
  10. unsigned char pos_char_table[] = {"             D  "};                        //      顯示位置
  11. unsigned char Lcd_Dis2_table[] = {"Voltage :      V"};                        //第二行顯示框架
  12. unsigned char num_char_table[] = {"         9A.CD V"};                        //      顯示位置


  13. sbit lcd_rs_port = P2^4;                                                 //定義LCD控制端口,根據硬件調整
  14. sbit lcd_rw_port = P2^3;                                                                                
  15. sbit lcd_en_port = P2^2;
  16. #define lcd_data_port P0

  17. void lcd_delay(uchar ms);                                                                        //LCD1602 延時
  18. void lcd_busy_wait();                                                                                 //LCD1602 忙等待
  19. void lcd_command_write(uint command);                                                 //LCD1602 命令字寫入
  20. void lcd_system_reset();                                                                                //LCD1602 初始化
  21. void lcd_char_write(uint x_pos,y_pos,lcd_dat);                                         //LCD1602 字符寫入
  22. void lcd_bad_check();                                                                                 //LCD1602 壞點檢查
  23. void Num_to_Disp(uchar i, uint Num);                                                        //顯示數據處理
  24. void LcdDisp(uchar j, uint num);                                                                //液晶顯示函數

  25. /*------------------------以下為ADC相應寄存器初始化及端口定義-------------*/                           
  26. /***** 定義與ADC相關的特殊功能寄存器 *****/                       
  27. sfr  ADC_CONTR =  0xBC;                 //ADC控制寄存器                    
  28. sfr  ADC_RES   =  0xBD;                 //ADC hight 8-bit result register
  29. sfr  ADC_RESL  =  0xBE;                 //ADC low 2-bit result register
  30. sfr  P1ASF     =  0x9D;                 //P1口功能控制寄存器P1ASF
  31. sfr  P1M0      =  0x92;                  //I/O模式寄存器
  32. sfr  P1M1      =  0x91;                  //I/O模式寄存器
  33. /************定義相應操作位***************/
  34. #define  ADC_POWER          0x80            //ADC電源控制位,0:關閉,1:打開
  35. #define  ADC_FLAG           0x10            //ADC結束標志位
  36. #define  ADC_START          0x08            //ADC啟動控制位
  37. #define  ADC_SPEEDLL        0x00            //540 clocks___________選擇轉換速度

  38. /*------------------------以下為相關函數聲明------------------------------*/
  39. void InitADC();                                                                                                        //ADC初始化
  40. uint GetADCResult(uchar ch);                                                                                                                                                                        
  41. void Delay(uint n);                                                                                         //延時程序
  42. void delay_1ms(uchar x);

  43. /*-------------------------------- 主函數 --------------------------------*/                                             
  44. void main()
  45. {
  46.                 uchar i;
  47.                 lcd_system_reset();                                                   //LCD1602 初始化
  48.                 lcd_bad_check();                                                           //LCD1602 壞點檢查
  49.         InitADC();                                      //初始化ADC特殊功能寄存器
  50.                 P1M1 = 0x60;                                         //P1.0/P1.5高阻 0011 1111
  51.         P1M0 = 0x00;                                         //P1.0/P1.5高阻 0000 0000
  52.         while (1)
  53.         {         
  54.                         i = 2;
  55.                         while(i < 7)
  56.                         {                  
  57.                            LcdDisp(i, GetADCResult(i));      //液晶1602顯示輸入電壓值(P1.0 - P1.7)
  58.                                 Delay(1000);
  59.                                 //i++;
  60.                         }                        
  61.         }  
  62. }

  63. /*-------------------------------- ADC 取值 ------------------------------*/
  64. uint GetADCResult(uchar ch)
  65. {
  66.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  67.           _nop_();                                        //Must wait before inquiry
  68.           _nop_();
  69.           _nop_();
  70.           _nop_();
  71.           while (!(ADC_CONTR & ADC_FLAG));                //Wait complete flag
  72.           ADC_CONTR &= ADC_FLAG;                          //Close ADC
  73.           return (ADC_RES*4 + ADC_RESL);                  //Return ADC result
  74. }
  75.                                           
  76. /*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/

  77. void InitADC( )
  78. {
  79.         
  80.           //P1ASF = P1 | 0x3f;                //Set  P1.0 - P1.5 as analog input port
  81.                   P1ASF = 0x3f;
  82.           ADC_RES  = 0;                  //Clear previous result
  83.                   ADC_RESL = 0;
  84.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
  85.           Delay(20);                      //ADC power-on delay and Start A/D conversion
  86. }
  87. /*---------------------------- LCD1602相應函數 ---------------------------*/

  88. ///////////////以下為LCD顯示數據處理/////////////////
  89. void Num_to_Disp(uchar i, uint Num)
  90. {
  91.         float NUM;
  92.         int xx, yy, zz;
  93.         NUM =(Num * 5/ 1024.0);        //計算公式:10-bit A/D Conversion Result = 1024 x (Vin / Vcc)
  94.         xx = (int)NUM;
  95.         yy = (int)((NUM - (float)(xx)) * 10);
  96.         zz = (int)((NUM - (float)(xx)) * 100)%10;  

  97.         num_char_table[9] = data_char_table[xx / 10];                //電壓值十位
  98.         num_char_table[10]= data_char_table[xx % 10];                //電壓值個位
  99.         num_char_table[12]= data_char_table[yy];                        //電壓值小數點后一位
  100.         num_char_table[13]= data_char_table[zz];                        //電壓值小數點后兩位?

  101.         pos_char_table[13]= data_char_table[i];                        //當前ADC接口
  102. }
  103. //////////////////以下為LCD顯示////////////////////
  104. void LcdDisp(uchar j, uint num)
  105. {
  106.         uint i=0;

  107.         for (i=0;i<16;i++)
  108.         {
  109.                 lcd_char_write(i,0,Lcd_Dis1_table[i]);
  110.                 lcd_char_write(i,1,Lcd_Dis2_table[i]);                  //顯示框架
  111.         }
  112.         Num_to_Disp(j, num);
  113.         lcd_char_write(13,0,pos_char_table[13]);
  114.         for(i = 9; i < 14; i++)
  115.         {
  116.                 lcd_char_write(i,1,num_char_table[i]);                  //顯示電壓
  117.         }                                                                                         
  118.         delay_1ms(100);
  119. }
  120. //////////////以下是LCD1602驅動程序////////////////

  121. void lcd_delay(uchar ms) /*LCD1602 延時*/
  122. {
  123.     uchar j;
  124.     while(ms--){
  125.         for(j=0;j<250;j++)
  126.             {;}
  127.         }   
  128. }

  129. void lcd_busy_wait() /*LCD1602 忙等待*/
  130. {
  131.     lcd_rs_port = 0;
  132.     lcd_rw_port = 1;
  133.     lcd_en_port = 1;
  134.     lcd_data_port = 0xff;
  135.     while (lcd_data_port&0x80);
  136.     lcd_en_port = 0;

  137. }

  138. void lcd_command_write(uint command) /*LCD1602 命令字寫入*/
  139. {
  140.     lcd_busy_wait();
  141.     lcd_rs_port = 0;
  142.     lcd_rw_port = 0;
  143.     lcd_en_port = 0;
  144.     lcd_data_port = command;
  145.     lcd_en_port = 1;
  146.     lcd_en_port = 0;     
  147. }

  148. void lcd_system_reset() /*LCD1602 初始化*/
  149. {
  150.     lcd_delay(20);
  151.     lcd_command_write(0x38);
  152.     lcd_delay(100);
  153.     lcd_command_write(0x38);
  154.     lcd_delay(50);
  155.     lcd_command_write(0x38);
  156.     lcd_delay(10);
  157.     lcd_command_write(0x08);
  158.     lcd_command_write(0x01);
  159.     lcd_command_write(0x06);
  160.     lcd_command_write(0x0c);
  161. }

  162. void lcd_char_write(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符寫入*/
  163. {
  164.     x_pos &= 0x0f; /* X位置范圍 0~15 */
  165.     y_pos &= 0x01; /* Y位置范圍 0~ 1 */
  166.     if(y_pos==1) x_pos += 0x40;
  167.     x_pos += 0x80;
  168.     lcd_command_write(x_pos);
  169.     lcd_busy_wait();
  170.     lcd_rs_port = 1;
  171.     lcd_rw_port = 0;
  172.     lcd_en_port = 0;
  173.     lcd_data_port = lcd_dat;
  174.     lcd_en_port = 1;
  175.     lcd_en_port = 0;
  176. }
  177. void lcd_bad_check() /*LCD1602 壞點檢查*/
  178. {
  179.     char i,j;
  180.     for(i=0;i<2;i++){
  181.         for(j=0;j<16;j++) {
  182.             lcd_char_write(j,i,0xff);
  183.             }
  184.         }
  185.     lcd_delay(200);
  186.     lcd_delay(200);
  187.         lcd_delay(200);
  188.         lcd_delay(100);
  189.         lcd_delay(200);
  190.     lcd_command_write(0x01); /* clear lcd disp */
  191. }
  192. //////////////////以上是LCD1602驅動程序////////////////
  193. /*-----------------------------    延時程序    ---------------------------*/                    
  194. void Delay(uint n)                                                                                 
  195. {
  196.           uint x;

  197.           while (n--)
  198.            {
  199.                      x = 500;
  200.                      while (x--);
  201.            }
  202. }  
  203. /*1MS為單位的延時程序*/
  204. void delay_1ms(uchar x)
  205. {
  206.     uchar j;
  207. while(x--)
  208. {
  209.         for(j=0;j<125;j++)
  210.             {;}
  211.     }   
  212. }
復制代碼
回復

使用道具 舉報

ID:213173 發表于 2018-5-17 16:48 | 顯示全部樓層
哈哈007 發表于 2018-5-17 13:27
這是我的程序,能幫忙看下有什么問題嗎?

你使用了我在前面回貼的錯誤設置,原貼已編輯修正如下
/*-------------------------------- 主函數 --------------------------------*/                                             
void main()
{
        uchar i;
        P1M1 = 0x3f;                                         //P1.0~P1.5高阻 0011 1111
        P1M0 = 0x00;                                         //P1.0~P1.5高阻 0000 0000


主循環while (1)里 i = 2; while(i < 7)與P1.0~P1.5設為ADC不符。i 的值是0~5.
回復

使用道具 舉報

ID:309126 發表于 2018-5-17 16:57 | 顯示全部樓層
wulin 發表于 2018-5-17 16:48
你使用了我在前面回貼的錯誤設置,原貼已編輯修正如下
/*-------------------------------- 主函數 ---- ...

我就想要讓一個通道讀取AD就好了,不想那么多通道來回讀取
回復

使用道具 舉報

ID:332296 發表于 2018-5-17 17:03 | 顯示全部樓層
你這個問題,要看你的電路原理圖啊,只有程序是看不懂的。 因為你的這個程序,明顯是根據電路來寫的,還是個比較獨特的電路,不是一般常見的電路,所以,看不到電路,就無法回答你的問題。 同時,你也可以看你的電路啊,在沒有按鍵時,P3口是個什么狀態,就可以知道還原值了。
回復

使用道具 舉報

ID:332296 發表于 2018-5-17 17:04 | 顯示全部樓層

你這個問題,要看你的電路原理圖啊,只有程序是看不懂的。
因為你的這個程序,明顯是根據電路來寫的,還是個比較獨特的電路,不是一般常見的電路,所以,看不到電路,就無法回答你的問題。
同時,你也可以看你的電路啊,在沒有按鍵時,P3口是個什么狀態,就可以知道還原值了。
回復

使用道具 舉報

ID:213173 發表于 2018-5-17 17:23 | 顯示全部樓層
哈哈007 發表于 2018-5-17 16:57
我就想要讓一個通道讀取AD就好了,不想那么多通道來回讀取

如果只測某1個通道電壓:例如第3通道
void main()
{
    uchar i;
    lcd_system_reset();                //LCD1602 初始化
     lcd_bad_check();                  //LCD1602 壞點檢查
    InitADC();                             //初始化ADC特殊功能寄存器
     P1M1 = 0x3f;                       //P1.0/P1.5高阻 0011 1111
     P1M0 = 0x00;                       //P1.0/P1.5高阻 0000 0000
     while (1)
     {         
         i = 2;
         LcdDisp(i, GetADCResult(i));      //液晶1602顯示第3通道電壓值
         Delay(1000);
     }                        
}  
回復

使用道具 舉報

ID:309126 發表于 2018-5-17 19:09 | 顯示全部樓層
wulin 發表于 2018-5-17 17:23
如果只測某1個通道電壓:例如第3通道
void main()
{
  1. uint U(uint x)                                   //測量電壓40次去除最大最小求平均
  2. {
  3.     uint U[40],min,max,S;
  4.     uchar i;
  5.     for(i=0;i<40;i++)
  6.     {
  7.     U[i]=GetADCResult(x);                         //獲取x通道ADC結果
  8.     }
  9.     for(i=1,min=U[0];i<=39;i++)
  10.     {
  11.     if(U[i]<min)  min=U[i];                     //求最小值
  12.     }
  13.     for(i=1,max=U[0];i<=39;i++)
  14.     {
  15.         if(U[i]>max)  max=U[i];
  16.     }                                        //求最大值
  17.     for(i=0,S=0;i<=39;i++)  S+=U[i];
  18.     S=S-min-max;
  19.     S /= 38    ;                                 //減去最大最小求平均
  20.     return S;                                 //返回計算結果   
  21. }
復制代碼

如果我想把這段濾波程序加進去要怎么加?
回復

使用道具 舉報

ID:309126 發表于 2018-5-17 19:11 | 顯示全部樓層
烤面包 發表于 2018-5-17 17:03
你這個問題,要看你的電路原理圖啊,只有程序是看不懂的。 因為你的這個程序,明顯是根據電路來寫的,還是 ...

這個就是我的原理圖啊 ,上面的那幾個沒有連接在一起,就是一個單片機最小的系統
777.JPG
回復

使用道具 舉報

ID:309126 發表于 2018-5-17 21:19 | 顯示全部樓層
wulin 發表于 2018-5-17 17:23
如果只測某1個通道電壓:例如第3通道
void main()
{

你好 我這樣改以后電壓穩定了,初始的電壓也為0,就是現在讀不了AD,一讀才0.01,是怎么回事,能幫我看下嘛?



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

  3. typedef  unsigned char uchar;                                               
  4. typedef  unsigned int uint;   
  5. #define  _Nop() _nop_()

  6. /*------------------------以下為LCD1602顯示模塊定義-----------------------*/
  7. unsigned char data_char_table[]= {"0123456789ABCDEF"};                        //LCD數據
  8. unsigned char Lcd_Dis1_table[] = {"Position:No.    "};                        //第一行顯示框架
  9. unsigned char pos_char_table[] = {"             D  "};                        //      顯示位置
  10. unsigned char Lcd_Dis2_table[] = {"Voltage :      V"};                        //第二行顯示框架
  11. unsigned char num_char_table[] = {"         9A.CD V"};                        //      顯示位置


  12. sbit lcd_rs_port = P2^4;                                                 //定義LCD控制端口,根據硬件調整
  13. sbit lcd_rw_port = P2^3;                                                                                
  14. sbit lcd_en_port = P2^2;
  15. #define lcd_data_port P0

  16. void lcd_delay(uchar ms);                                                                        //LCD1602 延時
  17. void lcd_busy_wait();                                                                                 //LCD1602 忙等待
  18. void lcd_command_write(uint command);                                                 //LCD1602 命令字寫入
  19. void lcd_system_reset();                                                                                //LCD1602 初始化
  20. void lcd_char_write(uint x_pos,y_pos,lcd_dat);                                         //LCD1602 字符寫入
  21. void lcd_bad_check();                                                                                 //LCD1602 壞點檢查
  22. void Num_to_Disp(uchar i, uint Num);                                                        //顯示數據處理
  23. void LcdDisp(uchar j, uint num);                                                                //液晶顯示函數

  24. /*------------------------以下為ADC相應寄存器初始化及端口定義-------------*/                           
  25. /***** 定義與ADC相關的特殊功能寄存器 *****/                       
  26. sfr  ADC_CONTR =  0xBC;                 //ADC控制寄存器                    
  27. sfr  ADC_RES   =  0xBD;                 //ADC hight 8-bit result register
  28. sfr  ADC_RESL  =  0xBE;                 //ADC low 2-bit result register
  29. sfr  P1ASF     =  0x9D;                 //P1口功能控制寄存器P1ASF
  30. sfr  P1M0      =  0x92;                  //I/O模式寄存器
  31. sfr  P1M1      =  0x91;                  //I/O模式寄存器
  32. /************定義相應操作位***************/
  33. #define  ADC_POWER          0x80            //ADC電源控制位,0:關閉,1:打開
  34. #define  ADC_FLAG           0x10            //ADC結束標志位
  35. #define  ADC_START          0x08            //ADC啟動控制位
  36. #define  ADC_SPEEDLL        0x00            //540 clocks___________選擇轉換速度

  37. /*------------------------以下為相關函數聲明------------------------------*/
  38. void InitADC();                                                                                                        //ADC初始化
  39. uint GetADCResult(uchar ch);                                                                                                                                                                        
  40. void Delay(uint n);                                                                                         //延時程序
  41. void delay_1ms(uchar x);



  42. /*-------------------------------- ADC 取值 ------------------------------*/
  43. uint GetADCResult(uchar channel)
  44. {
  45.         ADC_CONTR=0x88|channel;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
  46.         _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器         
  47. //        ADC_RES=0xdf;
  48. //        ADC_RESL=0xef;
  49.         while(!(ADC_CONTR&0x10));    //等待轉換完成
  50.         ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
  51.         return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
  52. }



  53. /*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/

  54. void InitADC( )
  55. {
  56.         
  57.           P1ASF = P1 | 0x3f;                //Set  P1.0 - P1.5 as analog input port
  58.           ADC_RES  = 0;                  //Clear previous result
  59.           ADC_RESL = 0;
  60.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
  61.           Delay(20);                      //ADC power-on delay and Start A/D conversion
  62. }
  63. /*---------------------------- LCD1602相應函數 ---------------------------*/

  64. ///////////////以下為LCD顯示數據處理/////////////////
  65. void Num_to_Disp(uchar i, uint Num)
  66. {
  67.         float NUM;
  68.         int xx, yy, zz;
  69.         NUM =(Num * 5/ 1024.0);        //計算公式:10-bit A/D Conversion Result = 1024 x (Vin / Vcc)
  70.         xx = (int)NUM;
  71.         yy = (int)((NUM - (float)(xx)) * 10);
  72.         zz = (int)((NUM - (float)(xx)) * 100)%10;  

  73.         num_char_table[9] = data_char_table[xx / 10];                //電壓值十位
  74.         num_char_table[10]= data_char_table[xx % 10];                //電壓值個位
  75.         num_char_table[12]= data_char_table[yy];                        //電壓值小數點后一位
  76.         num_char_table[13]= data_char_table[zz];                        //電壓值小數點后兩位?

  77.         pos_char_table[13]= data_char_table[i];                        //當前ADC接口
  78. }
  79. //////////////////以下為LCD顯示////////////////////
  80. void LcdDisp(uchar j, uint num)
  81. {
  82.         uint i=0;

  83.         for (i=0;i<16;i++)
  84.         {
  85.                 lcd_char_write(i,0,Lcd_Dis1_table[i]);
  86.                 lcd_char_write(i,1,Lcd_Dis2_table[i]);                  //顯示框架
  87.         }
  88.         Num_to_Disp(j, num);
  89.         lcd_char_write(13,0,pos_char_table[13]);
  90.         for(i = 9; i < 14; i++)
  91.         {
  92.                 lcd_char_write(i,1,num_char_table[i]);                  //顯示電壓
  93.         }                                                                                         
  94.         delay_1ms(100);
  95. }
  96. //////////////以下是LCD1602驅動程序////////////////

  97. void lcd_delay(uchar ms) /*LCD1602 延時*/
  98. {
  99.     uchar j;
  100.     while(ms--){
  101.         for(j=0;j<250;j++)
  102.             {;}
  103.         }   
  104. }

  105. void lcd_busy_wait() /*LCD1602 忙等待*/
  106. {
  107.     lcd_rs_port = 0;
  108.     lcd_rw_port = 1;
  109.     lcd_en_port = 1;
  110.     lcd_data_port = 0xff;
  111.     while (lcd_data_port&0x80);
  112.     lcd_en_port = 0;

  113. }

  114. void lcd_command_write(uint command) /*LCD1602 命令字寫入*/
  115. {
  116.     lcd_busy_wait();
  117.     lcd_rs_port = 0;
  118.     lcd_rw_port = 0;
  119.     lcd_en_port = 0;
  120.     lcd_data_port = command;
  121.     lcd_en_port = 1;
  122.     lcd_en_port = 0;     
  123. }

  124. void lcd_system_reset() /*LCD1602 初始化*/
  125. {
  126.     lcd_delay(20);
  127.     lcd_command_write(0x38);
  128.     lcd_delay(100);
  129.     lcd_command_write(0x38);
  130.     lcd_delay(50);
  131.     lcd_command_write(0x38);
  132.     lcd_delay(10);
  133.     lcd_command_write(0x08);
  134.     lcd_command_write(0x01);
  135.     lcd_command_write(0x06);
  136.     lcd_command_write(0x0c);
  137. }

  138. void lcd_char_write(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符寫入*/
  139. {
  140.     x_pos &= 0x0f; /* X位置范圍 0~15 */
  141.     y_pos &= 0x01; /* Y位置范圍 0~ 1 */
  142.     if(y_pos==1) x_pos += 0x40;
  143.     x_pos += 0x80;
  144.     lcd_command_write(x_pos);
  145.     lcd_busy_wait();
  146.     lcd_rs_port = 1;
  147.     lcd_rw_port = 0;
  148.     lcd_en_port = 0;
  149.     lcd_data_port = lcd_dat;
  150.     lcd_en_port = 1;
  151.     lcd_en_port = 0;
  152. }
  153. void lcd_bad_check() /*LCD1602 壞點檢查*/
  154. {
  155.     char i,j;
  156.     for(i=0;i<2;i++){
  157.         for(j=0;j<16;j++) {
  158.             lcd_char_write(j,i,0xff);
  159.             }
  160.         }
  161.     lcd_delay(200);
  162.     lcd_delay(200);
  163.         lcd_delay(200);
  164.         lcd_delay(100);
  165.         lcd_delay(200);
  166.     lcd_command_write(0x01); /* clear lcd disp */
  167. }
  168. //////////////////以上是LCD1602驅動程序////////////////
  169. /*-----------------------------    延時程序    ---------------------------*/                    
  170. void Delay(uint n)                                                                                 
  171. {
  172.           uint x;

  173.           while (n--)
  174.            {
  175.                      x = 500;
  176.                      while (x--);
  177.            }
  178. }  
  179. /*1MS為單位的延時程序*/
  180. void delay_1ms(uchar x)
  181. {
  182.     uchar j;
  183. while(x--)
  184. {
  185.         for(j=0;j<125;j++)
  186.             {;}
  187.     }   
  188. }  

  189. /*****************************************************************
  190. 函數: averageValueVolgate()
  191. 用途: 求多次采集電壓平均值
  192. 傳入參數:chan是端口號
  193. 返回值:Val_Av是多次采樣的電壓值平均值  
  194. ******************************************************************/
  195. float averageValueVolgate(uchar chan)
  196. {
  197.         float voltageValue=0;
  198.         uchar num;
  199.         for(num=100;num>0;num--)
  200.         {
  201.                 voltageValue+=GetADCResult(chan);
  202.         }
  203.         voltageValue/=100.0;
  204.         voltageValue=voltageValue*5.0/1024;
  205.         return (voltageValue);
  206. }


  207. /*-------------------------------- 主函數 --------------------------------*/                                             
  208. void main()
  209. {
  210.                 uchar i;
  211.                 lcd_system_reset();                                                   //LCD1602 初始化
  212.                 lcd_bad_check();                                                           //LCD1602 壞點檢查
  213.         InitADC();                                      //初始化ADC特殊功能寄存器
  214.         //        P1M1 = 0xFF;                                         //P1.0/P1.5高阻 0011 1111
  215.       //  P1M0 = 0x00;                                         //P1.0/P1.5高阻 0000 0000
  216.         while (1)
  217.      {         
  218.          i = 0;
  219.          LcdDisp(i,averageValueVolgate(0));      //液晶1602顯示第3通道電壓值
  220.          Delay(1000);
  221.      }                        
  222. }
復制代碼


回復

使用道具 舉報

ID:213173 發表于 2018-5-18 14:57 | 顯示全部樓層
重復計算當然出錯
NUM =(Num * 5/ 1024.0);
voltageValue=voltageValue*5.0/1024;
回復

使用道具 舉報

ID:213173 發表于 2018-5-18 15:10 | 顯示全部樓層
哈哈007 發表于 2018-5-17 21:19
你好 我這樣改以后電壓穩定了,初始的電壓也為0,就是現在讀不了AD,一讀才0.01,是怎么回事,能幫我看下 ...

你重復計算:NUM =(Num * 5/ 1024.0);  voltageValue=voltageValue*5.0/1024;  并且注釋掉了 P1M0 = 0x00; P1M1 = 0xFF;  
這是在7通道用兩個1K電阻分壓VCC的測量結果
無標題.jpg




回復

使用道具 舉報

ID:309126 發表于 2018-5-18 21:14 | 顯示全部樓層
wulin 發表于 2018-5-18 15:10
你重復計算:NUM =(Num * 5/ 1024.0);  voltageValue=voltageValue*5.0/1024;  并且注釋掉了 P1M0 = 0x00 ...

程序是什么啊,要咋改
回復

使用道具 舉報

ID:309126 發表于 2018-5-18 21:49 | 顯示全部樓層
wulin 發表于 2018-5-18 15:10
你重復計算:NUM =(Num * 5/ 1024.0);  voltageValue=voltageValue*5.0/1024;  并且注釋掉了 P1M0 = 0x00 ...
  1. #include "reg52.h"                                                   
  2. #include "intrins.h"
  3. #include "PWM.h"

  4. //typedef  unsigned char uchar;                                               
  5. //typedef  unsigned int uint;   
  6. #define  _Nop() _nop_()

  7. /*------------------------以下為LCD1602顯示模塊定義-----------------------*/
  8. unsigned char data_char_table[]= {"0123456789ABCDEF"};                        //LCD數據
  9. unsigned char Lcd_Dis1_table[] = {"Position:No.    "};                        //第一行顯示框架
  10. unsigned char pos_char_table[] = {"             D  "};                        //      顯示位置
  11. unsigned char Lcd_Dis2_table[] = {"Voltage :      V"};                        //第二行顯示框架
  12. unsigned char num_char_table[] = {"         9A.CD V"};                        //      顯示位置


  13. sbit lcd_rs_port = P2^4;                                                 //定義LCD控制端口,根據硬件調整
  14. sbit lcd_rw_port = P2^3;                                                                                
  15. sbit lcd_en_port = P2^2;
  16. #define lcd_data_port P0

  17. void lcd_delay(uchar ms);                                                                        //LCD1602 延時
  18. void lcd_busy_wait();                                                                                 //LCD1602 忙等待
  19. void lcd_command_write(uint command);                                                 //LCD1602 命令字寫入
  20. void lcd_system_reset();                                                                                //LCD1602 初始化
  21. void lcd_char_write(uint x_pos,y_pos,lcd_dat);                                         //LCD1602 字符寫入
  22. void lcd_bad_check();                                                                                 //LCD1602 壞點檢查
  23. void Num_to_Disp(uchar i, uint Num);                                                        //顯示數據處理
  24. void LcdDisp(uchar j, uint num);                                                                //液晶顯示函數


  25. /*------------------------以下為ADC相應寄存器初始化及端口定義-------------*/                           
  26. /***** 定義與ADC相關的特殊功能寄存器 *****/                       
  27. sfr  ADC_CONTR =  0xBC;                 //ADC控制寄存器                    
  28. sfr  ADC_RES   =  0xBD;                 //ADC hight 8-bit result register
  29. sfr  ADC_RESL  =  0xBE;                 //ADC low 2-bit result register
  30. sfr  P1ASF     =  0x9D;                 //P1口功能控制寄存器P1ASF
  31. sfr  P1M0      =  0x92;                  //I/O模式寄存器
  32. sfr  P1M1      =  0x91;                  //I/O模式寄存器
  33. /************定義相應操作位***************/
  34. #define  ADC_POWER          0x80            //ADC電源控制位,0:關閉,1:打開
  35. #define  ADC_FLAG           0x10            //ADC結束標志位
  36. #define  ADC_START          0x08            //ADC啟動控制位
  37. #define  ADC_SPEEDLL        0x00            //540 clocks___________選擇轉換速度

  38. /*------------------------以下為相關函數聲明------------------------------*/
  39. void InitADC();                                                                                                        //ADC初始化
  40. uint GetADCResult(uchar ch);                                                                                                                                                                        
  41. void Delay(uint n);                                                                                         //延時程序
  42. void delay_1ms(uchar x);
  43. void averageValueVolgate(uchar i,uchar chan);



  44. /*-------------------------------- ADC 取值 ------------------------------*/
  45. uint GetADCResult(uchar channel)
  46. {
  47.         ADC_CONTR=0x88|channel;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
  48.         _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器         
  49. //        ADC_RES=0xdf;
  50. //        ADC_RESL=0xef;
  51.         while(!(ADC_CONTR&0x10));    //等待轉換完成
  52.         ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
  53.         return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
  54. }



  55. /*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/

  56. void InitADC( )
  57. {
  58.           //P1ASF = P1 | 0x3f;                //Set  P1.0 - P1.5 as analog input port
  59.                         P1ASF=0x3f;
  60.           ADC_RES  = 0;                  //Clear previous result
  61.           ADC_RESL = 0;
  62.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
  63.           Delay(20);                      //ADC power-on delay and Start A/D conversion
  64. }
  65. /*---------------------------- LCD1602相應函數 ---------------------------*/

  66. ///////////////以下為LCD顯示數據處理/////////////////

  67. //////////////////以下為LCD顯示////////////////////
  68. void LcdDisp(uchar j, uint num)
  69. {
  70.         uint i=0;

  71.         for (i=0;i<16;i++)
  72.         {
  73.                 lcd_char_write(i,0,Lcd_Dis1_table[i]);
  74.                 lcd_char_write(i,1,Lcd_Dis2_table[i]);                  //顯示框架
  75.         }
  76.         averageValueVolgate(j, num);
  77.         lcd_char_write(13,0,pos_char_table[13]);
  78.         for(i = 9; i < 14; i++)
  79.         {
  80.                 lcd_char_write(i,1,num_char_table[i]);                  //顯示電壓
  81.         }                                                                                         
  82.         delay_1ms(100);
  83. }
  84. //////////////以下是LCD1602驅動程序////////////////

  85. void lcd_delay(uchar ms) /*LCD1602 延時*/
  86. {
  87.     uchar j;
  88.     while(ms--){
  89.         for(j=0;j<250;j++)
  90.             {;}
  91.         }   
  92. }

  93. void lcd_busy_wait() /*LCD1602 忙等待*/
  94. {
  95.     lcd_rs_port = 0;
  96.     lcd_rw_port = 1;
  97.     lcd_en_port = 1;
  98.     lcd_data_port = 0xff;
  99.     while (lcd_data_port&0x80);
  100.     lcd_en_port = 0;

  101. }

  102. void lcd_command_write(uint command) /*LCD1602 命令字寫入*/
  103. {
  104.     lcd_busy_wait();
  105.     lcd_rs_port = 0;
  106.     lcd_rw_port = 0;
  107.     lcd_en_port = 0;
  108.     lcd_data_port = command;
  109.     lcd_en_port = 1;
  110.     lcd_en_port = 0;     
  111. }

  112. void lcd_system_reset() /*LCD1602 初始化*/
  113. {
  114.     lcd_delay(20);
  115.     lcd_command_write(0x38);
  116.     lcd_delay(100);
  117.     lcd_command_write(0x38);
  118.     lcd_delay(50);
  119.     lcd_command_write(0x38);
  120.     lcd_delay(10);
  121.     lcd_command_write(0x08);
  122.     lcd_command_write(0x01);
  123.     lcd_command_write(0x06);
  124.     lcd_command_write(0x0c);
  125. }

  126. void lcd_char_write(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符寫入*/
  127. {
  128.     x_pos &= 0x0f; /* X位置范圍 0~15 */
  129.     y_pos &= 0x01; /* Y位置范圍 0~ 1 */
  130.     if(y_pos==1) x_pos += 0x40;
  131.     x_pos += 0x80;
  132.     lcd_command_write(x_pos);
  133.     lcd_busy_wait();
  134.     lcd_rs_port = 1;
  135.     lcd_rw_port = 0;
  136.     lcd_en_port = 0;
  137.     lcd_data_port = lcd_dat;
  138.     lcd_en_port = 1;
  139.     lcd_en_port = 0;
  140. }
  141. void lcd_bad_check() /*LCD1602 壞點檢查*/
  142. {
  143.     char i,j;
  144.     for(i=0;i<2;i++){
  145.         for(j=0;j<16;j++) {
  146.             lcd_char_write(j,i,0xff);
  147.             }
  148.         }
  149.     lcd_delay(200);
  150.     lcd_delay(200);
  151.         lcd_delay(200);
  152.         lcd_delay(100);
  153.         lcd_delay(200);
  154.     lcd_command_write(0x01); /* clear lcd disp */
  155. }
  156. //////////////////以上是LCD1602驅動程序////////////////
  157. /*-----------------------------    延時程序    ---------------------------*/                    
  158. void Delay(uint n)                                                                                 
  159. {
  160.           uint x;

  161.           while (n--)
  162.            {
  163.                      x = 500;
  164.                      while (x--);
  165.            }
  166. }  
  167. /*1MS為單位的延時程序*/
  168. void delay_1ms(uchar x)
  169. {
  170.     uchar j;
  171. while(x--)
  172. {
  173.         for(j=0;j<125;j++)
  174.             {;}
  175.     }   
  176. }  

  177. /*****************************************************************
  178. 函數: averageValueVolgate()
  179. 用途: 求多次采集電壓平均值
  180. 傳入參數:chan是端口號
  181. 返回值:Val_Av是多次采樣的電壓值平均值  
  182. ******************************************************************/
  183. void averageValueVolgate(uchar i,uchar chan)
  184. {
  185.         float voltageValue=0;
  186.         uchar num;
  187.                 int xx, yy, zz;
  188.         for(num=100;num>0;num--)
  189.         {
  190.                 voltageValue+=GetADCResult(chan);
  191.         }
  192.         voltageValue/=100.0;
  193.         voltageValue=voltageValue*5.0/1024;
  194. //        return (voltageValue);
  195.         xx = (int)voltageValue;
  196.         yy = (int)((voltageValue - (float)(xx)) * 10);
  197.         zz = (int)((voltageValue - (float)(xx)) * 100)%10;  

  198.         num_char_table[9] = data_char_table[xx / 10];                //電壓值十位
  199.         num_char_table[10]= data_char_table[xx % 10];                //電壓值個位
  200.         num_char_table[12]= data_char_table[yy];                        //電壓值小數點后一位
  201.         num_char_table[13]= data_char_table[zz];                        //電壓值小數點后兩位?

  202.         pos_char_table[13]= data_char_table[i];                        //當前ADC接口
  203. }


  204. /*-------------------------------- 主函數 --------------------------------*/                                             
  205. void main()
  206. {
  207.                 uchar i;
  208.             TMOD=0x01;//定時器0工作方式1
  209.                 TH0=0xff;//(65536-10)/256;//賦初值定時
  210.                 TL0=0xf9;//(65536-10)%256;//0.01ms
  211.                 EA=1;//開總中斷
  212.                 ET0=1;//開定時器0中斷
  213.                 TR0=1;//啟動定時器0  
  214.                 lcd_system_reset();                                                   //LCD1602 初始化
  215.                 lcd_bad_check();                                                           //LCD1602 壞點檢查
  216.         InitADC();                                      //初始化ADC特殊功能寄存器
  217.                 P1M1 = 0xFF;                                         //P1.0/P1.5高阻 0011 1111
  218.         P1M0 = 0x00;                                         //P1.0/P1.5高阻 0000 0000
  219.            while(1)
  220.      {         
  221.          i = 0;
  222.          LcdDisp(i,0);//averageValueVolgate(i));      //液晶1602顯示第3通道電壓值
  223.          Delay(1000);                        
  224.         }
  225.   }
復制代碼


這是我改完以后的程序,現在跳動不會太大,但是初始的電壓是2.多V,是什么原因。
666.JPG
回復

使用道具 舉報

ID:213173 發表于 2018-5-19 07:07 | 顯示全部樓層
哈哈007 發表于 2018-5-18 21:49
這是我改完以后的程序,現在跳動不會太大,但是初始的電壓是2.多V,是什么原因啊?

你這是簡單的ADC轉換,要求不能太高。如果使用定時器,每20ms取樣10或20次(環境中的50Hz共/差模干擾周期),去掉一個最大和最小數,其他數相加后+5(四舍五入算法),取平均值,可以做到很穩定。想絕對穩定什么方法都做不到。
回復

使用道具 舉報

ID:309126 發表于 2018-5-19 16:36 | 顯示全部樓層
wulin 發表于 2018-5-19 07:07
你這是簡單的ADC轉換,要求不能太高。如果使用定時器,每20ms取樣10或20次(環境中的50Hz共/差模干擾周期 ...

但是這個不是讀取不了2.8V以下的電壓了嗎?
回復

使用道具 舉報

ID:213173 發表于 2018-5-19 19:21 | 顯示全部樓層
哈哈007 發表于 2018-5-19 16:36
但是這個不是讀取不了2.8V以下的電壓了嗎?

讀取范圍0~VCC。如果還有問題你要檢查硬件電路。
回復

使用道具 舉報

ID:309126 發表于 2018-5-20 14:46 | 顯示全部樓層
wulin 發表于 2018-5-19 19:21
讀取范圍0~VCC。如果還有問題你要檢查硬件電路。

我用的是單片機最小的系統,其他的什么都沒接,能不能把你修改后的程序發給我看看,我看下是我電路有問題還是程序有問題,拜托了
回復

使用道具 舉報

ID:213173 發表于 2018-5-20 18:07 | 顯示全部樓層
哈哈007 發表于 2018-5-20 14:46
我用的是單片機最小的系統,其他的什么都沒接,能不能把你修改后的程序發給我看看,我看下是我電路有問題 ...

由于使用的單片機和實驗板電路不同,改動部分都有注釋。
//使用單片機型號:IAP15W4K58S4,1T 使用內部時鐘11.0592MHz
#include <STC15F2K60S2.H> //STC15系列通用頭文件
//#include "reg52.h"                                                   
#include "intrins.h"  

typedef  unsigned char uchar;                                               
typedef  unsigned int uint;   
#define  _Nop() _nop_()

/*------------------------以下為LCD1602顯示模塊定義-----------------------*/
unsigned char data_char_table[]= {"0123456789ABCDEF"};//LCD數據
unsigned char Lcd_Dis1_table[] = {"Position:No.    "};//第一行顯示框架
unsigned char pos_char_table[] = {"             D  "};//      顯示位置
unsigned char Lcd_Dis2_table[] = {"Voltage :      V"};//第二行顯示框架
unsigned char num_char_table[] = {"         9A.CD V"};//      顯示位置
#define lcd_data_port P0

//sbit lcd_rs_port = P2^4;  //定義LCD控制端口,根據硬件調整
//sbit lcd_rw_port = P2^3;                                                                                
//sbit lcd_en_port = P2^2;
sbit lcd_rs_port = P3^5;  //定義LCD控制端口,根據硬件調整                                                                                
//sbit lcd_rw_port = P2^3;//實驗板固定接地,不使用讀功能
sbit lcd_en_port = P3^4;
sbit LEDa=P2^5;                                        //573LED使能端口
sbit dula=P2^6;                                        //573數碼管段使能端口
sbit wela=P2^7;                                        //573數碼管位使能端口
void lcd_delay(uchar ms);  //LCD1602 延時
//void lcd_busy_wait();      //LCD1602 忙等待
void lcd_command_write(uint command);//LCD1602 命令字寫入
void lcd_system_reset();   //LCD1602 初始化
void lcd_char_write(uint x_pos,y_pos,lcd_dat);//LCD1602 字符寫入
//void lcd_bad_check();//LCD1602 壞點檢查
void Num_to_Disp(uchar i, uint Num);//顯示數據處理
void LcdDisp(uchar j, uint num);//液晶顯示函數

/*------------------------以下為ADC相應寄存器初始化及端口定義-------------*/                           
/***** 定義與ADC相關的特殊功能寄存器 *****/                       
/*                與STC15頭文件內容重復
sfr  ADC_CONTR =  0xBC;                 //ADC控制寄存器                    
sfr  ADC_RES   =  0xBD;                 //ADC hight 8-bit result register
sfr  ADC_RESL  =  0xBE;                 //ADC low 2-bit result register
sfr  P1ASF     =  0x9D;                 //P1口功能控制寄存器P1ASF
sfr  P1M0      =  0x92;                  //I/O模式寄存器
sfr  P1M1      =  0x91;                  //I/O模式寄存器*/
/************定義相應操作位***************/
#define  ADC_POWER          0x80            //ADC電源控制位,0:關閉,1:打開
#define  ADC_FLAG           0x10            //ADC結束標志位
#define  ADC_START          0x08            //ADC啟動控制位
#define  ADC_SPEEDLL        0x00            //540 clocks___________選擇轉換速度

/*------------------------以下為相關函數聲明------------------------------*/
void InitADC();                                                                                                        //ADC初始化
uint GetADCResult(uchar ch);                                                                                                                                                                        
void Delay(uint n);                                                                                         //延時程序
void delay_1ms(uchar x);
uint shuju=0;
/*---------------------------- 初始化ADC特殊功能寄存器 -------------------*/

void InitADC( )
{
        P1ASF = 0xff;  //Set  P1.0 - P1.7 as analog input port
        ADC_RES  = 0;       //Clear previous result
        ADC_RESL = 0;
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
        Delay(20);          //ADC power-on delay and Start A/D conversion
}
/*-------------------------------- ADC 取值 ------------------------------*/
uint GetADCResult(uchar ch)
{
        ADC_CONTR=0x88|ch;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
        _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器         
//        ADC_RES=0xdf;
//        ADC_RESL=0xef;
        while(!(ADC_CONTR&0x10));    //等待轉換完成
        ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
        return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
}
/*---------------------------- LCD1602相應函數 ---------------------------*/
//////////////以下是LCD1602驅動程序////////////////
void lcd_delay(uchar ms)//1ms延時(11.0592MHz 1T)
{
        uint i,j;
        for(i=ms;i>0;i--)
                for(j=1150;j>0;j--);
}
/*
void lcd_delay(uchar ms) //LCD1602 延時
{
        uchar j;
        while(ms--)
        for(j=0;j<250;j++);  
}*/
/*
//實驗板不使用讀功能,用延時代替查忙
void lcd_busy_wait() //LCD1602 忙等待
{
    lcd_rs_port = 0;
//    lcd_rw_port = 1;
    lcd_en_port = 1;
    lcd_data_port = 0xff;
    while (lcd_data_port&0x80);
    lcd_en_port = 0;

}*/
void lcd_command_write(uint command) /*LCD1602 命令字寫入*/
{
//    lcd_busy_wait();
    lcd_rs_port = 0;
//    lcd_rw_port = 0;
    lcd_en_port = 0;
    lcd_data_port = command;
         lcd_delay(1);
    lcd_en_port = 1;
         lcd_delay(1);
    lcd_en_port = 0;     
}

void lcd_system_reset() /*LCD1602 初始化*/
{
        dula=0;                        //關閉數碼管段選
        wela=0;                        //關閉數碼管位選
        LEDa=0;                        //關閉LED使能
//    lcd_delay(20);
//    lcd_command_write(0x38);
//    lcd_delay(100);
//    lcd_command_write(0x38);
//    lcd_delay(50);
    lcd_command_write(0x38);
//    lcd_delay(10);
    lcd_command_write(0x08);
    lcd_command_write(0x01);
    lcd_command_write(0x06);
    lcd_command_write(0x0c);
}

void lcd_char_write(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符寫入*/
{
    x_pos &= 0x0f; /* X位置范圍 0~15 */
    y_pos &= 0x01; /* Y位置范圍 0~ 1 */
    if(y_pos==1) x_pos += 0x40;
    x_pos += 0x80;
    lcd_command_write(x_pos);
//    lcd_busy_wait();
    lcd_rs_port = 1;
//    lcd_rw_port = 0;
//    lcd_en_port = 0;
    lcd_data_port = lcd_dat;
         lcd_delay(1);
    lcd_en_port = 1;
         lcd_delay(1);
    lcd_en_port = 0;
}
/*
void lcd_bad_check() //LCD1602 壞點檢查
{
    char i,j;
    for(i=0;i<2;i++){
        for(j=0;j<16;j++) {
            lcd_char_write(j,i,0xff);
            }
        }
    lcd_delay(200);
    lcd_delay(200);
        lcd_delay(200);
        lcd_delay(100);
        lcd_delay(200);
    lcd_command_write(0x01); // clear lcd disp
}*/
//////////////////以上是LCD1602驅動程序////////////////
/*-----------------------------    延時程序    ---------------------------*/                    
void Delay(uint n)                                                                                 
{
        uint x;
        while (n--)
        {
                x = 500;
        while (x--);
        }
}  
/*1MS為單位的延時程序*/
void delay_1ms(uchar x)
{
        uchar j;
        while(x--)
        {
                for(j=0;j<125;j++)
                {;}
        }   
}  
/*****************************************************************
函數: averageValueVolgate()
用途: 求多次采集電壓平均值
傳入參數:chan是端口號
返回值:Val_Av是多次采樣的電壓值平均值  
******************************************************************/
float averageValueVolgate(uchar chan)
{
        float voltageValue=0;
        uchar num;
        for(num=100;num>0;num--)
        {
                voltageValue+=GetADCResult(chan);
        }
        voltageValue/=100.0;
        voltageValue=voltageValue;//*5.0/1024;
        return (voltageValue);
}
///////////////以下為LCD顯示數據處理/////////////////
void Num_to_Disp(uchar i, uint Num)
{
        float NUM;
        int xx, yy, zz;
        NUM = ((Num * 5 + 5) / 1024.0);        //計算公式:10-bit A/D Conversion Result = 1024 x (Vin / Vcc)
        xx = (int)NUM;
        yy = (int)((NUM - (float)(xx)) * 10);
        zz = (int)((NUM - (float)(xx)) * 100)%10;  
       
        num_char_table[9] = data_char_table[xx / 10];                //電壓值十位
        num_char_table[10]= data_char_table[xx % 10];                //電壓值個位
        num_char_table[12]= data_char_table[yy];                        //電壓值小數點后一位
        num_char_table[13]= data_char_table[zz];                        //電壓值小數點后兩位
       
        pos_char_table[13]= data_char_table;                        //當前ADC接口
}
//////////////////以下為LCD顯示////////////////////
void LcdDisp(uchar j, uint num)
{
        uint i=0;
//        for (i=0;i<16;i++) //此段代碼轉移到主函數初始化部分
//        {
//                lcd_char_write(i,0,Lcd_Dis1_table);
//                lcd_char_write(i,1,Lcd_Dis2_table);                  //顯示框架
//        }
        Num_to_Disp(j, num);
        lcd_char_write(13,0,pos_char_table[13]);                                                //顯示當前ADC接口
        for(i = 9; i < 14; i++)
        {
                lcd_char_write(i,1,num_char_table);                  //顯示當前電壓
        }                                                                                         
        delay_1ms(100);
}
/*-------------------------------- 主函數 --------------------------------*/                                             
void main()
{
        uchar i;
//此段端口配置屬IAP15W4K58S4所需,全部為準雙向口。
        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M1 = 0x00;
        P1M0 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        P4M0 = 0x00;
        P4M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
        P6M0 = 0x00;
        P6M1 = 0x00;
        P7M0 = 0x00;
        P7M1 = 0x00;

        lcd_system_reset();                             //LCD1602 初始化
//        lcd_bad_check();                                //LCD1602 壞點檢查
        P1M1 = 0xFF;                                    //P1.0~P1.7高阻 1111 1111
        P1M0 = 0x00;                                    //P1.0~P1.7高阻 0000 0000
        InitADC();                                      //初始化ADC特殊功能寄存器
        for (i=0;i<16;i++)
        {
                lcd_char_write(i,0,Lcd_Dis1_table);
                lcd_char_write(i,1,Lcd_Dis2_table);                  //顯示框架
        }
        i=0;
        while (1)
        {         
                LcdDisp(i,averageValueVolgate(i));      //液晶1602輪流顯示第0~7通道電壓值
                i++;
                if(i>7)
                        i=0;
                Delay(2000);
        }                        
}
回復

使用道具 舉報

ID:334393 發表于 2018-5-20 19:19 | 顯示全部樓層
我就看看大神
回復

使用道具 舉報

ID:334411 發表于 2018-5-20 19:50 | 顯示全部樓層
因為電壓模塊焊錯了
回復

使用道具 舉報

ID:334411 發表于 2018-5-20 19:52 | 顯示全部樓層
哈哈007 發表于 2018-5-17 13:27
這是我的程序,能幫忙看下有什么問題嗎?

LCD模塊數據不對
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚欧洲精品在线视频免费观看 | 中国一级特黄毛片大片 | 久久综合影院 | 一区二区三区视频 | 精品一区二区在线观看 | 国产一区二区小视频 | 日韩中文一区二区三区 | 国产亚洲精品久久久久久豆腐 | 国色天香成人网 | 国产在线一区观看 | 欧美一级黄色片免费观看 | 亚洲欧美精品国产一级在线 | 天天干夜夜操 | 日韩精品一区二区三区中文在线 | 日本成人福利视频 | 亚洲成人av在线播放 | 一区二区三区在线电影 | 男人av的天堂 | 国产精品日产欧美久久久久 | 国产精产国品一二三产区视频 | 欧美精品91| 国产精品日韩欧美一区二区三区 | 欧美在线高清 | 黑人巨大精品欧美黑白配亚洲 | 日韩综合在线 | 欧美日韩精选 | 久久这里只有精品首页 | 国产乱码精品一区二区三区五月婷 | 欧美一区二区三区在线视频 | 五月婷婷丁香婷婷 | 九九在线精品视频 | 18性欧美 | 欧美九九九 | 在线精品一区二区三区 | 欧美综合一区 | 久久精品成人一区 | 欧美视频偷拍 | 欧美中文字幕一区二区三区亚洲 | 九九久久精品视频 | 国产蜜臀| 91精品国产日韩91久久久久久 |