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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于stc8g單片機里面定時器中斷和串口中斷輸出的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1147156 發表于 2025-4-13 10:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
代碼如下  我是想1us 定時器0中斷一次  計數20000次時 定時器中斷函數里  串口1輸出數據  但是監控串口 沒有輸出   我也加了優先級 串口優先2  定時器0優先1
只有主循環里才能輸出  具體看不出時序對不對  

請大佬看看哪里有問題
難道是中斷里面不支持再次中斷
  1. #include <STC8G.h>
  2. #include <intrins.h>
  3. #include <stdio.h>

  4. typedef     unsigned char   u8;
  5. typedef     unsigned int    u16;
  6. typedef     unsigned long   u32;

  7. #define     Baudrate1           115200L
  8. #define     UART1_BUF_LENGTH    32


  9. u8  TX1_Cnt;    //發送計數
  10. u8  RX1_Cnt;    //接收計數
  11. bit B_TX1_Busy; //發送忙標志

  12. u8  idata RX1_Buffer[UART1_BUF_LENGTH]; //接收緩沖


  13. void    PrintString1(u8 *puts);
  14. void    PrintChar(u8 dat);




  15. #define                SYSCLK                        24000000
  16. #define                BAUD                                115200                                //22.1184M下,99.2-115.2均可驅動舵機。
  17. #define         BRT (65536 - SYSCLK / BAUD / 4)                 

  18. //端口定義
  19. sbit        CH1in        = P3^2;
  20. sbit        CH2in        = P3^3;
  21. sbit        CH3in        = P5^4;
  22. sbit        CH4in        = P5^5;

  23. //常量定義

  24. unsigned char S_data1[] = {0x00,0xFF,0xFA,0x05,0x03,0x1A,0x00,0x02,0xD9};

  25. unsigned char S_data2[] = {0x01,0xFF,0xFB,0x05,0x03,0x04,0x00,0x00,0xDB};

  26.         

  27. u16 Scount=0;
  28. u8 k;

  29. void TM0_Isr() interrupt 1    //定時器0中斷函數
  30. {
  31.         
  32.         Scount++;
  33.         
  34.         if(Scount==20000){                //20ms  串口輸出一次
  35.                
  36.                 PrintString1(S_data1);
  37.                 Scount=0;
  38.         }
  39.         
  40. }



  41. void Timer0Init(void)                //10微秒@24.000MHz
  42. {
  43.         AUXR |= 0x80;                //定時器時鐘1T模式
  44.         TMOD &= 0xF0;                //設置定時器模式
  45.         
  46.         //TL0 = 0x10;                //設置定時初值        10微妙
  47.         //TL0 = 0xD0;                //設置定時初值        2微妙
  48.         //TL0 = 0xE8;                //設置定時初值        1微妙
  49.         TL0 = 0xE8;
  50.         
  51.         TH0 = 0xFF;                //設置定時初值
  52.         TF0 = 0;                //清除TF0標志
  53.         
  54.         TR0 = 1;                //定時器0開始計時
  55.         
  56.         ET0 = 1;                //使能定時器0中斷
  57.         EA = 1;                        //打開總中斷
  58.         
  59.         PT0  = 1;    //高優先級中斷
  60.         
  61. }




  62. void Delay1000ms()                //@24.000MHz  //軟件延時1000ms
  63. {
  64.         unsigned char i, j, k;

  65.         _nop_();
  66.         _nop_();
  67.         i = 92;
  68.         j = 50;
  69.         k = 238;
  70.         do
  71.         {
  72.                 do
  73.                 {
  74.                         while (--k);
  75.                 } while (--j);
  76.         } while (--i);
  77. }

  78. void Delay20ms()                //@24.000MHz
  79. {
  80.         unsigned char i, j, k;

  81.         _nop_();
  82.         _nop_();
  83.         i = 2;
  84.         j = 211;
  85.         k = 231;
  86.         do
  87.         {
  88.                 do
  89.                 {
  90.                         while (--k);
  91.                 } while (--j);
  92.         } while (--i);
  93. }


  94. void UartInit(void)                //115200bps@24.000MHz
  95. {
  96.         SCON = 0x50;                //8位數據,可變波特率
  97.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  98.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  99.         TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
  100.         
  101.         TL1 = 0xCC;                //設定定時初值        115200
  102.         TH1 = 0xFF;                //設定定時初值
  103.         
  104.         //TL1 = 0x8F;                //設定定時初值        9600
  105.         //TH1 = 0xFD;                //設定定時初值
  106.         
  107.         ET1 = 0;                //禁止定時器1中斷
  108.         TR1 = 1;                //啟動定時器1
  109.         
  110.         ES = 1;                        //是能串口1中斷
  111.         EA = 1;                 //使能總中斷
  112.         
  113.         PS  = 2;    //高優先級中斷
  114.         
  115.                 B_TX1_Busy = 0;
  116.                     TX1_Cnt = 0;
  117.                     RX1_Cnt = 0;
  118. }




  119. void UART1_int (void) interrupt 4
  120. {
  121.     if(RI)
  122.     {
  123.         RI = 0;
  124.         RX1_Buffer[RX1_Cnt] = SBUF;
  125.         if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;    //防溢出
  126.     }

  127.     if(TI)
  128.     {
  129.         TI = 0;
  130.         B_TX1_Busy = 0;
  131.     }
  132. }





  133. void    PrintChar(u8 dat)   //發送字符
  134. {
  135.     SBUF = dat;
  136.     B_TX1_Busy = 1;
  137.     while(B_TX1_Busy);
  138. }



  139. void PrintString1(u8 *puts) //發送一個字符串
  140. {
  141.         unsigned char i;
  142.     for (i=0;i<9;i++)  
  143.     {
  144.         SBUF = puts[i];
  145.         B_TX1_Busy = 1;
  146.         while(B_TX1_Busy);
  147.     }
  148. }








  149. void main(void)
  150. {
  151.         
  152.                 P5M1 = 0;   
  153.                 P5M0 = 0;        //P5 標準輸出口
  154.         
  155.                 P3M1 = 0;   
  156.                 P3M0 = 0;        //P3 標準輸出口
  157.         
  158.                                 UartInit();        //初始化串口
  159.         
  160.         Timer0Init();//初始化定時器

  161. //        EX1init(); //初始化外部中斷
  162.         


  163.         
  164.         while(1)//主循環
  165.         {   
  166.                                        
  167.         //                PrintString1(S_data1);
  168.                                        
  169.         //                Delay20ms();
  170.                                        

  171.         }
  172.                                 
  173. }

復制代碼

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

使用道具 舉報

沙發
ID:1109793 發表于 2025-4-13 14:29 | 只看該作者
PS = 2是個啥意思?PS不是一個BIT嗎?
就是PS = 1一樣了,PT0也=1,就是T0還是高于串口了,那么在T0中斷里面調用發送函數過程中,串口是無法產生中斷的。你這又是等待又是中斷的,還要加個B_TX1_Busy ,感覺挺麻煩的,發送函數為何不直接用TI判定發送完成?
回復

使用道具 舉報

板凳
ID:1133081 發表于 2025-4-13 17:09 | 只看該作者
雖然單片機累不死但是會忙不贏。你為了20ms發送一次串口信號讓定時器中斷20000次合適嗎?你確定 PrintString1(S_data1);在10us時間內能完成嗎?中斷程序執行時間大于中斷周期是忌諱。
回復

使用道具 舉報

地板
ID:1147156 發表于 2025-4-13 19:56 | 只看該作者
xiaobendan001 發表于 2025-4-13 14:29
PS = 2是個啥意思?PS不是一個BIT嗎?
就是PS = 1一樣了,PT0也=1,就是T0還是高于串口了,那么在T0中斷里 ...

剛剛開始編這個單片機的程序 都是照的例子改寫的  那簡單一點的應該是怎么樣 ?
改成這樣還是不行
    PS  = 0;    //中斷優先級 2
    PSH = 1;
回復

使用道具 舉報

5#
ID:1147156 發表于 2025-4-13 19:58 | 只看該作者
WL0123 發表于 2025-4-13 17:09
雖然單片機累不死但是會忙不贏。你為了20ms發送一次串口信號讓定時器中斷20000次合適嗎?你確定 PrintStrin ...

因為我程序需要1us就要判斷電平高低來計數  其他判斷程序還沒寫  先確定發送指令的方面
回復

使用道具 舉報

6#
ID:1109793 發表于 2025-4-14 07:41 | 只看該作者
rootony 發表于 2025-4-13 19:56
剛剛開始編這個單片機的程序 都是照的例子改寫的  那簡單一點的應該是怎么樣 ?
改成這樣還是不行
     ...

PSH是啥?我也沒找到。
我記得要提高優先級,就是PS = 1;同時PT0不能設置,就是保持=0;
這樣串口才會比定時器優先。
回復

使用道具 舉報

7#
ID:1147156 發表于 2025-4-14 22:25 | 只看該作者
xiaobendan001 發表于 2025-4-14 07:41
PSH是啥?我也沒找到。
我記得要提高優先級,就是PS = 1;同時PT0不能設置,就是保持=0;
這樣串口才會 ...

PSH就是PS的高位啊  優先級一共四級 00 01 10 11
妳說的那個簡單的發送函數是什么樣的  能貼一段代碼嗎
就是有T0中斷 還有完整的串口發送數據的
回復

使用道具 舉報

8#
ID:1109793 發表于 2025-4-15 07:12 | 只看該作者
rootony 發表于 2025-4-14 22:25
PSH就是PS的高位啊  優先級一共四級 00 01 10 11
妳說的那個簡單的發送函數是什么樣的  能貼一段代碼嗎
...

哪個頭文件里面的定義啊
我也沒找到STC8G.H里面,只有一個IP
回復

使用道具 舉報

9#
ID:1109793 發表于 2025-4-15 07:18 | 只看該作者
rootony 發表于 2025-4-14 22:25
PSH就是PS的高位啊  優先級一共四級 00 01 10 11
妳說的那個簡單的發送函數是什么樣的  能貼一段代碼嗎
...

剛剛查看了PDF,有四個優先級寄存器,IP,IPH,IP2,IP2H。其中只有IP是可以位訪問的。
回復

使用道具 舉報

10#
ID:624769 發表于 2025-4-15 22:42 | 只看該作者
你先 解決 20ms 串口發送一次問題, 再去考慮 每us判斷電平的問題。
就你寫出 PS = 2;  以及寫出 PSH = 1; 這個情況來看,不要折騰太多能力范圍外的東西。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人综合在线 | 国产精品毛片 | 久久免费精彩视频 | 色av一区二区三区 | 一区二区三区欧美 | 97国产精品视频人人做人人爱 | 亚洲狠狠爱 | 久久99精品久久久97夜夜嗨 | 欧美一区二区三区一在线观看 | 男女污污网站 | 久久久www成人免费无遮挡大片 | 日韩精品一区二区三区老鸭窝 | 欧美视频在线免费 | 天天草天天干 | 免费久久99精品国产婷婷六月 | av片网| 欧美久久久网站 | 国产乱码精品一区二区三区五月婷 | 91xh98hx 在线 国产 | 青青草国产在线观看 | 精品少妇v888av | 麻豆国产一区二区三区四区 | 日韩精品一区二区三区在线观看 | aaaaa毛片| 99精品一区二区三区 | jizz视频 | 国产成都精品91一区二区三 | 色婷婷综合久久久久中文一区二区 | 91精品国产欧美一区二区成人 | 亚洲精品久久久久中文字幕欢迎你 | 国产91综合一区在线观看 | 亚洲社区在线 | 久久久久久久国产精品影院 | 午夜欧美| 99久久精品国产一区二区三区 | 中文久久| 国产精品永久在线观看 | 国产一区二区三区www | 性一爱一乱一交一视频 | 欧美精品福利视频 | 色婷婷av99xx |