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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機如何通過串口發送DS18B20數據到電腦并且顯示在晶體管上

[復制鏈接]
跳轉到指定樓層
樓主
ID:964694 發表于 2021-9-7 22:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小白求助,如何通過串口發送DS18B20數據至電腦?
上位機通過C#接收并且處理數據

/*串口初始化,比特率9600*/
void UART_Init()
{
   SM0 = 0;        SM1 = 1;//串口工作方式1,8位UART波特率可變
        TR1 = 1;//啟動定時器1
        TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
        TH1 = 0xfd;
        TL1 = 0xfd;//設置比特率9600
}

void main()
{                 

        uint i;
                uchar L, M;
        UART_Init(); //串口初始化
        TI = 1;//使用printf()puts()前都應軟件置位TI = 1;

        ds_init();//初始化DS18B20
        write_byte(0xcc);//發送跳躍ROM指令
        write_byte(0x44);//發送溫度轉換指令
        Delay_Ms(1000);
          while(1)
        {         
                ds_init();//初始化DS18B20
        write_byte(0xcc);//發送跳躍ROM指令
        write_byte(0x44);//發送溫度轉換指令
        ds_init();//初始化DS18B20
        write_byte(0xcc);//發送跳躍ROM指令
        write_byte(0xbe);//讀取DS18B20暫存器值
               L = read_byte();
                M = read_byte();
                i = M;
                x[0]=M;
                x[1]=L;
                i <<= 8;
                i |= L;                                       
                i = i * 0.625  + 0.5;
                Display(i);         //數碼管顯像
    //此處代碼怎么可以設置定時發送
                  SBUF=M;
                while(TI==0);
                        TI=0;
                SBUF=L;
                while(TI==0);
                        TI=0;               
}  
}

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

使用道具 舉報

沙發
ID:624769 發表于 2021-9-8 00:33 | 只看該作者
你要定時發送, 可以放到定時器中斷中去發, 但是不建議在 定時器中斷中 while(!TI); 畢竟 9600的波特率 發送一個字節還是蠻久的?梢远〞r器發掉一個后,置位 busy, 下次進入后 判斷busy是否清除,如果清除了 就發下一個,沒清除,就先回去,下次再說。   同時開串口 中斷, 如果 TI == 1, 清TI 清busy。 這樣比較好。
回復

使用道具 舉報

板凳
ID:964694 發表于 2021-9-8 00:43 | 只看該作者
188610329 發表于 2021-9-8 00:33
你要定時發送, 可以放到定時器中斷中去發, 但是不建議在 定時器中斷中 while(!TI); 畢竟 9600的波特率 發送 ...

能不能一次發送完這兩個數據啊,因為是DS18B20的數據,需要定時傳到電腦上,思路是怎樣呢,我試了幾種方法,HEX模式下只能發送一個過去,定時發送是用定時器中斷就可以了嘛?
回復

使用道具 舉報

地板
ID:624769 發表于 2021-9-8 01:14 | 只看該作者
clvlxl 發表于 2021-9-8 00:43
能不能一次發送完這兩個數據啊,因為是DS18B20的數據,需要定時傳到電腦上,思路是怎樣呢,我試了幾種方 ...

串口一次只能發送一個字節, 因為SBUF只有一個字節。發完后 TI 置 1 告訴你發送完成。你要連續發,就只能按你寫的那樣來發送。我不知道你的定時發,是什么定義,通?梢宰鲆粋標志比如:Send_Flag
那個你把你的發送代碼,依然留在原地,但是,用這個標志包起來:
if(Send_Flag)
{
                  SBUF=M;
                 while(!TI);
                         TI=0;
                 SBUF=L;
                 while(!TI);
                         TI=0
                Send_Flag = 0;
}

然后定時器中斷隨便你定多少時間,時間到了,就把 Send_Flag = 1;
那么,定時發送的目的就達到了。
回復

使用道具 舉報

5#
ID:748788 發表于 2021-9-8 08:24 | 只看該作者
并且顯示在晶體管上——你這是啥用意?
回復

使用道具 舉報

6#
ID:584195 發表于 2021-9-8 08:37 | 只看該作者
網上有很多示例的。現在比皎流行的是用python寫了,C#。。。
回復

使用道具 舉報

7#
ID:964694 發表于 2021-9-8 10:08 | 只看該作者
wwh2382 發表于 2021-9-8 08:24
并且顯示在晶體管上——你這是啥用意?

使用晶體管顯示出溫度
回復

使用道具 舉報

8#
ID:123289 發表于 2021-9-9 15:09 | 只看該作者
1、學會【51單片機如何通過串口收發據】
2、學會【DS18B20數據采集】
3、至少學會一種【電腦工具軟件,與外設進行串口數據交換,及數據顯示】,如EXCEL、VB、C++、……
4、學會【單片機控制LED顯示】
這樣就可以達成目的了。
回復

使用道具 舉報

9#
ID:401564 發表于 2021-9-9 18:04 | 只看該作者
是我對晶體管有什么誤解嗎?還是叫法不一樣,我覺得晶體管不應該是8050之類的三極管嗎?
8051一次只能發送一個字節
好像串口協議就是只發送一個字節而已的呀,多出來的位都是什么停止位,校驗位之類的
硬件不同的,只有緩沖器大小不同而已的吧
回復

使用道具 舉報

10#
ID:213173 發表于 2021-9-10 07:05 | 只看該作者
clvlxl 發表于 2021-9-8 00:43
能不能一次發送完這兩個數據啊,因為是DS18B20的數據,需要定時傳到電腦上,思路是怎樣呢,我試了幾種方 ...

/*串口初始化,比特率9600*/
void UART_Init()
{
        SM0 = 0;
        SM1 = 1;//串口工作方式1,8位UART波特率可變
        TR1 = 1;//啟動定時器1
        TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
        TH1 = 0xfd;
        TL1 = 0xfd;//設置比特率9600
}
void Timer0Init()                //50毫秒@11.0592MHz
{
        TMOD &= 0xf0;                //設置定時器模式
        TMOD |= 0x01;                //設置定時器模式
        TL0 = 0x00;                //設置定時初值
        TH0 = 0x4C;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
}

void main()
{                 
        uint i,j;
        uchar L, M;
        UART_Init(); //串口初始化
        TI = 1;//使用printf()puts()前都應軟件置位TI = 1;       
        ds_init();//初始化DS18B20
        write_byte(0xcc);//發送跳躍ROM指令
        write_byte(0x44);//發送溫度轉換指令
        Delay_Ms(1000);
        Timer0Init(); //定時器初始化
        while(1)
        {         
                ds_init();//初始化DS18B20
                write_byte(0xcc);//發送跳躍ROM指令
                write_byte(0x44);//發送溫度轉換指令
                ds_init();//初始化DS18B20
                write_byte(0xcc);//發送跳躍ROM指令
                write_byte(0xbe);//讀取DS18B20暫存器值
                L = read_byte();
                M = read_byte();
                i = M;
                x[0]=M;
                x[1]=L;
                i <<= 8;
                i |= L;
                i = i * 0.625  + 0.5;
                Display(i);         //數碼管顯像
                if(TF0)
                {
                        TF0 = 0;
                        j++;
                        if(j>=600)//30秒定時發送
                        {
                                j=0;
                                SBUF=(M<<4)|(L>>4);//保留整數,舍棄小數。
                                while(!TI);
                                TI=0;  
                        }
                }
        }  
}
回復

使用道具 舉報

11#
ID:964694 發表于 2021-9-12 09:46 | 只看該作者
wulin 發表于 2021-9-10 07:05
/*串口初始化,比特率9600*/
void UART_Init()
{

感謝回復
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久精品 | 不用播放器看的av | 秋霞国产 | 一级全黄少妇性色生活免费看 | 国产二区视频 | 精品国产乱码久久久久久影片 | 国产在视频一区二区三区吞精 | 天天操天天舔 | 久久久91 | 国产日屁 | 久久精品免费 | 欧美成年网站 | 伊人二区| 中文字幕乱码一区二区三区 | av喷水 | 国产高清在线观看 | 亚洲www啪成人一区二区 | 国产永久免费 | 美女福利视频一区 | 一区二区三区四区国产 | 性高湖久久久久久久久aaaaa | 亚洲精精品 | 精品一区av | 国产免费一级片 | 伊人天堂网 | 欧美成人一区二区三区 | 欧美三级在线 | 国产精品久久国产精品久久 | 成人欧美一区二区三区在线观看 | av片毛片 | 国产成人精品999在线观看 | 国产情侣一区 | 免费中文字幕日韩欧美 | 欧美激情精品久久久久 | 欧洲妇女成人淫片aaa视频 | 中文字幕97 | av网站免费观看 | 一区二区三区四区不卡 | 日韩一区二区三区四区五区 | 国产小视频精品 | 精品国产乱码久久久久久丨区2区 |