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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

c51單片機(jī)PCF8591 lcd1602做的電壓表顯示問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:447078 發(fā)表于 2018-12-17 16:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
200黑幣
整個流程為:mcu通過內(nèi)部中斷PWM方式產(chǎn)生可調(diào)輸出電壓,接到PCF8591的AIN3,返回uchar類型,然后通過mcu顯示到lcd上。
現(xiàn)在問題是:不論我如何改變pwm的占空比,再或者不論P(yáng)CF有沒有輸入都會輸出4.8。之前在考慮是不是i2c讀字節(jié)前需要空讀,但是沒有能夠?qū)懗鰜,求助?br /> 有思路的可以留言可以QQ聯(lián)系,謝謝。

只要能解決,500黑幣都給!

main.c
  1. <div>#include <reg51.h> //51寄存器文件
  2. #include <intrins.h>
  3. #include <I2C.H>
  4. #include"1602.h"
  5. #define  PCF8591 0x90    //PCF8591 地址</div><div>typedef unsigned int uint;//WORD代替unsigned int
  6. typedef unsigned char uchar;
  7. unsigned char timer0,timer1,second,second1;
  8. unsigned int count,count1,mid;
  9. unsigned int  key;
  10. unsigned char v,ss,aa;
  11. unsigned long test_ss;
  12. sbit PWM=P3^7;
  13. unsigned int i,j;
  14. unsigned char  Data,keyFlag;
  15. uint a,b,c;
  16. uchar shi,ge,ms,vt;
  17. uint a,b,c,o;
  18. float why;</div><div>void scan_key();
  19. int T1s();</div><div>uchar dis1[] = {"V1:"};
  20. uchar dis2[] = {"V2:"};
  21. uchar dis1t[] = {"T1:"};
  22. uchar dis2t[] = {"T2:"};
  23. uchar dist1[] = "00.0s";
  24. uchar dist2[] = "00.0x";</div><div>void system_Ini()
  25. {
  26.     TMOD = 0x11;
  27.         //PWM  
  28.         TH0 = 0xff;
  29.         TL0 = 0xf7;
  30.         TH1 = 0xff;
  31.         TL1 = 0xf7;
  32.         EA = 1;
  33.         ET0 = 1;
  34.         ET1 = 1;
  35.         TR0  = 1;
  36.         TR1  = 1;
  37.     //IE =0x8A;        
  38. }

  39. /*******************************************************************
  40. ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)               
  41. *******************************************************************/
  42. bit ISendByte(unsigned char sla,unsigned char c)
  43. {
  44.    Start_I2c();              //啟動總線
  45.    SendByte(sla);            //發(fā)送器件地址
  46.    if(ack==0)return(0);
  47.    SendByte(c);              //發(fā)送數(shù)據(jù)
  48.    if(ack==0)return(0);
  49.    Stop_I2c();               //結(jié)束總線
  50.    return(1);
  51. }

  52. /*******************************************************************
  53. ADC讀字節(jié)數(shù)據(jù)函數(shù)               
  54. *******************************************************************/
  55. unsigned char IRcvByte(unsigned char sla)
  56. {  unsigned char c = 0;

  57.    Start_I2c();          //啟動總線
  58.    SendByte(sla+1);      //發(fā)送器件地址
  59.    if(ack==0)return(0);
  60.    c=RcvByte();      //讀取第1路電壓值,范圍是0-255
  61.    c=0;
  62.    c=RcvByte();      //讀取第1路電壓值,范圍是0-255

  63.    //for(what=0;what<5;what++)//連續(xù)讀5次,取最后一次,以便讀取穩(wěn)定值
  64.                   

  65.    Ack_I2c(1);           //發(fā)送非就答位
  66.    Stop_I2c();           //結(jié)束總線
  67.    return(c);
  68. }

  69. main()
  70. {
  71.         BYTE i;
  72.         //uchar shi,ge;
  73.         lcd_init();                                //初始化LCD        
  74.         system_Ini();               
  75.         delay(10);
  76.         lcd_pos(0);                                //設(shè)置顯示位置為第一行的第1個字符
  77.         i = 0;
  78.         while(dis1[i] != '\0')
  79.         {                                                //顯示字符"一號電壓"
  80.                 lcd_wdat(dis1[i]);
  81.                 i++;
  82.         }
  83.         lcd_pos(8);                                //設(shè)置顯示位置為第一行的第9個字符
  84.         i = 0;
  85.         while(dis1[i] != '\0')
  86.         {                                                //顯示字符"一號時間"
  87.                 lcd_wdat(dis1t[i]);
  88.                 i++;
  89.         }
  90.         lcd_pos(0x40);                        //設(shè)置顯示位置為第二行第1個字符
  91.         i = 0;
  92.         while(dis2[i] != '\0')
  93.         {
  94.                 lcd_wdat(dis2[i]);        //顯示字符"二號電壓"
  95.                 i++;
  96.         }
  97.         lcd_pos(0x48);                        //設(shè)置顯示位置為第二行第9個字符
  98.         i = 0;
  99.         while(dis2[i] != '\0')
  100.         {
  101.                 lcd_wdat(dis2t[i]);        //顯示字符"二號時間"
  102.                 i++;
  103.         }
  104.         lcd_pos(0x4b);                                //設(shè)置顯示位置為第一行的第12個字符
  105.         lcd_wdat(0x30+0);
  106.         lcd_pos(0x4c);                                //設(shè)置顯示位置為第一行的第12個字符
  107.         lcd_wdat(0x30+0);
  108.         lcd_pos(0x4d);                                //設(shè)置顯示位置為第一行的第12個字符
  109.         lcd_wdat('.');
  110.         lcd_pos(0x4e);                                //設(shè)置顯示位置為第一行的第12個字符
  111.         lcd_wdat(0x30+0);
  112.         //while(1);        
  113.         lcd_pos(3);                                //設(shè)置顯示位置為第一行的第12個字符
  114.         lcd_wdat(0x30+0);
  115.         lcd_pos(4);                                //設(shè)置顯示位置為第一行的第12個字符
  116.         lcd_wdat('.');
  117.         lcd_pos(5);                                //設(shè)置顯示位置為第一行的第12個字符
  118.         lcd_wdat(0x30+0);

  119.     while(1)
  120.     {
  121.         //if(ms>0) ISendByte(PCF8591,0x43);
  122.         if((count>0)&&(keyFlag == 1))
  123.         {
  124.         ISendByte(PCF8591,0x43);
  125.     Data=IRcvByte(PCF8591);
  126.         ss=Data*48/255;
  127.         a = ss/10 ;
  128.         b = (ss)%10;
  129.         //c = (ss-a*100-b*10)%10;


  130.         lcd_pos(3);                                //設(shè)置顯示位置為第一行的第12個字符
  131.         lcd_wdat('0'+a);
  132.         lcd_pos(4);                                //設(shè)置顯示位置為第一行的第12個字符
  133.         lcd_wdat('.');
  134.         lcd_pos(5);                                //設(shè)置顯示位置為第一行的第12個字符
  135.         lcd_wdat(0x30+b);
  136.         //lcd_pos(6);                                //設(shè)置顯示位置為第一行的第12個字符
  137.         //lcd_wdat(0x30+c);
  138.         
  139.         shi=second/10;
  140.         ge=second%10;
  141.         lcd_pos(0x4b);                                //設(shè)置顯示位置為第2行的第12個字符
  142.         lcd_wdat(0x30+shi);
  143.         lcd_pos(0x4c);                                //設(shè)置顯示位置為第2行的第12個字符
  144.         lcd_wdat(0x30+ge);
  145.         lcd_pos(0x4d);                                //設(shè)置顯示位置為第2行的第12個字符
  146.         lcd_wdat('.');
  147.         lcd_pos(0x4e);                                //設(shè)置顯示位置為第2行的第12個字符
  148.         lcd_wdat(0x30+ms);
  149.         }
  150.     }                        
  151. }

  152. /*************************************
  153. [ t1 (0.5ms)中斷] 中斷中做 PWM 輸出
  154.   ------------1000/(0.02ms*250)=200Hz
  155. *************************************/
  156. void T0zd(void) interrupt 1    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
  157. {
  158.         scan_key();                                                                   //檢測按鍵
  159.    switch(key){
  160.    case 8:
  161.    {
  162.            keyFlag  = 1;
  163.         TR0 = 0;
  164.         TH0 = 0xff;
  165.         TL0 = 0xf7;
  166.         TR0 = 1;
  167.          timer1++;

  168.          if(timer1>=100)
  169.           {
  170.                 timer1=0;
  171.                 ms++;
  172.                 vt++;
  173.         }
  174.     if(timer1<=0) PWM=1;
  175.     else PWM=0;
  176.         if(ms == 10)
  177.         {
  178.                  ms = 0;
  179.                 count++;
  180.         if(count == 10)
  181.         {
  182.                 count = 0;
  183.                 second++;
  184.                 if(second == 60)
  185.                 {
  186.                          second = 0;
  187.                 }
  188.         }}
  189.         else
  190.         {
  191.                  }
  192.         }break;
  193.         default:;
  194.         }
  195. }

  196. void T1zd(void) interrupt 3    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
  197. {

  198. }

  199. void scan_key()                                                         //按鍵檢測函數(shù)
  200. {
  201.         if(P1== 0xfe)
  202.                 key= 1;
  203.         if(P1== 0xfd)
  204.                 key= 2;
  205.         if(P1== 0xfb)
  206.                 key= 3;
  207.         if(P1== 0xf7)
  208.                 key= 4;
  209.         if(P1== 0xef)
  210.                 key= 5;
  211.         if(P1== 0xdf)
  212.                 key= 6;
  213.         if(P1== 0xbf)
  214.                 key= 7;
  215.         if(P1== 0x7f)
  216.                 key= 8;

  217. }
  218. </div>
復(fù)制代碼

I2C.c
  1. <div><font size="2">
  2. /*************************此部分為I2C總線的驅(qū)動程序*************************************/

  3. #include<reg52.h>
  4. #include <intrins.h>
  5. #include <I2C.H>

  6. #define  NOP()   _nop_()   /* 定義空指令 */
  7. #define  _Nop()  _nop_()   /*定義空指令*/


  8. sbit     SCL=P2^1;       //I2C  時鐘
  9. sbit     SDA=P2^0;       //I2C  數(shù)據(jù)
  10. bit ack;                 /*應(yīng)答標(biāo)志位*/
  11.    

  12. /*******************************************************************
  13.                      起動總線函數(shù)               
  14. 函數(shù)原型: void  Start_I2c();  
  15. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  16. ********************************************************************/
  17. void Start_I2c()
  18. {
  19.   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  20.   _Nop();
  21.   SCL=1;
  22.   _Nop();        /*起始條件建立時間大于4.7us,延時*/
  23.   _Nop();
  24.   _Nop();
  25.   _Nop();
  26.   _Nop();   
  27.   SDA=0;         /*發(fā)送起始信號*/
  28.   _Nop();        /* 起始條件鎖定時間大于4μs*/
  29.   _Nop();
  30.   _Nop();
  31.   _Nop();
  32.   _Nop();      
  33.   SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  34.   _Nop();
  35.   _Nop();
  36. }

  37. /*******************************************************************
  38.                       結(jié)束總線函數(shù)               
  39. 函數(shù)原型: void  Stop_I2c();  
  40. 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.  
  41. ********************************************************************/
  42. void Stop_I2c()
  43. {
  44.   SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
  45.   _Nop();       /*發(fā)送結(jié)束條件的時鐘信號*/
  46.   SCL=1;      /*結(jié)束條件建立時間大于4μs*/
  47.   _Nop();
  48.   _Nop();
  49.   _Nop();
  50.   _Nop();
  51.   _Nop();
  52.   SDA=1;      /*發(fā)送I2C總線結(jié)束信號*/
  53.   _Nop();
  54.   _Nop();
  55.   _Nop();
  56.   _Nop();
  57. }

  58. /*******************************************************************
  59.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  60. 函數(shù)原型: void  SendByte(UCHAR c);
  61. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  62.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  63.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  64. ********************************************************************/
  65. void  SendByte(unsigned char  c)
  66. {
  67. unsigned char  BitCnt;

  68. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  69.     {
  70.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  71.        else  SDA=0;               
  72.      _Nop();
  73.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  74.       _Nop();
  75.       _Nop();             /*保證時鐘高電平周期大于4μs*/
  76.       _Nop();
  77.       _Nop();
  78.       _Nop();         
  79.      SCL=0;
  80.     }
  81.    
  82.     _Nop();
  83.     _Nop();
  84.     SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  85.     _Nop();
  86.     _Nop();   
  87.     SCL=1;
  88.     _Nop();
  89.     _Nop();
  90.     _Nop();
  91.     if(SDA==1)ack=0;     
  92.        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  93.     SCL=0;
  94.     _Nop();
  95.     _Nop();
  96. }

  97. /*******************************************************************
  98.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  99. 函數(shù)原型: UCHAR  RcvByte();
  100. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  101.           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。  
  102. ********************************************************************/   
  103. unsigned char   RcvByte()
  104. {
  105.   unsigned char  retc;
  106.   unsigned char  BitCnt;
  107.   
  108.   retc=0;
  109.   SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  110.   for(BitCnt=0;BitCnt<8;BitCnt++)
  111.       {
  112.         _Nop();           
  113.         SCL=0;                  /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  114.         _Nop();
  115.         _Nop();                 /*時鐘低電平周期大于4.7μs*/
  116.         _Nop();
  117.         _Nop();
  118.         _Nop();
  119.         SCL=1;                  /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  120.         _Nop();
  121.         _Nop();
  122.         retc=retc<<1;
  123.         if(SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  124.         _Nop();
  125.         _Nop();
  126.       }
  127.   SCL=0;   
  128.   _Nop();
  129.   _Nop();
  130.   return(retc);
  131. }

  132. /********************************************************************
  133.                      應(yīng)答子函數(shù)
  134. 函數(shù)原型:  void Ack_I2c(bit a);
  135. 功能:      主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  136. ********************************************************************/
  137. void Ack_I2c(bit a)
  138. {
  139.   
  140.   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  141.   else SDA=1;
  142.   _Nop();
  143.   _Nop();
  144.   _Nop();      
  145.   SCL=1;
  146.   _Nop();
  147.   _Nop();                    /*時鐘低電平周期大于4μs*/
  148.   _Nop();
  149.   _Nop();
  150.   _Nop();  
  151.   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  152.   _Nop();
  153.   _Nop();   
  154. }</font>
  155. </div>
復(fù)制代碼

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

使用道具 舉報

沙發(fā)
ID:447078 發(fā)表于 2018-12-17 16:30 | 只看該作者
補(bǔ)充一點:PWM輸出的電壓值通過電壓表測過啦,是沒有問題的。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区久久 | 超碰成人av | 亚洲精品天堂 | 国产农村妇女精品一区 | 日韩成人在线网址 | 国产精品完整版 | 日日操夜夜操天天操 | 黄色一级电影免费观看 | 别c我啊嗯国产av一毛片 | 亚洲成人精品一区 | 天天干天天操天天看 | 国产黄色大片 | 欧洲免费毛片 | 国产精品一区二区在线免费观看 | 日本在线精品视频 | 九九免费 | 国产成人99av超碰超爽 | 日韩欧美在线观看 | 国产成人在线视频 | 欧美成人一区二免费视频软件 | 天天干天天草 | 亚洲国产成人精品女人 | 成人午夜精品 | www免费视频 | 久久大陆 | 久久大 | 日韩在线视频精品 | 日韩精品极品视频在线观看免费 | 超碰成人在线观看 | 国产福利在线看 | 中文字幕 在线观看 | 日本精品一区二区 | 亚洲激情第一页 | 美女黄网站视频免费 | 亚洲国产精品久久久 | 欧美精品一区二区三区在线 | 中文字幕一区二区三区四区不卡 | 国产真实精品久久二三区 | 国产区视频在线观看 | 亚洲精品一区二三区不卡 | 国产9999精品 |