欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1933|回復: 6
收起左側

單片機串口程序,不清楚為什么出錯

[復制鏈接]
ID:1096616 發表于 2023-10-28 17:00 | 顯示全部樓層 |閱讀模式
這也是一次單片機練習,我是根據課上講的仿照寫的,但是出錯了,不清楚出錯點,請各位大佬給指點指點。

要求:計算機發送數據0x00~0x0F,一次發送一個數據,單片機接收后在1位共陽數碼管上顯示,并返回計算機一個信息,例如接收到0x00,返回一個0x80,接收0x01,返回0x81

單片機源程序如下:
#include<reg52.h>
#define uchar unsigned char//宏定義非整型字符
#define uint unsigned int//宏定義整型字符
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數碼管0~16段碼
uchar code sendbuf[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
0x8A,0x8B,0x8C,0x8D,0X8E,0X8F};//單片機返回數字
uchar dat;
void delay(uint a);
void uart();
void send(uchar byte);
/****主函數*****/
void main()
{   uart();
   while(1);
}
/*****串口方式初始化*******/
void uart()
{  SCON=0x50;//串口方式一,允許接收
    PCON=0x80; //波特率加倍
    TMOD=0x20; //T1定時方式2
    TH1=0xf3;
    TL1=0xf3;//4800b/s
    TR1=1;
    ES=1;
    EA=1;
}
/******中斷服務函數*****/
void rf()interrupt 4
{      RI=0;
       dat=SBUF;
       switch(dat)
       {case 0x00: SBUF=sendbuf[0]; P2=seg[0];break;
       case 0x01: SBUF=sendbuf[1]; P2=seg[1];break;
       default:break;
       }
        
}
回復

使用道具 舉報

ID:883242 發表于 2023-10-28 18:44 | 顯示全部樓層
哪里出錯了?是編譯失敗,還是執行錯誤,你不講清楚是不行的。
回復

使用道具 舉報

ID:1096616 發表于 2023-10-28 18:56 | 顯示全部樓層
Hephaestus 發表于 2023-10-28 18:44
哪里出錯了?是編譯失敗,還是執行錯誤,你不講清楚是不行的。

抱歉,是我沒有形容準確,是沒有反饋,這個目的是希望輸出00,然后就返回80,接著數碼管燈亮,但現在在串口調試助手發送00,沒有返回值80,數碼管也不亮。
屏幕截圖 2023-10-28 185553.png
回復

使用道具 舉報

ID:213173 發表于 2023-10-28 21:19 | 顯示全部樓層
  1. #include<reg52.h>
  2. #define uchar unsigned char//宏定義非整型字符
  3. #define uint unsigned int//宏定義整型字符
  4. uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數碼管0~16段碼
  5. uchar code sendbuf[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
  6. 0x8A,0x8B,0x8C,0x8D,0X8E,0X8F};//單片機返回數字
  7. uchar dat;
  8. bit busy;
  9. bit flag;
  10. //void delay(uint a);
  11. void uart();
  12. void send(uchar byte);

  13. /****主函數*****/
  14. void main()
  15. {
  16.         uart();
  17.         while(1)
  18.         {
  19.                 if(flag)
  20.                 {
  21.                         flag=0;
  22.                         switch(dat)
  23.                         {
  24.                                 case 0x00: P2=seg[0]; break;
  25.                                 case 0x01: P2=seg[1]; break;
  26.                                 default:break;
  27.                         }
  28.                         while(busy);
  29.                         busy = 1;
  30.                         SBUF = sendbuf[dat];
  31.                 }
  32.         }
  33. }
  34. /*****串口方式初始化*******/
  35. void uart()
  36. {
  37.         SCON=0x50;//串口方式一,允許接收
  38.         PCON=0x80; //波特率加倍
  39.         TMOD=0x20; //T1定時方式2
  40.         TH1=0xf3;
  41.         TL1=0xf3;//4800b/s
  42.         TR1=1;
  43.         ES=1;
  44.         EA=1;
  45. }
  46. /******中斷服務函數*****/
  47. void rf()interrupt 4
  48. {
  49.         if (TI)
  50.         {
  51.                 TI = 0;
  52.                 busy = 0;
  53.         }
  54.         if (RI)
  55.         {
  56.                 RI = 0;
  57.                 dat = SBUF;
  58.                 flag=1;
  59.         }
  60. }
復制代碼
回復

使用道具 舉報

ID:1096616 發表于 2023-10-29 08:36 | 顯示全部樓層

我剛剛嘗試了你的方法,雖然是有返回值,但是返回值不對,而且數碼管也沒有亮起來。
屏幕截圖 2023-10-29 083402.png
屏幕截圖 2023-10-29 083425.png
回復

使用道具 舉報

ID:213173 發表于 2023-10-29 10:52 | 顯示全部樓層
深層次 發表于 2023-10-29 08:36
我剛剛嘗試了你的方法,雖然是有返回值,但是返回值不對,而且數碼管也沒有亮起來。

無標題.jpg
回復

使用道具 舉報

ID:1096616 發表于 2023-10-29 16:34 | 顯示全部樓層

我明白我的錯誤在哪里了,在串口調試助手處我應該選擇16進制發送的,這樣子就可以得到正確的返回值,謝謝大佬
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表