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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于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)

數組不全

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

使用道具 舉報

沙發
ID:861694 發表于 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,不知道哪里出錯了。。。
回復

使用道具 舉報

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

使用道具 舉報

地板
ID:883242 發表于 2023-8-30 14:30 | 只看該作者
問題出在118~121行,119行只發送了一個字節就進入下一行了。

評分

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

查看全部評分

回復

使用道具 舉報

5#
ID:861694 發表于 2023-8-30 14:46 | 只看該作者
Hephaestus 發表于 2023-8-30 14:30
問題出在118~121行,119行只發送了一個字節就進入下一行了。

我的理解是S1OUT( );中,F_T1_OK=1,之后進入串口1發送中斷,直到將測試數組1全部發完,如果不是這樣考慮的話,請問該往哪個方向想?
回復

使用道具 舉報

6#
ID:161164 發表于 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. }
復制代碼


評分

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

查看全部評分

回復

使用道具 舉報

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

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

使用道具 舉報

8#
ID:161164 發表于 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行有

評分

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

查看全部評分

回復

使用道具 舉報

9#
ID:861694 發表于 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( );嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片一区 | 久久久久久网 | 久久久www成人免费无遮挡大片 | 91大神xh98xh系列全部 | 亚洲国产片 | 亚洲最大福利网 | 久久国产精品一区二区三区 | 毛片一区 | 中文字幕免费 | 一区二区在线免费观看 | 四虎伊人| 日本中文在线 | 黄色网址免费在线观看 | 欧美日韩亚洲视频 | 久久精品国产免费一区二区三区 | 亚洲 成人 av | 综合久 | 国产视频一区在线 | 久久精品黄色 | 国产精品自在线 | 国产欧美综合在线 | 精品国产一区二区国模嫣然 | 久久成人国产 | 日韩国产精品一区二区三区 | 午夜www | 99久久国产免费 | 精品国产成人 | 国产高清免费在线 | 亚洲成人av在线播放 | 精品亚洲一区二区三区 | 羞羞色视频| 日韩中文字幕视频 | 免费午夜剧场 | 久久久久久久久久爱 | 免费三级av | 国产小u女发育末成年 | 亚洲国产成人在线 | 久久日韩粉嫩一区二区三区 | 91在线一区二区三区 | 永久看片| 免费黄网站在线观看 |