找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc15f104w單片機輸出不同頻率波形出現(xiàn)間斷問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:675145 發(fā)表于 2020-7-30 10:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
定時器2每2ms中斷BUZ_count+1,10ms變化一次頻率,頻率由定時器0使能內(nèi)部時鐘輸出到P3.5的波
  1. switch(BUZ_count)
  2. {
  3.         case 5:        INT_CLKO &= 0xFE;        //關閉P3.5內(nèi)部時鐘輸出
  4.                         TR0 = 0;                        //定時器0關閉計時
  5.                         TL0 = 0x42;                        //設置定時初值
  6.                         TH0 = 0xEB;                        //設置定時初值                                        /177us/2.8khz
  7.                         TR0 = 1;                        //定時器0開始計時
  8.                         _nop_();
  9.                         _nop_();
  10.                         INT_CLKO |= 0X01;        //打開P3.5內(nèi)部時鐘輸出
  11.                         LED=0;
  12.                         break;
  13.         case 10:INT_CLKO &= 0xFE;        //關閉P3.5內(nèi)部時鐘輸出
  14.                         TR0 = 0;                        //定時器0關閉計時
  15.                         TL0 = 0xE6;                        //設置定時初值
  16.                         TH0 = 0xEC;                        //設置定時初值                                        /163us/3.05khz
  17.                         TR0 = 1;                        //定時器0開始計時
  18.                         _nop_();
  19.                         _nop_();
  20.                         _nop_();
  21.                         _nop_();
  22.                         INT_CLKO |= 0X01;        //打開P3.5內(nèi)部時鐘輸出
  23.                         break;
  24.         case 15:INT_CLKO &= 0xFE;        //關閉P3.5內(nèi)部時鐘輸出
  25.                         TR0 = 0;                        //定時器0關閉計時
  26.                         TL0 = 0x8A;                        //設置定時初值
  27.                         TH0 = 0xEE;                        //設置定時初值                                        /149us/3.3khz
  28.                         TR0 = 1;                        //定時器0開始計時
  29.                         INT_CLKO |= 0X01;        //打開P3.5內(nèi)部時鐘輸出
  30.                         break;
  31.         case 20:INT_CLKO &= 0xFE;        //關閉P3.5內(nèi)部時鐘輸出
  32.                         break;
  33. }
復制代碼
每次變化前都有2MS時間的間隔,輸出波形前加了_nop_();也沒什么效果

大佬幫忙看看是哪里的問題
我懷疑是不是單片機自身開啟定時器時需要2ms的穩(wěn)定時間(盲猜。沒有依據(jù))如果是有沒有解決的辦法
單片機用的是STC15F104W,不可接外部晶振,只有內(nèi)部晶振,設置的30MHZ


1596075329(1).jpg (87.74 KB, 下載次數(shù): 84)

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

使用道具 舉報

沙發(fā)
ID:807591 發(fā)表于 2020-7-30 11:41 | 只看該作者
每2ms中斷一次,不是自己設置的么,,中斷了以后執(zhí)行什么,2ms空缺,就是程序問題
回復

使用道具 舉報

板凳
ID:675145 發(fā)表于 2020-7-30 11:50 | 只看該作者
szb314 發(fā)表于 2020-7-30 11:41
每2ms中斷一次,不是自己設置的么,,中斷了以后執(zhí)行什么,2ms空缺,就是程序問題

定時器2ms中斷一次,每次BUZ_count這個變量+1,5次后(就是2ms*5=10MS)變化一次定時器0波形輸出的時間
回復

使用道具 舉報

地板
ID:807591 發(fā)表于 2020-7-30 12:24 | 只看該作者
張小不懂 發(fā)表于 2020-7-30 11:50
定時器2ms中斷一次,每次BUZ_count這個變量+1,5次后(就是2ms*5=10MS)變化一次定時器0波形輸出的時間

程序問題,,buz_count 有清零么,,,,定時器不可能需要2ms啟動的,想都不用想,,switch 語句 default 有時候有必要加上
回復

使用道具 舉報

5#
ID:147710 發(fā)表于 2020-7-30 12:29 | 只看該作者
把定時器2每2ms中斷一次改為3ms中斷一次,看空缺是不是跟著變?yōu)?ms。

評分

參與人數(shù) 1黑幣 +10 收起 理由
張小不懂 + 10 很給力!

查看全部評分

回復

使用道具 舉報

6#
ID:675145 發(fā)表于 2020-7-30 13:21 | 只看該作者
XTXB 發(fā)表于 2020-7-30 12:29
把定時器2每2ms中斷一次改為3ms中斷一次,看空缺是不是跟著變?yōu)?ms。

老哥正解,已經(jīng)可以了,改成100us影響不大
回復

使用道具 舉報

7#
ID:675145 發(fā)表于 2020-7-30 13:22 | 只看該作者
szb314 發(fā)表于 2020-7-30 12:24
程序問題,,buz_count 有清零么,,,,定時器不可能需要2ms啟動的,想都不用想,,switch 語句 default 有時候有 ...

進入這段函數(shù)前已經(jīng)清零過,樓下老哥已經(jīng)解決了,是把定時器2的中斷改小,間隔也小了,還是謝謝你
回復

使用道具 舉報

8#
ID:213173 發(fā)表于 2020-7-30 14:04 | 只看該作者
STC官方例程修改一下即可。


回復

使用道具 舉報

9#
ID:808485 發(fā)表于 2020-7-30 14:42 | 只看該作者
間隔隨著定時器2的中斷時間變化,那顯然是定時器2相關代碼出了問題。
全部代碼也沒多少,全貼出來看看吧。
回復

使用道具 舉報

10#
ID:675145 發(fā)表于 2020-7-30 16:20 | 只看該作者
gbchang 發(fā)表于 2020-7-30 14:42
間隔隨著定時器2的中斷時間變化,那顯然是定時器2相關代碼出了問題。
全部代碼也沒多少,全貼出來看看吧。

改成100us中斷一次,影響不大,還有個問題我開了掉電喚醒功能,sbit KEY_ZD=P3^2;是震動開關經(jīng)常掃描不到,去掉消抖都不行。不進入掉電模式就能正常掃描到,老哥幫我看看怎么改穩(wěn)定一點,下面是全部代碼
  1. #include "stc15.h"
  2. #include "intrins.h"

  3. typedef unsigned char u8;
  4. typedef unsigned short u16;
  5. typedef unsigned long u32;

  6. sbit LED=P3^0;                //LED燈
  7. sbit KEY_ZD=P3^2;        //震動開關
  8. sbit KEY_GL=P3^3;        //鋼纜檢測
  9. sbit KEY_SET=P3^4;        //設置開關

  10. u16 idata BUZ_count=0;
  11. u16 idata key_count=0;
  12. bit idata key_count_Flag=0;
  13. u8  idata BUZ_Write_Go=1;
  14. u16 idata T0_Starter=0xD5D0;
  15. void Timer0_Init()          //定時器0初始化函數(shù)
  16. {
  17.         AUXR |= 0x80;                //定時器時鐘1T模式
  18.         TMOD &= 0xF0;                //設置定時器模式
  19.         TMOD &= ~0x04;                //設置定時器內(nèi)部時鐘輸出
  20.         TL0 = T0_Starter&0xff;                        //設置定時初值
  21.         TH0 = (T0_Starter>>8)&0xff;                        //設置定時初值                /360us/1.4khz                                               
  22.         TR0 = 1;                        //定時器0開始計時
  23.         INT_CLKO |= 0X01;        //使能定時器0的時鐘輸出功能(P3.5)
  24. }
  25. void Timer2_Init()          //定時器2中斷初始化函數(shù)
  26. {
  27.         AUXR |= 0x04;                //定時器時鐘1T模式
  28.         T2L = 0x48;                        //設置定時初值
  29.         T2H = 0xF4;                        //設置定時初值                        /100us
  30.         AUXR |= 0x10;                //定時器2開始計時
  31.         IE2  |= 0x04;                //打開定時器2中斷

  32.         EA =1;
  33. }
  34. void Init()
  35. {       
  36.         P3M1=0x00;
  37.         P3M0=0x20;                //P3.5口推挽輸出
  38.         Timer0_Init();        //初始化定時器0,P3.5內(nèi)部時鐘輸出
  39.         Timer2_Init();        //初始化定時器2,延時2MS
  40.         WKTCL = 30;                //設置喚醒周期488us*(49+1)=24.4ms
  41.         WKTCH = 0X80;        //打開掉電喚醒
  42.         LED=1;                        //LED燈
  43.         KEY_ZD=1;                //震動開關
  44.         KEY_GL=1;                //鋼纜檢測
  45.         KEY_SET=1;                //設置開關
  46. }
  47. void Timer2_Routine() interrupt 12                //定時器2中斷
  48. {
  49.         BUZ_count++;
  50.         if(key_count_Flag)
  51.         {
  52.                 key_count++;
  53.         }
  54.         else
  55.                 key_count=0;
  56. }
  57. void KEY_Scan()
  58. {
  59.         static u8 idata KEY_Flag=0;
  60.         if(BUZ_Write_Go==0 && KEY_Flag==0 && KEY_SET==0)
  61.         {
  62.                 key_count_Flag=1;
  63.                 if(key_count>=500)
  64.                 {
  65.                         key_count_Flag=0;
  66.                         if(KEY_SET==0)
  67.                         {
  68.                                 BUZ_Write_Go=2;
  69.                                 KEY_Flag=1;
  70.                         }
  71.                 }
  72.         }
  73.         if(BUZ_Write_Go==0 && KEY_Flag==1 && KEY_ZD==0)
  74.         {
  75.                 key_count_Flag=1;
  76.                 if(key_count>=100 )
  77.                 {
  78.                         if(KEY_ZD==0)
  79.                         {
  80.                                 key_count_Flag=0;
  81.                                 BUZ_Write_Go=3;
  82.                                 KEY_Flag=2;
  83.                         }
  84.                 }
  85.         }
  86.         if(BUZ_Write_Go==0 && KEY_Flag==2 && KEY_ZD==0)
  87.         {
  88.                 key_count_Flag=1;
  89.                 if(key_count>=100)
  90.                 {
  91.                         key_count_Flag=0;
  92.                         if(KEY_ZD==0)
  93.                         {
  94.                                 BUZ_Write_Go=4;
  95.                         }
  96.                 }
  97.         }
  98.         if(KEY_GL==0)
  99.         {
  100.                 key_count_Flag=1;
  101.                 if(key_count>=500)
  102.                 {
  103.                         key_count_Flag=0;
  104.                         BUZ_Write_Go=4;
  105.                 }
  106.         }
  107. }
  108. void Buz_Ser()
  109. {
  110.         static u8 idata Num=0;
  111.         if(BUZ_Write_Go)
  112.         {
  113.                 switch(BUZ_Write_Go)
  114.                 {
  115.                         case 1:
  116.                         case 2:
  117.                                 {
  118.                                         switch(BUZ_count/20)
  119.                                         {
  120.                                                 case 5:        INT_CLKO |= 0X01;LED=0;break;
  121.                                                 case 30:INT_CLKO &= 0xfe;LED=1;break;
  122.                                                 case 35:BUZ_Write_Go=0;break;
  123.                                         }
  124.                                 }break;
  125.                         case 3:
  126.                                 {
  127.                                         switch(BUZ_count/20)
  128.                                         {
  129.                                                 case 5:
  130.                                                 case 500:
  131.                                                 case 1000:INT_CLKO |= 0X01;LED=0;break;
  132.                                                 case 250:
  133.                                                 case 750:
  134.                                                 case 1250:INT_CLKO &= 0xfe;LED=1;break;
  135.                                                 case 1253:BUZ_Write_Go=0;break;
  136.                                         }
  137.                                 }break;       
  138.                         case 4:
  139.                                 {
  140.                                         if(BUZ_count==90)
  141.                                         {
  142.                                                 BUZ_count=0;
  143.                                                 switch(Num)
  144.                                                 {
  145.                                                         case 0: T0_Starter=0xEB42;break;
  146.                                                         case 1:
  147.                                                         case 2:
  148.                                                         case 3:
  149.                                                         case 4:
  150.                                                         case 5:
  151.                                                         case 6: T0_Starter += 0x01A4;break;
  152.                                                         case 7:
  153.                                                         case 8:
  154.                                                         case 9:
  155.                                                         case 10:
  156.                                                         case 11:T0_Starter -= 0x01A4;break;
  157.                                                 }
  158.                                                 INT_CLKO &= 0xFE;                                //關閉P3.5內(nèi)部時鐘輸出
  159.                                                 TR0 = 0;                                                //定時器0關閉計時
  160.                                                 TL0 = T0_Starter & 0xFF;                //設置定時初值
  161.                                                 TH0 = (T0_Starter>>8) & 0xFF;        //設置定時初值               
  162.                                                 TR0 = 1;                                                //定時器0開始計時
  163.                                                 INT_CLKO |= 0X01;                                //打開P3.5內(nèi)部時鐘輸出
  164.                                                 if(Num==10)  LED=~LED;
  165.                                                 Num++;
  166.                                                 Num %=12;
  167.                                         }
  168.                                 }break;
  169.                 }
  170.         }
  171.         else
  172.         {
  173.                 BUZ_count=0;       
  174.         }
  175. }
  176. void Power_Down()
  177. {
  178.         if(BUZ_Write_Go==0 && key_count_Flag==0)
  179.         {
  180.                 _nop_();       
  181.                 _nop_();       
  182.                 _nop_();
  183.                 PCON=0X02;                //進入掉電模式
  184.                 _nop_();                //重新上電后現(xiàn)執(zhí)行此語句,再執(zhí)行中斷
  185.                 _nop_();       
  186.                 _nop_();       
  187.                 _nop_();
  188.         }
  189. }
  190. void main()
  191. {
  192.         Init();
  193.         while(1)
  194.         {
  195.                 Power_Down();
  196.                 KEY_Scan();                //按鍵掃描
  197.                 Buz_Ser();                //蜂鳴器服務
  198.         }
  199. }
復制代碼


回復

使用道具 舉報

11#
ID:675145 發(fā)表于 2020-7-30 16:29 | 只看該作者
發(fā)了兩遍都通過了。。。。兩遍是一樣的,請忽略
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表