找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8896|回复: 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 单片机教程网

快速回复 返回顶部 返回列表