找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

怎樣把STC15F204EA單片機(jī)測(cè)量的電壓從串口輸出?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1100982 發(fā)表于 2023-11-24 10:11 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
以下程序是把STC15F204EA單片機(jī)測(cè)量P1.3-P1.7幾個(gè)管腳的電壓得到V01-V05這5個(gè)電壓,原來(lái)是發(fā)送到LCD1602顯示的,現(xiàn)在想把這幾個(gè)電壓值組合成"V01,V02,V03,V04,V05;"這樣的字符串發(fā)送到串口來(lái)顯示。

現(xiàn)在串口可以顯示u8 buf[11]="1,2,3,4,5;"的內(nèi)容,嘗試了很多次要把顯示內(nèi)容改為"V01,V02,V03,V04,V05;"都不成功,哪位高手能幫忙修改一下。


//本程序從串口發(fā)送字符串,單片機(jī)串口監(jiān)控必須設(shè)置為9600bps

#define MAIN_Fosc                11059200L        //定義主時(shí)鐘
#include        "STC15Fxxxx.H"

typedef bit BOOL;  //定義別名
typedef unsigned char BYTE;
typedef unsigned int WORD;

sbit RXB = P3^0; //??????
sbit TXB = P3^1;

#define BAUD 0xFE80 // 9600bps @ 11 .0592MHz

BYTE TBUF,RBUF;
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;
BOOL CT;
BYTE t, r;
u8 buf[11]="1,2,3,4,5;"; //從串口發(fā)送的內(nèi)容

/*************        本地變量聲明        **************/

u16 Bandgap,Get_ADC(u8 channel),j;        //channel = 0~7

u8 m1,m2,m3,m4,stop=0,i;

u32 V0,V1,V2,V3,V4,V5,power,V01,V02,V03,V04,V05,V=1420;

sbit OUT=P3^4;         //15腳P3.4控制外部

u16        Get_ADC(u8 channel)        //channel = 0~7
{
        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xE0) | 0x08 | channel;         //start the ADC
        NOP(4);

        while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
        ADC_CONTR &= ~0x10;                //清除ADC結(jié)束標(biāo)志
        return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
}

void ADC(X)
{
        P1ASF =1<<X;
        Get_ADC(X);        //通道改變, 先讀一次并丟棄結(jié)果, 讓內(nèi)部的采樣電容的電壓等于輸入值.
        for(j=0, i=0; i<16; i++)        {j+= Get_ADC(X);}
        j=j>>4;
}

void UART_INIT()
{
    TMOD = 0x00;
    AUXR = 0x80;
    TL0 = BAUD;
    TH0 = BAUD>>8;
    TR0 = 1;
    ET0 = 1;
    PT0 = 1;
    EA = 1;
    TING = 0;
    RING = 0;
    TEND = 1;
    REND = 0;
    TCNT = 0;
    RCNT = 0;
}

void main()
{     
        BYTE f=0;
    WORD e=0;
    UART_INIT();   //初始化串口
        ADC_CONTR = 0xE0;                        //90T, ADC power on
        

    while (1)
    {
                if (stop==0)
                {
                        ADC(2);                Bandgap = j;//TL431基準(zhǔn)電壓
               
                        ADC(3);                V1 = (u16)((u32)j*758/ Bandgap);
               
                        ADC(4);                V2 = (u16)((u32)j*1546/ Bandgap);
               
                        ADC(5);                V3 = (u16)((u32)j*2317/ Bandgap);
               
                        ADC(6);                V4 = (u16)((u32)j*3297/ Bandgap);
                        
                        ADC(7);                V5 = (u16)((u32)j*4050/ Bandgap);
               
                        V01=V1;
                        if(V2>V1){V02=V2-V1;}else{V02=0;}
                        if(V3>V1){V03=V3-V2;}else{V03=0;}
                        if(V4>V1){V04=V4-V3;}else{V04=0;}
                        if(V5>V1){V05=V5-V4;}else{V05=0;}
                }

                if(V01<V&&V02<V&&V03<V&&V04<V&&V05<V){}else{OUT=0;stop=1;}        //5塊電池        
               

                TING = 1;
        TBUF = buf[f++];
        e=6000;
        while(e--);  //延時(shí)
        if (f>11){f=0;}
    }
}

void tm0() interrupt 1 using 1   
{
    if (RING)
    {
        if (--RCNT == 0)   //??---?????1
        {
            RCNT = 3;  
            if (--RBIT == 0)   //????????---????---??9?--8????---1????
            {
                RBUF = RDAT;   //?????
                RING = 0;   
                REND = 1;  
            }
            else//????9??????---????????--???
            {
                RDAT >>= 1;
                if (RXB)
                    RDAT |= 0x80;  //????????????0??1
            }
        }
    }
    else if (!RXB)
    {
        RING = 1;  
        RCNT = 4;  
        RBIT = 9;  
    }
    if (--TCNT == 0)  //??
    {
        TCNT = 3;  
        if (TING)  
        {
            if (TBIT == 0)//9???????
            {
                TXB = 0;   //?????
                TDAT = TBUF;  //??
                TBIT = 9;   //????????????8+1
                TEND = 0;  
            }
            else
            {
                TDAT >>= 1;   //??---??????
                if (--TBIT == 0)
                {
                    TXB = 1;
                    TING = 0;  
                    TEND = 1;  
                }
                else
                {
                    TXB = CY;  //CY????????7?
                }
            }
        }
    }
}

STC15F204EA串口實(shí)驗(yàn).zip

44.23 KB, 下載次數(shù): 3

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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2023-11-24 13:26 | 只看該作者

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 AD轉(zhuǎn)換查詢方式舉例----------------------------*/
  4. /* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
  5. /* 如果要在文章中應(yīng)用此代碼,請(qǐng)?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
  6. /*---------------------------------------------------------------------*/

  7. //本示例在Keil開(kāi)發(fā)環(huán)境下請(qǐng)選擇Intel的8058芯片型號(hào)進(jìn)行編譯
  8. //若無(wú)特別說(shuō)明,工作頻率一般為11.0592MHz


  9. #include "reg51.h"
  10. #include "intrins.h"

  11. #define FOSC    11059200L
  12. #define BAUD    115200

  13. typedef unsigned char BYTE;
  14. typedef unsigned int WORD;

  15. #define     URMD    0           //0:使用定時(shí)器2作為波特率發(fā)生器
  16.                                 //1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
  17.                                 //2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器

  18. sfr T2H   = 0xd6;               //定時(shí)器2高8位
  19. sfr T2L   = 0xd7;               //定時(shí)器2低8位

  20. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  21. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  22. sfr P0M1 = 0x93;
  23. sfr P0M0 = 0x94;
  24. sfr P2M1 = 0x95;
  25. sfr P2M0 = 0x96;
  26. sfr P3M1 = 0xB1;
  27. sfr P3M0 = 0xB2;
  28. sfr P4M1 = 0xB3;
  29. sfr P4M0 = 0xB4;
  30. sfr P5M1 = 0xC9;
  31. sfr P5M0 = 0xCA;
  32. sfr P6M1 = 0xCB;
  33. sfr P6M0 = 0xCC;
  34. sfr P7M1 = 0xE1;
  35. sfr P7M0 = 0xE2;

  36. sfr  AUXR       =   0x8e;       //輔助寄存器                              

  37. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
  38. sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
  39. sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果
  40. sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

  41. #define ADC_POWER   0x80            //ADC電源控制位
  42. #define ADC_FLAG    0x10            //ADC完成標(biāo)志
  43. #define ADC_START   0x08            //ADC起始控制位
  44. #define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
  45. #define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
  46. #define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
  47. #define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘

  48. void InitUart();
  49. void InitADC();
  50. void SendData(BYTE dat);
  51. BYTE GetADCResult(BYTE ch);
  52. void Delay(WORD n);
  53. void ShowResult(BYTE ch);

  54. void main()
  55. {
  56.     P0M0 = 0x00;
  57.     P0M1 = 0x00;
  58.     P1M0 = 0x00;
  59.     P1M1 = 0x00;
  60.     P2M0 = 0x00;
  61.     P2M1 = 0x00;
  62.     P3M0 = 0x00;
  63.     P3M1 = 0x00;
  64.     P4M0 = 0x00;
  65.     P4M1 = 0x00;
  66.     P5M0 = 0x00;
  67.     P5M1 = 0x00;
  68.     P6M0 = 0x00;
  69.     P6M1 = 0x00;
  70.     P7M0 = 0x00;
  71.     P7M1 = 0x00;

  72.     InitUart();                     //初始化串口
  73.     InitADC();                      //初始化ADC
  74.     while (1)
  75.     {
  76.         ShowResult(0);              //顯示通道0
  77.         ShowResult(1);              //顯示通道1
  78.         ShowResult(2);              //顯示通道2
  79.         ShowResult(3);              //顯示通道3
  80.         ShowResult(4);              //顯示通道4
  81.         ShowResult(5);              //顯示通道5
  82.         ShowResult(6);              //顯示通道6
  83.         ShowResult(7);              //顯示通道7
  84.     }
  85. }

  86. /*----------------------------
  87. 發(fā)送ADC結(jié)果到PC
  88. ----------------------------*/
  89. void ShowResult(BYTE ch)
  90. {
  91.     SendData(ch);                   //顯示通道號(hào)
  92.     SendData(GetADCResult(ch));     //顯示ADC高8位結(jié)果

  93. //    SendData(ADC_LOW2);           //顯示低2位結(jié)果
  94. }

  95. /*----------------------------
  96. 讀取ADC結(jié)果
  97. ----------------------------*/
  98. BYTE GetADCResult(BYTE ch)
  99. {
  100.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  101.     _nop_();                        //等待4個(gè)NOP
  102.     _nop_();
  103.     _nop_();
  104.     _nop_();
  105.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
  106.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  107.     return ADC_RES;                 //返回ADC結(jié)果
  108. }

  109. /*----------------------------
  110. 初始化串口
  111. ----------------------------*/
  112. void InitUart()
  113. {
  114.     SCON = 0x5a;                //設(shè)置串口為8位可變波特率
  115. #if URMD == 0
  116.     T2L = (65536 - (FOSC/4/BAUD));
  117.     T2H = (65536 - (FOSC/4/BAUD)) >> 8;
  118.     AUXR = 0x14;                //T2為1T模式, 并啟動(dòng)定時(shí)器2
  119.     AUXR |= 0x01;               //選擇定時(shí)器2為串口1的波特率發(fā)生器
  120. #elif URMD == 1
  121.     AUXR = 0x40;                //定時(shí)器1為1T模式
  122.     TMOD = 0x00;                //定時(shí)器1為模式0(16位自動(dòng)重載)
  123.     TL1 = (65536 - (FOSC/4/BAUD));
  124.     TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
  125.     TR1 = 1;                    //定時(shí)器1開(kāi)始啟動(dòng)
  126. #else
  127.     TMOD = 0x20;                //設(shè)置定時(shí)器1為8位自動(dòng)重裝載模式
  128.     AUXR = 0x40;                //定時(shí)器1為1T模式
  129.     TH1 = TL1 = (256 - (FOSC/32/BAUD));
  130.     TR1 = 1;
  131. #endif
  132. }

  133. /*----------------------------
  134. 初始化ADC
  135. ----------------------------*/
  136. void InitADC()
  137. {
  138.     P1ASF = 0xff;                   //設(shè)置P1口為AD口
  139.     ADC_RES = 0;                    //清除結(jié)果寄存器
  140.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  141.     Delay(2);                       //ADC上電并延時(shí)
  142. }

  143. /*----------------------------
  144. 發(fā)送串口數(shù)據(jù)
  145. ----------------------------*/
  146. void SendData(BYTE dat)
  147. {
  148.     while (!TI);                    //等待前一個(gè)數(shù)據(jù)發(fā)送完成
  149.     TI = 0;                         //清除發(fā)送標(biāo)志
  150.     SBUF = dat;                     //發(fā)送當(dāng)前數(shù)據(jù)
  151. }

  152. /*----------------------------
  153. 軟件延時(shí)
  154. ----------------------------*/
  155. void Delay(WORD n)
  156. {
  157.     WORD x;

  158.     while (n--)
  159.     {
  160.         x = 5000;
  161.         while (x--);
  162.     }
  163. }

復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2023-11-24 13:29 | 只看該作者
串口通訊是雙方的事,先訂立一個(gè)雙共同遵守的協(xié)議,按協(xié)議發(fā)送數(shù)據(jù)就可以了。
如:協(xié)議中規(guī)定電壓的表示方式,電壓表的表示方式……
回復(fù)

使用道具 舉報(bào)

地板
ID:1100982 發(fā)表于 2023-11-24 14:03 | 只看該作者
yzwzfyz 發(fā)表于 2023-11-24 13:29
串口通訊是雙方的事,先訂立一個(gè)雙共同遵守的協(xié)議,按協(xié)議發(fā)送數(shù)據(jù)就可以了。
如:協(xié)議中規(guī)定電壓的表示方 ...

我覺(jué)得現(xiàn)在能發(fā)送字符串到串口而且能正確顯示了,不是考慮協(xié)議的問(wèn)題,而是怎樣把發(fā)送的數(shù)據(jù)改為測(cè)量到的電壓值。
回復(fù)

使用道具 舉報(bào)

5#
ID:161164 發(fā)表于 2023-11-24 14:21 | 只看該作者
用printf
回復(fù)

使用道具 舉報(bào)

6#
ID:1100982 發(fā)表于 2023-11-24 14:46 | 只看該作者

用過(guò)了printf了,但小白一個(gè),不知還要引用什么庫(kù)文件,編譯通不過(guò)。
回復(fù)

使用道具 舉報(bào)

7#
ID:1100982 發(fā)表于 2023-11-24 14:51 | 只看該作者

試過(guò)這個(gè)程序直接寫(xiě)入STC15F204EA,串口甚至都沒(méi)有接收到任何數(shù)據(jù),我那個(gè)程序倒是能正常接收到“1,2,3,4,5;”這個(gè)字符串,一直不明白是怎么回事。
回復(fù)

使用道具 舉報(bào)

8#
ID:1100982 發(fā)表于 2023-11-24 14:53 | 只看該作者

不知還要引用哪個(gè)庫(kù),用reg51.h的話與STC15xxxx.H以有沖突。
回復(fù)

使用道具 舉報(bào)

9#
ID:161164 發(fā)表于 2023-11-24 15:55 | 只看該作者
y4h3z4 發(fā)表于 2023-11-24 14:53
不知還要引用哪個(gè)庫(kù),用reg51.h的話與STC15xxxx.H以有沖突。

用了STC15xxxx.H就不需要reg51.h了
printf要用stdio.h
https://blog.csdn.net/afeik/article/details/118356630
回復(fù)

使用道具 舉報(bào)

10#
ID:1004920 發(fā)表于 2023-11-24 17:05 | 只看該作者
是你沒(méi)有把電壓值賦值給buf【】
TBUF = buf[f++];
在這句的前面加上:
buf[0]=V1>>8;
buf[1]=V1;
buf[2]=V2>>8;
buf[3]=V2;
buf[4]=V3>>8;
buf[5]=V3;
buf[6]=V4>>8;
buf[7]=V4;
buf[8]=V5>>8;
buf[9]=V5;
回復(fù)

使用道具 舉報(bào)

11#
ID:883242 發(fā)表于 2023-11-24 17:13 | 只看該作者
自己寫(xiě)個(gè)轉(zhuǎn)換程序,就兩三行的代碼,不要用printf,太大了浪費(fèi)單片機(jī)資源。
回復(fù)

使用道具 舉報(bào)

12#
ID:1034262 發(fā)表于 2023-11-24 20:44 | 只看該作者
STC15F204EA沒(méi)有硬件串口,用軟件做一個(gè),參考STC-ISP范例程序里的例子。
回復(fù)

使用道具 舉報(bào)

13#
ID:1100982 發(fā)表于 2023-11-25 06:23 來(lái)自觸屏版 | 只看該作者
coody_sz 發(fā)表于 2023-11-24 20:44
STC15F204EA沒(méi)有硬件串口,用軟件做一個(gè),參考STC-ISP范例程序里的例子。

原程序已經(jīng)可以從串口接收到字符串了
回復(fù)

使用道具 舉報(bào)

14#
ID:1100982 發(fā)表于 2023-11-25 06:25 來(lái)自觸屏版 | 只看該作者
zch5200 發(fā)表于 2023-11-24 17:05
是你沒(méi)有把電壓值賦值給buf【】
TBUF = buf[f++];
在這句的前面加上:

我原來(lái)就是不會(huì)賦值,你的回復(fù)是最接近我的問(wèn)題的,等一下我試一下你的方法。
回復(fù)

使用道具 舉報(bào)

15#
ID:1100982 發(fā)表于 2023-11-25 22:22 | 只看該作者
zch5200 發(fā)表于 2023-11-24 17:05
是你沒(méi)有把電壓值賦值給buf【】
TBUF = buf[f++];
在這句的前面加上:

忘記說(shuō)明了,V01、V02這些測(cè)量到的電壓值是類似于1243的四位數(shù),代表12.43V
程序開(kāi)頭定義:u8 buf[20]="01234567890123456789";
buf[0]=V01>>8;
buf[1]=V01;
得到的是空值,串口顯示的是..?34567890123456789,前三位改變了,后面17位沒(méi)有變化。

又參考原來(lái)LCD1602的顯示方法,改為:
buf[0]='0'+V01/1000;
buf[1]='0'+(V01/100)%10;
buf[2]='0'+(V01/10)%10;
buf[3]='0'+V01%10;
buf[4]=','
終于正常顯示了。

現(xiàn)在存在的問(wèn)題是:u8 buf[23]還正常,可以發(fā)送24個(gè)字符
u8 buf[24]就報(bào)錯(cuò)
但是5組電壓值,每組4位數(shù)字,各組之間要用“,”隔開(kāi),末尾用“;”結(jié)束,需要發(fā)送25個(gè)字符,剛好不夠,怎么才能解決u8 buf[23]的限制,讓發(fā)送的字符數(shù)不受限制呢?
找到原因了,是因?yàn)槎x的變量太多。減少一些不必要的變量之后,u8 buf[30]都可以了。
回復(fù)

使用道具 舉報(bào)

16#
ID:1100982 發(fā)表于 2023-11-28 07:36 | 只看該作者
以下為正常運(yùn)行的程序。


//本程序從串口發(fā)送字符串,單片機(jī)串口監(jiān)控必須設(shè)置為9600bps

#define MAIN_Fosc                11059200L        //定義主時(shí)鐘
#include        "STC15Fxxxx.H"

sbit RXB = P3^0;
sbit TXB = P3^1;

#define BAUD 0xFE80 // 9600bps @ 11 .0592MHz

/*************        本地變量聲明        **************/
u8 TBUF,RBUF,TDAT,RDAT,TCNT,RCNT,TBIT,RBIT,t,r;
bit TING,RING,TEND,REND,CT;
u16 Bandgap,Get_ADC(u8 channel),j;        //channel = 0~7
u8 stop=0,i,buf[29]="-----------------------------"; //buf[]:從串口發(fā)送的內(nèi)容;

u32 V0,V1,V2,V3,V4,V5,V01,V02,V03,V04,V05;

sbit OUT=P3^4;         //15腳P3.4控制外部

u16        Get_ADC(u8 channel)        //channel = 0~7
{
        ADC_RES = 0;        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xE0) | 0x08 | channel;         //start the ADC
        NOP(4);

        while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
        ADC_CONTR &= ~0x10;                //清除ADC結(jié)束標(biāo)志
        return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
}

void ADC(X)
{
        P1ASF =1<<X;
        Get_ADC(X);        //通道改變, 先讀一次并丟棄結(jié)果, 讓內(nèi)部的采樣電容的電壓等于輸入值.
        for(j=0, i=0; i<16; i++)        {j+= Get_ADC(X);}
        j=j>>4;
}

void UART_INIT()
{
    TMOD = 0x00;
    AUXR = 0x80;
    TL0 = BAUD;
    TH0 = BAUD>>8;
    TR0 = 1;
    ET0 = 1;
    PT0 = 1;
    EA = 1;
    TING = 0;
    RING = 0;
    TEND = 1;
    REND = 0;
    TCNT = 0;
    RCNT = 0;
}

                 
void SENT(x,y) //x代表第幾個(gè)電壓值,y代表四位電壓值,1243代表12.43V
{
        buf[x*6-6]='0'+y/1000;
        buf[x*6-5]='0'+(y/100)%10;
        buf[x*6-4]='.';
        buf[x*6-3]='0'+(y/10)%10;
        buf[x*6-2]='0'+y%10;
        if (x<5) {buf[x*6-1]=',';}
        else{buf[x*6-1]=';';}      //幾個(gè)電壓值之間用“,”隔開(kāi),末尾用“;”結(jié)束
}


void main()
{     
        u8 f=0;
    u16 e=0;
    UART_INIT();      //初始化串口
        ADC_CONTR = 0xE0; //90T, ADC power on
       

    while (1)
    {
                if (stop==0)
                {
                        ADC(2);                Bandgap = j;//TL431基準(zhǔn)電壓
               
                        ADC(3);                V1 = (u16)((u32)j*758/ Bandgap);
               
                        ADC(4);                V2 = (u16)((u32)j*1546/ Bandgap);
               
                        ADC(5);                V3 = (u16)((u32)j*2317/ Bandgap);
               
                        ADC(6);                V4 = (u16)((u32)j*3297/ Bandgap);
                       
                        ADC(7);                V5 = (u16)((u32)j*4050/ Bandgap);
               
                        V01=V1;
                        if(V2>V1){V02=V2-V1;}else{V02=0;}
                        if(V3>V1){V03=V3-V2;}else{V03=0;}
                        if(V4>V1){V04=V4-V3;}else{V04=0;}
                        if(V5>V1){V05=V5-V4;}else{V05=0;}
                }

               
                SENT(1,V01);SENT(2,V02);SENT(3,V03);SENT(4,V04);SENT(5,V05); //電壓值轉(zhuǎn)換為數(shù)組字符,準(zhǔn)備發(fā)送到串口

                TING = 1;
        TBUF = buf[f++];
        e=6000;
        while(e--);  //延時(shí)
        if (f>29){f=0;}
    }
}

void tm0() interrupt 1 using 1   
{
    if (RING)
    {
        if (--RCNT == 0)
        {
            RCNT = 3;  
            if (--RBIT == 0)
            {
                RBUF = RDAT;
                RING = 0;   
                REND = 1;  
            }
            else
            {
                RDAT >>= 1;
                if (RXB)
                    RDAT |= 0x80;
            }
        }
    }
    else if (!RXB)
    {
        RING = 1;  
        RCNT = 4;  
        RBIT = 9;  
    }
    if (--TCNT == 0)
    {
        TCNT = 3;  
        if (TING)  
        {
            if (TBIT == 0)
            {
                TXB = 0;
                TDAT = TBUF;
                TBIT = 9;
                TEND = 0;  
            }
            else
            {
                TDAT >>= 1;
                if (--TBIT == 0)
                {
                    TXB = 1;
                    TING = 0;  
                    TEND = 1;  
                }
                else
                {
                    TXB = CY;
                }
            }
        }
    }
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表