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

QQ登錄

只需一步,快速開始

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

關(guān)于STC8G單片機(jī)串口1發(fā)送數(shù)據(jù)不全的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
①我用的是STC8G1K08單片機(jī);
②目的:按下并松開按鍵(完成一次完整的按鍵動(dòng)作)后,向電腦屏幕發(fā)送準(zhǔn)備好的數(shù)組;
③數(shù)組:0x01~07 和 0x07~01 兩個(gè)數(shù)組
④出現(xiàn)的問題:發(fā)送的數(shù)據(jù)不全,屏幕顯示 01 06 05 04 03 02 01 ,測(cè)試數(shù)組1只有01顯示 后面都沒了;
請(qǐng)問一下大家這是啥問題呀?
單片機(jī)源程序如下:
  1. #include "STC8G.H"
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. u8 T1_Count;
  6. u8 xdata T1BUF[6];

  7. bit F_T1_OK;
  8. bit Key_Sta = 1;
  9. bit Key_Backup = 1;
  10. bit F_t1ms;

  11. sbit Light = P1^6;
  12. sbit Key_G = P3^4;                //G


  13. //測(cè)試數(shù)組1
  14. void Ce_Arry1(void)
  15. {
  16.         T1BUF[0] = 0x01;
  17.         T1BUF[1] = 0x02;
  18.         T1BUF[2] = 0x03;
  19.         T1BUF[3] = 0x04;
  20.         T1BUF[4] = 0x05;
  21.         T1BUF[5] = 0x06;
  22.         T1BUF[6] = 0x07;
  23. }
  24. //測(cè)試數(shù)組2
  25. void Ce_Arry2(void)
  26. {
  27.         T1BUF[0] = 0x07;
  28.         T1BUF[1] = 0x06;
  29.         T1BUF[2] = 0x05;
  30.         T1BUF[3] = 0x04;
  31.         T1BUF[4] = 0x03;
  32.         T1BUF[5] = 0x02;
  33.         T1BUF[6] = 0x01;
  34. }
  35. //IO口初始化
  36. void IO_Init(void)
  37. {
  38.         P1M0 |= 0x40;
  39.         P1M1 = 0;
  40.         P3M0 = 0x00;                //P3準(zhǔn)雙向口
  41.         P3M1 = 0x00;                //P3準(zhǔn)雙向口
  42. }

  43. //定時(shí)器0初始化函數(shù)
  44. void Timer0_Init(void)                //500微秒@6.000MHz
  45. {
  46.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  47.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  48.         TL0 = 0x48;                //設(shè)置定時(shí)初值
  49.         TH0 = 0xF4;                //設(shè)置定時(shí)初值
  50.         TF0 = 0;                //清除TF0標(biāo)志
  51.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  52.         
  53.         ET0 = 1;
  54.         PT0 = 0;
  55. }

  56. //串口1初始化函數(shù)
  57. void Uart1_Init(void)                //57600bps@6.000MHz
  58. {
  59.         SCON = 0x50;                        //8位數(shù)據(jù),可變波特率
  60.         AUXR |= 0x40;                        //定時(shí)器1時(shí)鐘為Fosc,即1T
  61.         AUXR &= 0xFE;                        //串口1選擇定時(shí)器1為波特率發(fā)生器
  62.         TMOD &= 0x0F;                        //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
  63.         TL1 = 0xE6;                                //設(shè)定定時(shí)初值
  64.         TH1 = 0xFF;                                //設(shè)定定時(shí)初值
  65.         ET1 = 0;                                //禁止定時(shí)器1中斷
  66.         TR1 = 1;                                //啟動(dòng)定時(shí)器1
  67.         
  68.         ES = 1;
  69.         PS = 0;                                       
  70. }
  71. //串口發(fā)送程序
  72. void S1OUT(void)
  73. {
  74.         if(F_T1_OK==0)                        //串口1中斷空閑
  75.         {
  76.                 F_T1_OK = 1;                //串口1處于中斷中
  77.                 SBUF = T1BUF[0];        //進(jìn)入串口1中斷
  78.         }
  79. }
  80. //按鍵消抖
  81. void Key_Con(void)
  82. {
  83.         static u8 keybuf = 0xFF;
  84.         
  85.         if(F_t1ms==1)                                        //每1ms掃描一次鍵盤
  86.         {
  87.                 F_t1ms = 0;
  88.                
  89.                 keybuf = keybuf<<1 | Key_G; //8ms消抖
  90.                 if(keybuf==0x00)
  91.                 {
  92.                         Key_Sta = 0;                        //按鍵處于按下狀態(tài)
  93.                 }
  94.                 else if(keybuf==0xFF)
  95.                 {
  96.                         Key_Sta = 1;                        //按鍵處于松開狀態(tài)
  97.                 }
  98.         }
  99. }

  100. //按鍵處理內(nèi)容
  101. void Key_CL(void)
  102. {

  103.         if(Key_Sta != Key_Backup)                //
  104.         {
  105.                 if(Key_Backup==0)                        //按鍵完成 按下——松開
  106.                 {
  107.                         Light = ~Light;
  108.                         Ce_Arry1();                           //1-7
  109.                         S1OUT();
  110.                         Ce_Arry2();                                //7-1
  111.                         S1OUT();
  112.                 }
  113.         }
  114.         Key_Backup = Key_Sta;                        //備份按鍵狀態(tài)
  115. }

  116. //定時(shí)器0中斷
  117. void Timer0_Routine(void) interrupt 1
  118. {
  119.         static t_1ms;
  120.         
  121.         if(++t_1ms>=2)
  122.         {
  123.                 t_1ms = 0;
  124.                 F_t1ms = 1;                //1ms置位1次
  125.         }        
  126. }
  127. //串口1中斷
  128. void Uart1_Routine(void) interrupt 4
  129. {
  130.         if(TI==1)
  131.         {
  132.                 TI = 0;
  133.                 if(F_T1_OK==1)
  134.                 {
  135.                         T1_Count++;
  136.                         if(T1_Count<=6)
  137.                         {
  138.                                 SBUF = T1BUF[T1_Count];
  139.                         }
  140.                         else if(T1_Count>6)                //數(shù)組逐一賦值結(jié)束
  141.                         {
  142.                                 T1_Count = 0;
  143.                                 F_T1_OK = 0;                        //串口1中斷 完成發(fā)送
  144.                         }
  145.                 }        
  146.         }
  147. }

  148. //主程序
  149. void main(void)
  150. {
  151.         EA = 1;
  152.         IO_Init();
  153.         Timer0_Init();
  154.         Uart1_Init();
  155.         Light = 0;
  156.         while(1)
  157.         {
  158.                 Key_Con();
  159.                 Key_CL();
  160.         }
  161. }
復(fù)制代碼

0.png (5.08 KB, 下載次數(shù): 58)

數(shù)組不全

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

使用道具 舉報(bào)

9#
ID:861694 發(fā)表于 2023-8-30 17:22 | 只看該作者
lkc8210 發(fā)表于 2023-8-30 16:58
SBUF = T1BUF[0]這行代碼只是開始發(fā)送
離發(fā)送完畢,開啟串口1發(fā)送中斷-->TI = 1 還有一段時(shí)間
于是就繼 ...

竟然還有這中情況嗎?給SBUF賦值完8位數(shù)據(jù)后,TI并不會(huì)馬上置1是嗎?while(F_T1_OK)就是限制程序?qū)e_Arry1( );全部賦值給SBUF后,才執(zhí)行Ce_Arry2( );嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:161164 發(fā)表于 2023-8-30 16:58 | 只看該作者
戡拤 發(fā)表于 2023-8-30 16:44
謝謝,這行while語句直接救命!我是這樣理解這段代碼的,SBUF = T1BUF[0]這行代碼就是開啟串口1發(fā)送中斷- ...

SBUF = T1BUF[0]這行代碼只是開始發(fā)送
離發(fā)送完畢,開啟串口1發(fā)送中斷-->TI = 1 還有一段時(shí)間
于是就繼續(xù)往下運(yùn)行Ce_Arry2();

while(F_T1_OK)沒有語句塊,但中斷里154行有

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
戡拤 + 15 感謝解答!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:861694 發(fā)表于 2023-8-30 16:44 | 只看該作者

謝謝,這行while語句直接救命!我是這樣理解這段代碼的,SBUF = T1BUF[0]這行代碼就是開啟串口1發(fā)送中斷-->TI = 1,既然進(jìn)入了串口中斷,不應(yīng)該是把剩下的0x2-6逐一賦值給SBUF嗎?可是現(xiàn)實(shí)執(zhí)行效果是直接跳出了中斷,執(zhí)行了第二個(gè)S1OUT( ),請(qǐng)問可以告訴我哪里考慮有誤嗎?還有while(F_T1_OK)沒有語句塊,為啥可以跳出循環(huán)呀,可以解釋一下嗎嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:161164 發(fā)表于 2023-8-30 16:13 | 只看該作者
  1. //串口發(fā)送程序
  2. void S1OUT(void)
  3. {
  4.         if(F_T1_OK==0)                        //串口1中斷空閑
  5.         {
  6.                 F_T1_OK = 1;                //串口1處于中斷中
  7.                 SBUF = T1BUF[0];        //進(jìn)入串口1中斷
  8.         }
  9.                 while(F_T1_OK);
  10. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
戡拤 + 15 萬分感謝!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:861694 發(fā)表于 2023-8-30 14:46 | 只看該作者
Hephaestus 發(fā)表于 2023-8-30 14:30
問題出在118~121行,119行只發(fā)送了一個(gè)字節(jié)就進(jìn)入下一行了。

我的理解是S1OUT( );中,F(xiàn)_T1_OK=1,之后進(jìn)入串口1發(fā)送中斷,直到將測(cè)試數(shù)組1全部發(fā)完,如果不是這樣考慮的話,請(qǐng)問該往哪個(gè)方向想?
回復(fù)

使用道具 舉報(bào)

地板
ID:883242 發(fā)表于 2023-8-30 14:30 | 只看該作者
問題出在118~121行,119行只發(fā)送了一個(gè)字節(jié)就進(jìn)入下一行了。

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
戡拤 + 10 的確是此函數(shù)有問題

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2023-8-30 13:48 | 只看該作者
邏輯時(shí)序混亂。
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:861694 發(fā)表于 2023-8-30 11:48 | 只看該作者
我想要的效果是按下按鍵后,顯示屏顯示:01 02 03 04 05 06 07 07 06 05 04 03 02 01 ,但是現(xiàn)實(shí)效果卻是01 06 05 04 03 02 01,而且開頭的01還是測(cè)試數(shù)組1的 0x01,不知道哪里出錯(cuò)了。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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