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

QQ登錄

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

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

單片機(jī)源程序如下:測(cè)雙路脈沖的占空比,有一路數(shù)據(jù)不對(duì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:721008 發(fā)表于 2021-7-14 16:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
      現(xiàn)在想用外部中斷0和外部中斷1來(lái)測(cè)雙路脈沖的占空比,實(shí)現(xiàn)的方法是先把定時(shí)器0設(shè)置成TMOD |=0x08(//T0開(kāi)始計(jì)時(shí)的條件是INT0腳為高電平及TR0置1時(shí))模式,以此來(lái)測(cè)P3^2腳輸入脈沖高電平的時(shí)間,然后外部中斷0是下降沿中斷,通過(guò)兩次下降沿中斷來(lái)測(cè)P3^2腳輸入脈沖的周期,以此來(lái)算占空比;同理用同樣的再去測(cè)P3^3腳輸入脈沖的占空比,兩路脈沖每測(cè)試完以此刷新一下屏幕顯示,然后延遲500ms再去測(cè)兩個(gè)輸入脈沖,如此循環(huán),可是測(cè)量的結(jié)果卻不對(duì),P3^2腳的輸入脈沖沒(méi)有問(wèn)題,但是P3^3腳輸入脈沖的周期測(cè)試不準(zhǔn)確,正常是8點(diǎn)幾毫秒,但是測(cè)出來(lái)的值時(shí)零點(diǎn)幾毫秒,但是高電平時(shí)間是對(duì)的。思考了好長(zhǎng)時(shí)間實(shí)在找不到錯(cuò)誤,因此來(lái)尋求大神的幫助,望不吝賜教。
單片機(jī)源程序如下:
  1. #include "stc15.h"
  2. #include "COMMON.H"
  3. #include "LCD12864.H"

  4. ulong atime_h =0;                                        //a路正脈沖頻寬
  5. ulong atime = 0;                                    //a路脈沖周期
  6. ulong Dutycycle_a = 0;                                //a路脈沖占空比
  7. uint int0_count = 0;                                //外部中斷0的中斷次數(shù)

  8. ulong btime_h =0;                                        //b路正脈沖頻寬
  9. ulong btime = 0;                                    //b路脈沖周期
  10. ulong Dutycycle_b = 0;                                //b路脈沖占空比
  11. uint int1_count = 0;                                //外部中斷1的中斷次數(shù)

  12. uint flag = 0;

  13. void display_data(uchar address,ulong b)        //脈沖周期或正脈沖頻寬的顯示函數(shù) (6位)
  14. {
  15. lcd_write_byte(0xf8,address);                     
  16. lcd_write_byte(0xfa,b/100000+0x30);
  17. lcd_write_byte(0xfa,(b%100000)/10000+0x30);
  18. lcd_write_byte(0xfa,(b%10000)/1000+0x30);
  19. lcd_write_byte(0xfa,(b%1000)/100+0x30);
  20. lcd_write_byte(0xfa,(b%100)/10+0x30);
  21. lcd_write_byte(0xfa,(b%10)+0x30);        
  22. }

  23. void display_data1(uchar address,ulong b)
  24. {
  25. lcd_write_byte(0xf8,address);                     
  26. lcd_write_byte(0xfa,b/100+0x30);
  27. lcd_write_byte(0xfa,(b%100)/10+0x30);
  28. lcd_write_byte(0xfa,0x2e);                //小數(shù)點(diǎn)
  29. lcd_write_byte(0xfa,(b%10)+0x30);        
  30. }

  31. void int0_init()
  32. {
  33. IT0 = 1;            //為 1 是下降沿; 為 0 是下降沿或上升沿
  34. EX0 = 0;                //為 1 允許中斷; 為 0 是禁止中斷
  35. }

  36. void int1_init()
  37. {
  38. IT1 = 1;           //為 1 是下降沿; 為 0 是下降沿或上升沿
  39. EX1 = 0;           //為 1 允許中斷; 為 0 是禁止中斷
  40. }

  41. void t0_init()  //65536us@12MHz
  42. {
  43. AUXR &= 0x7F;      //定時(shí)器時(shí)鐘12T模式
  44. TMOD &= 0xF8;            //設(shè)置定時(shí)器模式
  45. //TMOD |= 0x08;      //T0開(kāi)始計(jì)時(shí)的條件是INT0腳為高電平及TR0置1時(shí)
  46. TL0 = 0x00;                //設(shè)置定時(shí)初值
  47. TH0 = 0x00;                //設(shè)置定時(shí)初值
  48. TF0 = 0;                    //清除TF0標(biāo)志
  49. ET0 = 1;                    //允許T0中斷
  50. TR0 = 0;                    //定時(shí)器0停止計(jì)時(shí)
  51. }

  52. void t1_init()  //65536us@12MHz
  53. {
  54. AUXR &= 0xBF;        //定時(shí)器時(shí)鐘12T模式
  55. TMOD &= 0x8F;        //設(shè)置定時(shí)器模式
  56. //TMOD |= 0x80;         //T1開(kāi)始計(jì)時(shí)的條件是INT1腳為高電平及TR1置1時(shí)
  57. TL1 = 0x00;        //設(shè)置定時(shí)初值
  58. TH1 = 0x00;        //設(shè)置定時(shí)初值
  59. TF1 = 0;                //清除TF1標(biāo)志
  60. ET1 = 1;                //允許T1中斷
  61. TR1 = 0;                //定時(shí)器1停止計(jì)時(shí)
  62. }

  63. void show_freq()
  64. {
  65. if(flag == 1)
  66. {
  67.   display_data1(0x91,Dutycycle_a);
  68.   display_data(0x95,atime_h);
  69.   display_data1(0x89,Dutycycle_b);
  70.   display_data(0x8D,btime);
  71.   delay_xms(500);
  72.   flag = 0;
  73. }
  74. else
  75. {
  76.   TMOD |= 0x08;
  77.   EX0 = 1;
  78. }
  79. }

  80. void fuwei()   //復(fù)位函數(shù)
  81. {
  82. TR0 = 0;
  83. TR1 = 0;
  84. EX0 = 0;
  85. EX1 = 0;
  86. TH0 = 0;
  87. TL0 = 0;
  88. TH1 = 0;
  89. TL1 = 0;
  90. int0_count = 0;
  91. int1_count = 0;
  92. }

  93. void main()
  94. {
  95. stc_init();
  96. int0_init();
  97. int1_init();
  98. t0_init();
  99. t1_init();
  100. lcd_init();
  101. delay_xms(5);
  102. lcd_clean();
  103. delay_xms(5);
  104.   lcd_write_string(0x80,"  占空比  正周期");
  105.   lcd_write_string(0x90,"A:");
  106.   lcd_write_string(0x93,"%");
  107.   lcd_write_string(0x88,"B:");
  108.   lcd_write_string(0x8B,"%");
  109.   lcd_write_string(0x98,"C:");
  110.   lcd_write_string(0x9B,"%");
  111. delay_xms(5);
  112. EA=1;
  113. while(1)
  114. {
  115.   show_freq();
  116. }
  117. }

  118. void int0() interrupt 0         
  119. {
  120. if(flag == 0)
  121. {
  122.   int0_count++;
  123. }
  124. if(int0_count == 1)
  125. {
  126.   TR1 = 1;
  127.   TR0 = 1;
  128. }
  129. if(int0_count == 2)
  130.   {
  131.    TR0 = 0;
  132.    TR1 = 0;
  133.    atime_h = TH0<<8|TL0;
  134.    atime   = TH1<<8|TL1;
  135.    Dutycycle_a = atime_h*1000/atime;
  136.    EX0 = 0;
  137.    TH0 = 0;
  138.    TL0 = 0;
  139.    TH1 = 0;
  140.    TL1 = 0;
  141.    int0_count = 0;
  142.    TMOD &= 0xF7;
  143.    TMOD |= 0x80;
  144.    EX1 = 1;  
  145.   }        
  146. }

  147. void int1() interrupt 2         
  148. {
  149. if(flag == 0)
  150. {
  151.   int1_count++;
  152. }
  153. if(int1_count == 1)
  154. {
  155.   TR1 = 1;
  156.   TR0 = 1;
  157. }
  158. if(int1_count == 2)
  159.   {
  160.    TR0 = 0;
  161.    TR1 = 0;
  162.    btime_h = TH1<<8|TL1;
  163.    btime   = TH0<<8|TL0;
  164.    Dutycycle_b = btime_h*1000/btime;
  165.    EX1 = 0;
  166.    TH0 = 0;
  167.    TL0 = 0;
  168.    TH1 = 0;
  169.    TL1 = 0;
  170.    int1_count = 0;
  171.    TMOD &= 0x7F;
  172.    flag = 1;
  173.   }        
  174. }

  175. void t0() interrupt 1
  176. {
  177. fuwei();
  178. }

  179. void t1() interrupt 3
  180. {
  181. fuwei();
  182. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2021-7-15 11:14 | 只看該作者
道理:INT0中斷服務(wù)過(guò)程中,INT1是不會(huì)被響應(yīng)的,需要等INT0中斷服務(wù)結(jié)束,INT1才能被響應(yīng),這樣INT1就失去了計(jì)時(shí)的準(zhǔn)確性。
你需要好好的規(guī)劃一下,解決中斷優(yōu)先級(jí)不平等的問(wèn)題,或者將誤差縮小到可接受的范圍內(nèi)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:721008 發(fā)表于 2021-7-15 11:40 | 只看該作者
yzwzfyz 發(fā)表于 2021-7-15 11:14
道理:INT0中斷服務(wù)過(guò)程中,INT1是不會(huì)被響應(yīng)的,需要等INT0中斷服務(wù)結(jié)束,INT1才能被響應(yīng),這樣INT1就失去 ...

額,可是我就是在外部中斷0的服務(wù)過(guò)程中完成取定時(shí)器的值后把外部中斷0的中斷允許位置0了,然后置位了外部中斷1的中斷允許位,就是一步步來(lái)的,先外部中斷0后外部中斷1.
回復(fù)

使用道具 舉報(bào)

地板
ID:844772 發(fā)表于 2021-7-15 17:29 | 只看該作者
TMOD&=0xF7  是否改成0xD5,M1M0至11時(shí),是8位計(jì)數(shù)啊,也就能計(jì)算零點(diǎn)幾個(gè)毫秒。
另外就是這句TMOD |= 0x80;是否應(yīng)去掉?沒(méi)意義。
回復(fù)

使用道具 舉報(bào)

5#
ID:934353 發(fā)表于 2021-7-15 17:40 | 只看該作者
在一個(gè)中斷函數(shù)中置位另一個(gè)中斷是不會(huì)立即響應(yīng)的,就算你已經(jīng)關(guān)閉了本次中斷,也要等本次中斷結(jié)束才能響應(yīng)另外一個(gè)中斷
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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