找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1089|回复: 1
打印 上一主题 下一主题
收起左侧

单片机+adc0808与1602测电压,只能测一半?

[复制链接]
跳转到指定楼层
楼主
ID:904473 发表于 2021-4-18 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC0808 转换测电压,当滑动变阻器在百分之50以下就是2.5v以下时很准,超过2.5v就从0开始记。求助!!!

另外,我还想显示电流和电功率,请问该如何做呢?
单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>           
  3. #include <string.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char


  6. sbit RS = P2^0;
  7. sbit RW = P2^1;
  8. sbit EN = P2^2;
  9. sbit CLOCK = P3^1;
  10. sbit EOC = P3^2;
  11. sbit START = P3^3;
  12. sbit OE = P3^4;


  13. uchar LCDDSY1[]={"V: .   I: .   "};         //第一行显示数据//
  14. uchar LCDDSY2[]={"P: .   "};          //第二行显示数据//
  15. uchar n;//adc转换数据
  16.                  
  17. void DelayMS(uint ms)          //延时子程序//
  18. {
  19.          uchar i;
  20.         while(ms--)
  21.         {
  22.                  for(i=0;i<120;i++);
  23.         }
  24. }        

  25. uchar Read_LCD_State()
  26. {
  27.          uchar state;
  28.         RS=0;RW=1;EN=1;DelayMS(1);
  29.         state=P0;
  30.         EN = 0;DelayMS(1);
  31.         return state;
  32. }


  33. void LCD_Busy_Wait()
  34. {
  35.          while((Read_LCD_State()&0x80)==0x80);//DB7=1时,忙
  36.         DelayMS(5);
  37. }

  38. void Write_LCD_Data(uchar dat)
  39. {
  40.          LCD_Busy_Wait();
  41.         RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;          //en使能端,给高脉冲为写操作
  42. }

  43. void Write_LCD_Command(uchar cmd)
  44. {
  45.          LCD_Busy_Wait();
  46.         RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;        
  47. }

  48. void Init_LCD()
  49. {
  50.          Write_LCD_Command(0x38);   // 两行显示,5*8点阵
  51.         DelayMS(1);        
  52.         Write_LCD_Command(0x01);   //清屏
  53.         DelayMS(1);        
  54.         Write_LCD_Command(0x06);   //数据读写操作后,AC自动加一,画面不动
  55.         DelayMS(1);        
  56.         Write_LCD_Command(0x0c);   // 显示开,光标关,闪烁关
  57.         DelayMS(1);        
  58. }

  59. void Set_LCD_POS(uchar p)
  60. {
  61.          Write_LCD_Command(p|0x80);        
  62. }

  63. void change()
  64. {   uint a;
  65.     a=n*500/255;
  66.     LCDDSY1[2]=a/100+0x30;
  67.         LCDDSY1[4]=a%100/10+0x30;
  68.         LCDDSY1[5]=a%10+0x30;
  69.         
  70. }
  71. void display()
  72. {        uchar i=0;
  73.     change();
  74.         LCDDSY1[6]='v';
  75.         Set_LCD_POS(0x02);i=0;
  76.         while(LCDDSY1[i]!='\0')
  77.         {
  78.         Write_LCD_Data(LCDDSY1[i]);
  79.         i++;
  80.         }
  81.         
  82.         
  83. }
  84. void timer0() interrupt 1
  85. {
  86.     CLOCK=~CLOCK;
  87. }
  88. uchar ADC()
  89. {

  90.         EOC=1;TR0=1;START=0;OE=0;DelayMS(50);
  91.         START=1;DelayMS(50);
  92.         START=0;
  93.         while(EOC==0);
  94.         OE=1;
  95.         n=P1;
  96.         DelayMS(1);
  97.         OE=0;
  98.         TR0=0;
  99.         return n;
  100.         }
  101. void main()
  102. {
  103.     TMOD=0x02;
  104.         TH0=0x14;
  105.         TL0=0x00;
  106.         IE=0x82;
  107.         TR0=1;
  108.     Init_LCD();DelayMS(1);        
  109.         
  110.         while(1)
  111.         { ADC();
  112.         display();
  113.         }
  114.         }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:904473 发表于 2021-4-18 20:51 | 只看该作者
已经弄好了,500换成500.0就ok了  但是不知道为什么。。。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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