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

QQ登錄

只需一步,快速開(kāi)始

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

關(guān)于stc8g單片機(jī)里面定時(shí)器中斷和串口中斷輸出的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1147156 發(fā)表于 2025-4-13 10:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
代碼如下  我是想1us 定時(shí)器0中斷一次  計(jì)數(shù)20000次時(shí) 定時(shí)器中斷函數(shù)里  串口1輸出數(shù)據(jù)  但是監(jiān)控串口 沒(méi)有輸出   我也加了優(yōu)先級(jí) 串口優(yōu)先2  定時(shí)器0優(yōu)先1
只有主循環(huán)里才能輸出  具體看不出時(shí)序?qū)Σ粚?duì)  

請(qǐng)大佬看看哪里有問(wèn)題
難道是中斷里面不支持再次中斷
  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;    //發(fā)送計(jì)數(shù)
  10. u8  RX1_Cnt;    //接收計(jì)數(shù)
  11. bit B_TX1_Busy; //發(fā)送忙標(biāo)志

  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均可驅(qū)動(dòng)舵機(jī)。
  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    //定時(shí)器0中斷函數(shù)
  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;                //定時(shí)器時(shí)鐘1T模式
  44.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  45.         
  46.         //TL0 = 0x10;                //設(shè)置定時(shí)初值        10微妙
  47.         //TL0 = 0xD0;                //設(shè)置定時(shí)初值        2微妙
  48.         //TL0 = 0xE8;                //設(shè)置定時(shí)初值        1微妙
  49.         TL0 = 0xE8;
  50.         
  51.         TH0 = 0xFF;                //設(shè)置定時(shí)初值
  52.         TF0 = 0;                //清除TF0標(biāo)志
  53.         
  54.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  55.         
  56.         ET0 = 1;                //使能定時(shí)器0中斷
  57.         EA = 1;                        //打開(kāi)總中斷
  58.         
  59.         PT0  = 1;    //高優(yōu)先級(jí)中斷
  60.         
  61. }




  62. void Delay1000ms()                //@24.000MHz  //軟件延時(shí)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位數(shù)據(jù),可變波特率
  97.         AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
  98.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  99.         TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
  100.         
  101.         TL1 = 0xCC;                //設(shè)定定時(shí)初值        115200
  102.         TH1 = 0xFF;                //設(shè)定定時(shí)初值
  103.         
  104.         //TL1 = 0x8F;                //設(shè)定定時(shí)初值        9600
  105.         //TH1 = 0xFD;                //設(shè)定定時(shí)初值
  106.         
  107.         ET1 = 0;                //禁止定時(shí)器1中斷
  108.         TR1 = 1;                //啟動(dòng)定時(shí)器1
  109.         
  110.         ES = 1;                        //是能串口1中斷
  111.         EA = 1;                 //使能總中斷
  112.         
  113.         PS  = 2;    //高優(yōu)先級(jí)中斷
  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)   //發(fā)送字符
  134. {
  135.     SBUF = dat;
  136.     B_TX1_Busy = 1;
  137.     while(B_TX1_Busy);
  138. }



  139. void PrintString1(u8 *puts) //發(fā)送一個(gè)字符串
  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 標(biāo)準(zhǔn)輸出口
  154.         
  155.                 P3M1 = 0;   
  156.                 P3M0 = 0;        //P3 標(biāo)準(zhǔn)輸出口
  157.         
  158.                                 UartInit();        //初始化串口
  159.         
  160.         Timer0Init();//初始化定時(shí)器

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


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

  171.         }
  172.                                 
  173. }

復(fù)制代碼

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

剛剛開(kāi)始編這個(gè)單片機(jī)的程序 都是照的例子改寫的  那簡(jiǎn)單一點(diǎn)的應(yīng)該是怎么樣 ?
改成這樣還是不行
    PS  = 0;    //中斷優(yōu)先級(jí) 2
    PSH = 1;
回復(fù)

使用道具 舉報(bào)

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

因?yàn)槲页绦蛐枰?us就要判斷電平高低來(lái)計(jì)數(shù)  其他判斷程序還沒(méi)寫  先確定發(fā)送指令的方面
回復(fù)

使用道具 舉報(bào)

6#
ID:1109793 發(fā)表于 2025-4-14 07:41 | 只看該作者
rootony 發(fā)表于 2025-4-13 19:56
剛剛開(kāi)始編這個(gè)單片機(jī)的程序 都是照的例子改寫的  那簡(jiǎn)單一點(diǎn)的應(yīng)該是怎么樣 ?
改成這樣還是不行
     ...

PSH是啥?我也沒(méi)找到。
我記得要提高優(yōu)先級(jí),就是PS = 1;同時(shí)PT0不能設(shè)置,就是保持=0;
這樣串口才會(huì)比定時(shí)器優(yōu)先。
回復(fù)

使用道具 舉報(bào)

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

PSH就是PS的高位啊  優(yōu)先級(jí)一共四級(jí) 00 01 10 11
妳說(shuō)的那個(gè)簡(jiǎn)單的發(fā)送函數(shù)是什么樣的  能貼一段代碼嗎
就是有T0中斷 還有完整的串口發(fā)送數(shù)據(jù)的
回復(fù)

使用道具 舉報(bào)

8#
ID:1109793 發(fā)表于 2025-4-15 07:12 | 只看該作者
rootony 發(fā)表于 2025-4-14 22:25
PSH就是PS的高位啊  優(yōu)先級(jí)一共四級(jí) 00 01 10 11
妳說(shuō)的那個(gè)簡(jiǎn)單的發(fā)送函數(shù)是什么樣的  能貼一段代碼嗎
...

哪個(gè)頭文件里面的定義啊
我也沒(méi)找到STC8G.H里面,只有一個(gè)IP
回復(fù)

使用道具 舉報(bào)

9#
ID:1109793 發(fā)表于 2025-4-15 07:18 | 只看該作者
rootony 發(fā)表于 2025-4-14 22:25
PSH就是PS的高位啊  優(yōu)先級(jí)一共四級(jí) 00 01 10 11
妳說(shuō)的那個(gè)簡(jiǎn)單的發(fā)送函數(shù)是什么樣的  能貼一段代碼嗎
...

剛剛查看了PDF,有四個(gè)優(yōu)先級(jí)寄存器,IP,IPH,IP2,IP2H。其中只有IP是可以位訪問(wèn)的。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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