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

標題: 關于STC8G單片機串口1發送數據不全的問題 [打印本頁]

作者: 戡拤    時間: 2023-8-30 09:40
標題: 關于STC8G單片機串口1發送數據不全的問題
①我用的是STC8G1K08單片機;
②目的:按下并松開按鍵(完成一次完整的按鍵動作)后,向電腦屏幕發送準備好的數組;
③數組:0x01~07 和 0x07~01 兩個數組
④出現的問題:發送的數據不全,屏幕顯示 01 06 05 04 03 02 01 ,測試數組1只有01顯示 后面都沒了;
請問一下大家這是啥問題呀?
單片機源程序如下:
  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. //測試數組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. //測試數組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準雙向口
  41.         P3M1 = 0x00;                //P3準雙向口
  42. }

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

  56. //串口1初始化函數
  57. void Uart1_Init(void)                //57600bps@6.000MHz
  58. {
  59.         SCON = 0x50;                        //8位數據,可變波特率
  60.         AUXR |= 0x40;                        //定時器1時鐘為Fosc,即1T
  61.         AUXR &= 0xFE;                        //串口1選擇定時器1為波特率發生器
  62.         TMOD &= 0x0F;                        //設定定時器1為16位自動重裝方式
  63.         TL1 = 0xE6;                                //設定定時初值
  64.         TH1 = 0xFF;                                //設定定時初值
  65.         ET1 = 0;                                //禁止定時器1中斷
  66.         TR1 = 1;                                //啟動定時器1
  67.         
  68.         ES = 1;
  69.         PS = 0;                                       
  70. }
  71. //串口發送程序
  72. void S1OUT(void)
  73. {
  74.         if(F_T1_OK==0)                        //串口1中斷空閑
  75.         {
  76.                 F_T1_OK = 1;                //串口1處于中斷中
  77.                 SBUF = T1BUF[0];        //進入串口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;                        //按鍵處于按下狀態
  93.                 }
  94.                 else if(keybuf==0xFF)
  95.                 {
  96.                         Key_Sta = 1;                        //按鍵處于松開狀態
  97.                 }
  98.         }
  99. }

  100. //按鍵處理內容
  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;                        //備份按鍵狀態
  115. }

  116. //定時器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)                //數組逐一賦值結束
  141.                         {
  142.                                 T1_Count = 0;
  143.                                 F_T1_OK = 0;                        //串口1中斷 完成發送
  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. }
復制代碼

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

數組不全

數組不全

作者: 戡拤    時間: 2023-8-30 11:48
我想要的效果是按下按鍵后,顯示屏顯示:01 02 03 04 05 06 07 07 06 05 04 03 02 01 ,但是現實效果卻是01 06 05 04 03 02 01,而且開頭的01還是測試數組1的 0x01,不知道哪里出錯了。。。
作者: yzwzfyz    時間: 2023-8-30 13:48
邏輯時序混亂。
作者: Hephaestus    時間: 2023-8-30 14:30
問題出在118~121行,119行只發送了一個字節就進入下一行了。
作者: 戡拤    時間: 2023-8-30 14:46
Hephaestus 發表于 2023-8-30 14:30
問題出在118~121行,119行只發送了一個字節就進入下一行了。

我的理解是S1OUT( );中,F_T1_OK=1,之后進入串口1發送中斷,直到將測試數組1全部發完,如果不是這樣考慮的話,請問該往哪個方向想?
作者: lkc8210    時間: 2023-8-30 16:13
  1. //串口發送程序
  2. void S1OUT(void)
  3. {
  4.         if(F_T1_OK==0)                        //串口1中斷空閑
  5.         {
  6.                 F_T1_OK = 1;                //串口1處于中斷中
  7.                 SBUF = T1BUF[0];        //進入串口1中斷
  8.         }
  9.                 while(F_T1_OK);
  10. }
復制代碼



作者: 戡拤    時間: 2023-8-30 16:44
lkc8210 發表于 2023-8-30 16:13

謝謝,這行while語句直接救命!我是這樣理解這段代碼的,SBUF = T1BUF[0]這行代碼就是開啟串口1發送中斷-->TI = 1,既然進入了串口中斷,不應該是把剩下的0x2-6逐一賦值給SBUF嗎?可是現實執行效果是直接跳出了中斷,執行了第二個S1OUT( ),請問可以告訴我哪里考慮有誤嗎?還有while(F_T1_OK)沒有語句塊,為啥可以跳出循環呀,可以解釋一下嗎嗎?
作者: lkc8210    時間: 2023-8-30 16:58
戡拤 發表于 2023-8-30 16:44
謝謝,這行while語句直接救命!我是這樣理解這段代碼的,SBUF = T1BUF[0]這行代碼就是開啟串口1發送中斷- ...

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

while(F_T1_OK)沒有語句塊,但中斷里154行有
作者: 戡拤    時間: 2023-8-30 17:22
lkc8210 發表于 2023-8-30 16:58
SBUF = T1BUF[0]這行代碼只是開始發送
離發送完畢,開啟串口1發送中斷-->TI = 1 還有一段時間
于是就繼 ...

竟然還有這中情況嗎?給SBUF賦值完8位數據后,TI并不會馬上置1是嗎?while(F_T1_OK)就是限制程序將Ce_Arry1( );全部賦值給SBUF后,才執行Ce_Arry2( );嗎?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品欧美一区二区三区不卡 | 精品欧美乱码久久久久久 | 国产亚洲欧美另类一区二区三区 | 黄色在线观看国产 | 欧美一级做性受免费大片免费 | 亚洲国产成人精品久久久国产成人一区 | 一级毛片视频 | 宅女噜噜66国产精品观看免费 | 在线欧美视频 | 成人免费视频一区 | 乳色吐息在线观看 | 色吧综合网 | 日韩在线观看网站 | 国产福利免费视频 | 一区二区三区福利视频 | 国产ts人妖系列高潮 | 一区二区三区影院 | 亚洲高清一区二区三区 | 国产成人一区二区三区久久久 | 夜夜爽99久久国产综合精品女不卡 | 国产亚洲欧美在线视频 | 欧美女优在线观看 | 午夜爽爽爽男女免费观看影院 | 日韩欧美在线视频 | a级片在线观看 | 91精品久久久久久久久久入口 | 国产精品久久久久久婷婷天堂 | 爱爱免费视频 | jlzzjlzz国产精品久久 | 久久久日韩精品一区二区三区 | 亚洲黄色一区二区三区 | www.国产.com| 欧美视频三级 | 天天射天天干 | 欧美日韩在线观看视频网站 | 国产婷婷综合 | 一级黄色片在线免费观看 | 久久综合色综合 | 成人高清在线 | 亚洲免费在线观看 | 久久国产精品精品国产色婷婷 |