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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2786|回復: 6
打印 上一主題 下一主題
收起左側

這個單片機+PCF8591串口輸出程序就只輸出 00;有人知道原因嗎?

[復制鏈接]
跳轉到指定樓層
樓主
ID:280486 發表于 2019-1-6 19:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #include "I2C.H"
  3. #include <intrins.h>
  4. #define  PCF8591 0x90    //PCF8591 地址
  5. unsigned char i=0,j=0,D[4];
  6. void uart_init()
  7.    {
  8.       SCON=0X50;
  9.       PCON=0X00;
  10.       TMOD=0X20;
  11.       TH1=0XFD;   //11.0592MHZ 9600
  12.       TL1=0XFD;
  13.       TR1=1;
  14.       ES=1;
  15.       EA=1;
  16.    }
  17. /*void send(unsigned char D[],unsigned char a)  
  18.    {
  19.       ES=0;
  20.       SBUF=D[a];
  21.       while(TI==0);
  22.       TI=0;
  23.       ES=1;
  24.    }*/
  25. void delay_ms(unsigned int ms)            //延時
  26.    {  
  27.       unsigned char a,b,c;
  28.       while(ms--)
  29.          {
  30.              for(c=1;c>0;c--)
  31.                for(b=142;b>0;b--)
  32.                      for(a=2;a>0;a--);
  33.          }
  34.    }
  35. /*******************************************************************
  36. DAC 變換, 轉化函數               
  37. *******************************************************************/
  38. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  39.    {
  40.       Start_I2c();              //啟動總線
  41.       SendByte(sla);            //發送器件地址
  42.       if(ack==0)return(0);
  43.       SendByte(c);              //發送控制字節
  44.       if(ack==0)return(0);
  45.       SendByte(Val);            //發送DAC的數值  
  46.       if(ack==0)return(0);
  47.       Stop_I2c();               //結束總線
  48.       return(1);
  49.    }
  50. /*******************************************************************
  51. ADC發送字節[命令]數據函數               
  52. *******************************************************************/
  53. bit ISendByte(unsigned char sla,unsigned char c)
  54.    {
  55.       Start_I2c();              //啟動總線
  56.       SendByte(sla);            //發送器件地址
  57.       if(ack==0)return(0);
  58.       SendByte(c);              //發送數據
  59.       if(ack==0)return(0);
  60.       Stop_I2c();               //結束總線
  61.       return(1);
  62.    }
  63. /*******************************************************************
  64. ADC讀字節數據函數               
  65. *******************************************************************/
  66. unsigned char IRcvByte(unsigned char sla)
  67.    {
  68.       unsigned char c;
  69.       Start_I2c();          //啟動總線
  70.       SendByte(sla+1);      //發送器件地址
  71.       if(ack==0)return(0);
  72.       c=RcvByte();          //讀取數據0
  73.       Ack_I2c(1);           //發送非就答位
  74.       Stop_I2c();           //結束總線
  75.       return(c);
  76.    }
  77. //******************************************************************/
  78. void main()
  79.    {
  80.       uart_init();
  81.       delay_ms(1000);
  82.       while(1)
  83.          {
  84.             /********以下AD-DA處理*************/  
  85.             switch(i)
  86.                {
  87.                   case 0: ISendByte(PCF8591,0x41);
  88.                      D[0]=IRcvByte(PCF8591);  //ADC0 模數轉換1  放大2倍顯示
  89.                   break;  
  90.                   case 1: ISendByte(PCF8591,0x42);
  91.                      D[1]=IRcvByte(PCF8591);  //ADC1  模數轉換2
  92.                   break;  
  93.                   case 2: ISendByte(PCF8591,0x43);
  94.                      D[2]=IRcvByte(PCF8591);  //ADC2  模數轉換3
  95.                   break;
  96.                   case 3: ISendByte(PCF8591,0x40);
  97.                      D[3]=IRcvByte(PCF8591);  //ADC3   模數轉換4
  98.                   break;
  99.                   case 4: DACconversion(PCF8591,0x40, j); //DAC     數模轉換
  100.                   break;
  101.                }
  102.             SBUF=D[1];     //區別在這里
  103.             while(TI==0);
  104.             TI=0;
  105.             if(++i>4) i=0;
  106.             if(j<256) j++;
  107.             else j=0;
  108.             delay_ms(10000);
  109.          }  
  110.    }
  111. void uart() interrupt 4
  112.    {
  113.       RI=0;
  114.       i=SBUF;
  115.    }
  116. 這樣能正確讀取PCF8591內容。



  117. #include<reg52.h>
  118. #include "I2C.H"
  119. #include <intrins.h>
  120. #define  PCF8591 0x90    //PCF8591 地址
  121. unsigned char i=0,j=0,n=0,D[4];
  122. void uart_init()
  123.    {
  124.       SCON=0X50;
  125.       PCON=0X00;
  126.       TMOD=0X20;
  127.       TH1=0XFD;   //11.0592MHZ 9600
  128.       TL1=0XFD;
  129.       TR1=1;
  130.       ES=1;
  131.       EA=1;
  132.    }
  133. /*void send(unsigned char D[],unsigned char a)  
  134.    {
  135.       ES=0;
  136.       SBUF=D[a];
  137.       while(TI==0);
  138.       TI=0;
  139.       ES=1;
  140.    }*/
  141. void delay_ms(unsigned int ms)            //延時
  142.    {  
  143.       unsigned char a,b,c;
  144.       while(ms--)
  145.          {
  146.              for(c=1;c>0;c--)
  147.                for(b=142;b>0;b--)
  148.                      for(a=2;a>0;a--);
  149.          }
  150.    }
  151. /*******************************************************************
  152. DAC 變換, 轉化函數               
  153. *******************************************************************/
  154. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  155.    {
  156.       Start_I2c();              //啟動總線
  157.       SendByte(sla);            //發送器件地址
  158.       if(ack==0)return(0);
  159.       SendByte(c);              //發送控制字節
  160.       if(ack==0)return(0);
  161.       SendByte(Val);            //發送DAC的數值  
  162.       if(ack==0)return(0);
  163.       Stop_I2c();               //結束總線
  164.       return(1);
  165.    }
  166. /*******************************************************************
  167. ADC發送字節[命令]數據函數               
  168. *******************************************************************/
  169. bit ISendByte(unsigned char sla,unsigned char c)
  170.    {
  171.       Start_I2c();              //啟動總線
  172.       SendByte(sla);            //發送器件地址
  173.       if(ack==0)return(0);
  174.       SendByte(c);              //發送數據
  175.       if(ack==0)return(0);
  176.       Stop_I2c();               //結束總線
  177.       return(1);
  178.    }
  179. /*******************************************************************
  180. ADC讀字節數據函數               
  181. *******************************************************************/
  182. unsigned char IRcvByte(unsigned char sla)
  183.    {
  184.       unsigned char c;
  185.       Start_I2c();          //啟動總線
  186.       SendByte(sla+1);      //發送器件地址
  187.       if(ack==0)return(0);
  188.       c=RcvByte();          //讀取數據0
  189.       Ack_I2c(1);           //發送非就答位
  190.       Stop_I2c();           //結束總線
  191.       return(c);
  192.    }
  193. //******************************************************************/
  194. void main()
  195.    {
  196.       uart_init();
  197.       delay_ms(1000);
  198.       while(1)
  199.          {
  200.             /********以下AD-DA處理*************/  
  201.             switch(i)
  202.                {
  203.                   case 0: ISendByte(PCF8591,0x41);
  204.                      D[0]=IRcvByte(PCF8591);  //ADC0 模數轉換1  放大2倍顯示
  205.                   break;  
  206.                   case 1: ISendByte(PCF8591,0x42);
  207.                      D[1]=IRcvByte(PCF8591);  //ADC1  模數轉換2
  208.                   break;  
  209.                   case 2: ISendByte(PCF8591,0x43);
  210.                      D[2]=IRcvByte(PCF8591);  //ADC2  模數轉換3
  211.                   break;
  212.                   case 3: ISendByte(PCF8591,0x40);
  213.                      D[3]=IRcvByte(PCF8591);  //ADC3   模數轉換4
  214.                   break;
  215.                   case 4: DACconversion(PCF8591,0x40, j); //DAC     數模轉換
  216.                   break;
  217.                }
  218.             SBUF=D[n];    //區別在這
  219.             while(TI==0);
  220.             TI=0;
  221.             if(++i>4) i=0;
  222.             if(j<256) j++;
  223.             else j=0;
  224.             delay_ms(10000);
  225.          }  
  226.    }
  227. void uart() interrupt 4
  228.    {
  229.       RI=0;
  230.       n=SBUF;
  231.    }
復制代碼


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

使用道具 舉報

沙發
ID:280486 發表于 2019-1-6 20:03 | 只看該作者
區別在主函數,switch語句的下一句SBUF那里,看不清的請反色,從VS code復制過來的,顏色也過來了……
回復

使用道具 舉報

板凳
ID:432823 發表于 2019-1-6 20:48 | 只看該作者
n值應從0~3變
回復

使用道具 舉報

地板
ID:280486 發表于 2019-1-7 13:57 | 只看該作者

n是全局變量,默認是0;把那個位置換成常數0能正常發送。換成變量n就不行了即使n==0;
回復

使用道具 舉報

5#
ID:213173 發表于 2019-1-7 15:42 | 只看該作者
7305 發表于 2019-1-7 13:57
n是全局變量,默認是0;把那個位置換成常數0能正常發送。換成變量n就不行了即使n==0;

給你改了一下,你試試。只有接收到上位機0x00~0x03的有效選擇指令,否則不發送數據。
#include<reg52.h>
#include "I2C.H"
#include <intrins.h>
#define  PCF8591 0x90    //PCF8591 地址
unsigned char i=0,j=0,D[4];
void uart_init()
   {
      SCON=0X50;
      PCON=0X00;
      TMOD=0X20;
      TH1=0XFD;   //11.0592MHZ 9600
      TL1=0XFD;
      TR1=1;
      ES=1;
      EA=1;
   }
/*void send(unsigned char D[],unsigned char a)  
   {
      ES=0;
      SBUF=D[a];
      while(TI==0);
      TI=0;
      ES=1;
   }*/
void delay_ms(unsigned int ms)            //延時
   {  
      unsigned char a,b,c;
      while(ms--)
         {
             for(c=1;c>0;c--)
               for(b=142;b>0;b--)
                     for(a=2;a>0;a--);
         }
   }
/*******************************************************************
DAC 變換, 轉化函數               
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
   {
      Start_I2c();              //啟動總線
      SendByte(sla);            //發送器件地址
      if(ack==0)return(0);
      SendByte(c);              //發送控制字節
      if(ack==0)return(0);
      SendByte(Val);            //發送DAC的數值  
      if(ack==0)return(0);
      Stop_I2c();               //結束總線
      return(1);
   }
/*******************************************************************
ADC發送字節[命令]數據函數               
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
   {
      Start_I2c();              //啟動總線
      SendByte(sla);            //發送器件地址
      if(ack==0)return(0);
      SendByte(c);              //發送數據
      if(ack==0)return(0);
      Stop_I2c();               //結束總線
      return(1);
   }
/*******************************************************************
ADC讀字節數據函數               
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
   {
      unsigned char c;
      Start_I2c();          //啟動總線
      SendByte(sla+1);      //發送器件地址
      if(ack==0)return(0);
      c=RcvByte();          //讀取數據0
      Ack_I2c(1);           //發送非就答位
      Stop_I2c();           //結束總線
      return(c);
   }
//******************************************************************/
void main()
   {
      uart_init();
      delay_ms(1000);
      while(1)
         {
            /********以下AD-DA處理*************/  
            switch(i)
               {
                  case 0: ISendByte(PCF8591,0x41);
                     D[0]=IRcvByte(PCF8591);  //ADC0 模數轉換1  放大2倍顯示
                  break;  
                  case 1: ISendByte(PCF8591,0x42);
                     D[1]=IRcvByte(PCF8591);  //ADC1  模數轉換2
                  break;  
                  case 2: ISendByte(PCF8591,0x43);
                     D[2]=IRcvByte(PCF8591);  //ADC2  模數轉換3
                  break;
                  case 3: ISendByte(PCF8591,0x40);
                     D[3]=IRcvByte(PCF8591);  //ADC3   模數轉換4
                  break;
                  case 4: DACconversion(PCF8591,0x40, j); //DAC     數模轉換
                  break;
               }
            SBUF=D[1];     //區別在這里
            while(TI==0);
            TI=0;
            if(++i>4) i=0;
            if(j<256) j++;
            else j=0;
            delay_ms(10000);
         }  
   }
void uart() interrupt 4
   {
      RI=0;
      i=SBUF;
   }
這樣能正確讀取PCF8591內容。



#include<reg52.h>
#include "I2C.H"
#include <intrins.h>
#define  PCF8591 0x90    //PCF8591 地址
unsigned char i=0,j=0,n=0,D[4];
uchar flag;                //接收完成標志
void uart_init()
   {
      SCON=0X50;
      PCON=0X00;
      TMOD=0X20;
      TH1=0XFD;   //11.0592MHZ 9600
      TL1=0XFD;
      TR1=1;
      ES=1;
      EA=1;
   }
/*void send(unsigned char D[],unsigned char a)  
   {
      ES=0;
      SBUF=D[a];
      while(TI==0);
      TI=0;
      ES=1;
   }*/
void delay_ms(unsigned int ms)            //延時
   {  
      unsigned char a,b,c;
      while(ms--)
         {
             for(c=1;c>0;c--)
               for(b=142;b>0;b--)
                     for(a=2;a>0;a--);
         }
   }
/*******************************************************************
DAC 變換, 轉化函數               
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
   {
      Start_I2c();              //啟動總線
      SendByte(sla);            //發送器件地址
      if(ack==0)return(0);
      SendByte(c);              //發送控制字節
      if(ack==0)return(0);
      SendByte(Val);            //發送DAC的數值  
      if(ack==0)return(0);
      Stop_I2c();               //結束總線
      return(1);
   }
/*******************************************************************
ADC發送字節[命令]數據函數               
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
   {
      Start_I2c();              //啟動總線
      SendByte(sla);            //發送器件地址
      if(ack==0)return(0);
      SendByte(c);              //發送數據
      if(ack==0)return(0);
      Stop_I2c();               //結束總線
      return(1);
   }
/*******************************************************************
ADC讀字節數據函數               
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
   {
      unsigned char c;
      Start_I2c();          //啟動總線
      SendByte(sla+1);      //發送器件地址
      if(ack==0)return(0);
      c=RcvByte();          //讀取數據0
      Ack_I2c(1);           //發送非就答位
      Stop_I2c();           //結束總線
      return(c);
   }
//******************************************************************/
        void main()
        {
        uart_init();
        delay_ms(1000);
        while(1)
        {
                /********以下AD-DA處理*************/  
                switch(i)
                {
                        case 0: ISendByte(PCF8591,0x41);
                        D[0]=IRcvByte(PCF8591);  //ADC0 模數轉換1  放大2倍顯示
                        break;  
                        case 1: ISendByte(PCF8591,0x42);
                        D[1]=IRcvByte(PCF8591);  //ADC1  模數轉換2
                        break;  
                        case 2: ISendByte(PCF8591,0x43);
                        D[2]=IRcvByte(PCF8591);  //ADC2  模數轉換3
                        break;
                        case 3: ISendByte(PCF8591,0x40);
                        D[3]=IRcvByte(PCF8591);  //ADC3   模數轉換4
                        break;
                        case 4: DACconversion(PCF8591,0x40, j); //DAC     數模轉換
                        break;
                }
                if((flag==1)&&(n<4))//接收完成標志為1與只有接收到0~3有效的指令,否則不發送數據
                {
                        ES=0;                //關串口中斷
                        flag=0;                //接收完成標志清0
                        SBUF=D[n];  //區別在這
                        while(!TI);        //等待發送中斷請求標志位為1
                        TI=0;                //發送中斷請求標志位清0
                        ES=1;                //開串口中斷
                }
                if(++i>4) i=0;
                if(j<256) j++;
                else j=0;
                delay_ms(10000);
        }  
}
void uart() interrupt 4
{
        RI=0;
        n=SBUF;
        flag=1;        //接收完成標志置1
}
回復

使用道具 舉報

6#
ID:280486 發表于 2019-1-7 21:51 | 只看該作者
wulin 發表于 2019-1-7 15:42
給你改了一下,你試試。只有接收到上位機0x00~0x03的有效選擇指令,否則不發送數據。
#include
#includ ...

代碼沒問題,全局變量n必須在死循環里加一個判斷計入次數的語句重賦值n,在主函數里重賦值都不行。全局變量不應該是程序運行就在內存里的嗎?
回復

使用道具 舉報

7#
ID:213173 發表于 2019-1-8 08:57 | 只看該作者
7305 發表于 2019-1-7 21:51
代碼沒問題,全局變量n必須在死循環里加一個判斷計入次數的語句重賦值n,在主函數里重賦值都不行。全局變 ...

其實你的程序缺少一個解析子函數。通常實用的自定義通訊協議是數據串:由數據頭、有效數據、驗證碼、數據尾等組成。下位機對收到的數據串進行解析驗證,提取正確的有效數據來控制相應功能。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人精品一区二区男人看 | 久久久久久久91 | 国产伦精品一区二区三区照片91 | 国产精品入口 | 国产欧美精品一区二区三区 | 成人在线电影网站 | 激情麻豆视频 | 国产乱人伦 | 91国内产香蕉 | 精品欧美乱码久久久久久 | 久久久久久久av | 欧美一区免费在线观看 | 国产色婷婷精品综合在线手机播放 | 一区视频在线免费观看 | 欧美日韩不卡合集视频 | 亚洲色欲色欲www | 操久久| 一级在线观看 | 国产精品久久久久aaaa | 欧美久久久久 | 91偷拍精品一区二区三区 | 国产成年人小视频 | 人人性人人性碰国产 | 亚洲国产一区在线 | 日本一区二区三区在线观看 | 欧美自拍第一页 | 欧美一区二区三区国产 | 久久久久精| 亚洲精品视频在线 | 国产一级淫片a直接免费看 免费a网站 | 欧美视频二区 | 亚洲视频中文字幕 | 久草视频观看 | 在线播放国产一区二区三区 | 亚洲男人天堂2024 | 中文字幕在线欧美 | 亚洲成年在线 | 国产精品成人一区二区三区夜夜夜 | 亚洲综合二区 | 久久高清精品 | 91精品在线播放 |