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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機發送數據給電腦但有些數據沒有被再次發送

[復制鏈接]
回帖獎勵 8 黑幣 回復本帖可獲得 2 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:803014 發表于 2020-12-29 15:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用單片機的ADC測量電壓將測得值發送給電腦,00為標志,收到的數據理應是電壓高8位,電壓低8位,00,然后電壓高8位電壓低8位,00;這樣循環,但實際收到的數據是電壓高8位電壓低8位,00;電壓低8位00;電壓低8位00;之后循環,再也沒收到電壓高8位;有沒有大佬幫忙看看程序哪里出了問題。
**********************************************************************
void ADC0_ISR (void) interrupt 10
{
   static unsigned long accumulator = 0;     // accumulator for averaging
   static unsigned int measurements = 2048;  // measurement counter
//static unsigned int measurements = 4095;
   unsigned long result=0;
  // unsigned long mV;                         // measured voltage in mV
unsigned long mVH;
static unsigned int  RH;
   AD0INT = 0;                               // clear ADC0 conv. complete flag
   accumulator += ADC0;
   measurements--;
   if(measurements == 0)
   {
      measurements = 2048;
      result = accumulator / 2048;
      accumulator=0;
      // The 10-bit ADC value is averaged across 2048 measurements.
      // The measured voltage applied to P1.4 is then:
      //
      //                           Vref (mV)
      //   measurement (mV) =   --------------- * result (bits)
      //                       (2^12)-1 (bits)
   //   mV =  result * 2200 / 4095;
   mV =  result * 2200 / 4095;
   mVH=(mV>>8);
//      printf("P1.1 voltage: %ld mV\n",mV);
   RI0=0;
   TI0=0;
   if(unsend)
   
   {
    unsend=0;//低8位發送完成標志清0
    SBUF0=0;//發送數據0
   }
  _nop_();
   send=1;//高8位發送完成標識置1
   SBUF0=mVH;//發送高8位
       n=~n;//指示燈閃爍(后續為了驗證上面一句語句有沒有走到加上的)
   }
}
void UART0_Interrupt (void) interrupt 4
{
  Delay_ms (2);

if (TI0==!0)
{ if(send)
{
  send=0;//高8位發送完成標識清0
  unsend=1;//低8位發送完成標識置1
  SBUF0=mV;//發送低8位

  
}
TI0=0;
}
else if(RI0==!0)
{

RI0=0;
}
}
******************************************************
程序開始跑后指示燈是有閃爍的,但是電腦串口接收到的數據如上面所描述,沒有高8位
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:824490 發表于 2020-12-30 11:12 | 只看該作者
if (TI0==!0)這樣也可以嗎?TI0==0 或TI0!=0,一般我都 是這么寫判斷的。
回復

使用道具 舉報

板凳
ID:390416 發表于 2020-12-30 11:42 | 只看該作者
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度:  遙控解碼:  超聲波:mm"};
u8 xdata Uart1_Up_Num_Buffer[10];
void Uart1_Init()
{
        SM0=0;
        SM1=1;
        REN=1;
        //SCON|=0x50;
        
        PCON&=0x3f;
        AUXR|=0x01;
        AUXR|=0X14;
        T2H=0xfc;
        T2L=0xf3;
        ES=1;
}


void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)
        {
                Uart1_Flag=0;
                count++;
                switch(count)
                {
                        case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break;
                        case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break;
                        case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break;
                        case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break;
                        case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break;
                        case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break;
                        case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break;
                        case 8 : SBUF=Uart1_Up_Num_Buffer[0];break;
                        case 9 : SBUF=Uart1_Up_Num_Buffer[1];break;
                        case 10 :SBUF=Uart1_Up_Num_Buffer[2];break;
                        case 11 :SBUF=Uart1_Up_Num_Buffer[3];break;
                        
                        case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break;
                        case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break;
                        case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break;
                        case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break;
                        case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break;
                        case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break;
                        case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break;
                        case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break;
                        case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break;
                        case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break;
                        case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break;
                        case 23 : SBUF=Uart1_Up_Num_Buffer[5];break;
                        case 24 : SBUF=Uart1_Up_Num_Buffer[6];break;
                        
                        case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;
                        case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break;
                        case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break;
                        case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break;
                        case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break;
                        case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break;
                        case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break;
                        case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break;
                        case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break;
                        case 34 : SBUF=Uart1_Up_Num_Buffer[7];break;
                        case 35 : SBUF=Uart1_Up_Num_Buffer[8];break;
                        case 36 : SBUF=Uart1_Up_Num_Buffer[9];break;
                        case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;
                        case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break;
                        case 39 :count=0;break;
                }
        }
}

void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;
        if(RI)
        {
                RI=0;
                Uart1_Flag=1;
                if(SBUF==0x7f)//9600波特率
                {
                        Uart1_ser_n++;
                        if(Uart1_ser_n>=10)
                        {
                                Uart1_ser_n=0;
                                IAP_CONTR|=0xe0;
                        }
                }
        }
        if(TI)
        {
                TI=0;
                Uart1_Flag=1;
                Uart1_Up_Data_Drive();
        }
}

一、以上代碼是STC15W的,可能需要修改定時器參數。
二、主函數while大循環前面初始化IO口和Uart1_Init();
三、主函數每間隔大約500ms 執行一次Uart1_Up_Data_Drive();這個函數,確保數據能夠發送。
四、串口通信,電腦發送一個字節。才能讓單片機發送。
五、接收端波特率要正確,文本模式接收才能顯示漢字。
六、以上代碼由《人人學會單片機》視頻教程原創,也就是我本人原創,引用請備注代碼出處。
回復

使用道具 舉報

地板
ID:803014 發表于 2020-12-30 15:30 | 只看該作者
名字不是重點 發表于 2020-12-30 11:12
if (TI0==!0)這樣也可以嗎?TI0==0 或TI0!=0,一般我都 是這么寫判斷的。

這個判斷應該是沒有問題的,因為能做到數據傳輸,如果判斷語句不起作用那么低8位不會傳輸,但實際結果是高8位自第一次傳輸后再也沒有傳輸,低8位正常輸出。
回復

使用道具 舉報

5#
ID:803014 發表于 2020-12-30 15:31 | 只看該作者
人人學會單片機 發表于 2020-12-30 11:42
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度:  遙控解碼:  超聲 ...

謝謝回復,用case語句來選擇好像是個好辦法,我試一下
回復

使用道具 舉報

6#
ID:803014 發表于 2020-12-30 15:52 | 只看該作者
人人學會單片機 發表于 2020-12-30 11:42
#include "all.h"
bit Uart1_Flag=1;
u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度:  遙控解碼:  超聲 ...

雖然還是不知道為什么之前那個出問題,但是現在換成case語句后解決了我的問題,而且感覺按順序輸出多少數據都不是問題。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕在线观看 | 亚洲视频免费观看 | 天天操夜夜拍 | 欧美jizzhd精品欧美巨大免费 | 国产91综合一区在线观看 | 九九热精品视频 | 免费在线观看一区二区三区 | 久久三区 | 妖精视频一区二区三区 | 激情一区 | 亚洲精选久久 | 久久综合av | 欧美视频在线播放 | 欧美精品综合在线 | 国产精品久久免费观看 | 韩日在线 | 免费看黄视频网站 | 亚洲精品在线看 | 天天爽夜夜爽精品视频婷婷 | 亚洲精品欧美 | 国产精品视频999 | 欧美极品在线视频 | 国产精品一区在线观看 | 国产视频一区二区 | 国产精品一区二区三区久久久 | 国产欧美一区二区三区在线播放 | 久久久久久www | 欧美一区二区三区的 | 日韩精品一区二 | 亚洲精品电影 | 在线观看国产wwwa级羞羞视频 | 久久久久国产精品一区二区 | 在线精品国产 | 欧美一级欧美一级在线播放 | 成人在线精品 | av大片在线 | 国产在线麻豆精品入口 | 久久久久午夜 | 国产精品免费一区二区三区四区 | 天天操天天摸天天干 | 久久久久久久久久影视 |