標(biāo)題: 單片機(jī)+adc0808與1602測電壓,只能測一半? [打印本頁]

作者: longzhihao    時間: 2021-4-18 20:44
標(biāo)題: 單片機(jī)+adc0808與1602測電壓,只能測一半?
ADC0808 轉(zhuǎn)換測電壓,當(dāng)滑動變阻器在百分之50以下就是2.5v以下時很準(zhǔn),超過2.5v就從0開始記。求助。。

另外,我還想顯示電流和電功率,請問該如何做呢?
單片機(jī)源程序如下:
  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: .   "};         //第一行顯示數(shù)據(jù)//
  14. uchar LCDDSY2[]={"P: .   "};          //第二行顯示數(shù)據(jù)//
  15. uchar n;//adc轉(zhuǎn)換數(shù)據(jù)
  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點(diǎn)陣
  51.         DelayMS(1);        
  52.         Write_LCD_Command(0x01);   //清屏
  53.         DelayMS(1);        
  54.         Write_LCD_Command(0x06);   //數(shù)據(jù)讀寫操作后,AC自動加一,畫面不動
  55.         DelayMS(1);        
  56.         Write_LCD_Command(0x0c);   // 顯示開,光標(biāo)關(guān),閃爍關(guān)
  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.         }
復(fù)制代碼



作者: longzhihao    時間: 2021-4-18 20:51
已經(jīng)弄好了,500換成500.0就ok了  但是不知道為什么。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1