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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 995|回復: 5
收起左側

請教使用STC8H1K08單片機芯片測頻率問題

[復制鏈接]
ID:1130621 發表于 2024-12-10 22:22 | 顯示全部樓層 |閱讀模式
使用STC8H1K08芯片,進行頻率采集并顯示在數碼管上,被采集的為霍爾元件產生的方波信號,現在輸出的信號無法正常顯示在數碼管上,各位大佬幫我看看哪里不對。頻率范圍0-300Hz,用示波器能正常顯示方波,霍爾正常產生方波頻率
51hei截圖_20241210222216.png


代碼
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. sfr  P1M0 = 0x92; //P1口IO模式控制寄存器M0
  4. sfr  P1M1 = 0x91; //P1口IO模式控制寄存器M1
  5. sfr  P3M0 = 0xb2; //P3口IO模式控制寄存器M0
  6. sfr  P3M1 = 0xb1; //P3口IO模式控制寄存器M1
  7. sbit DIG1 = P3^5; //位選1
  8. sbit DIG2 = P3^6; //位選2
  9. sbit DIG3 = P3^7; //位選3

  10. bit flag1s = 0; //1s定時標志
  11. bit Dlflag = 0;        //開始計時標志位
  12. unsigned char T1RH = 0;  //T0重載值的高字節
  13. unsigned char T1RL = 0;  //T0重載值的低字節
  14. void  GetFrequency(); //獲取方波脈沖函數
  15. void ConfigTimer1(unsigned int ms); //配置T1定時器中斷
  16. unsigned char code LedChar[]={
  17.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  18.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  19.         };
  20. unsigned char LedBuff[3]={
  21.         0xc0, 0xc0, 0xc0
  22.         };
  23. /*500ms延時函數*/
  24. void Delay500ms()                //@24.000MHz
  25. {
  26.         unsigned char i, j, k;

  27.         _nop_();
  28.         _nop_();
  29.         i = 61;
  30.         j = 225;
  31.         k = 62;
  32.         do
  33.         {
  34.                 do
  35.                 {
  36.                         while (--k);
  37.                 } while (--j);
  38.         } while (--i);
  39. }
  40. /** 主函數 **/
  41. void main()
  42. {
  43.     P1M0 = 0x00; //配置P1口為雙向IO
  44.         P1M1 = 0x00;
  45.         P3M0 |= 0x00; //配置P3.5 P3.7 P3.7為雙向IO,其他為高阻輸入
  46.         P3M1 &= 0x1f;

  47.         TMOD &= 0xf0; //清零T0的控制位
  48.     TMOD |= 0x05; //設置T0為計數器  工作模式1 用P3^4/T0進行脈沖計數
  49.     EA = 1;
  50.         ConfigTimer1(2); //2ms定時器1中斷

  51.     while (1)
  52.     {
  53.             GetFrequency();
  54.             Delay500ms();
  55.     }
  56.         
  57. }
  58. void  GetFrequency()
  59. {
  60.     unsigned char th1,th2,tl; //用于TH0,TL0值的存放
  61.     unsigned int num,temp2;        //num保存脈沖數,temp2計算顯示用
  62.         float temp = 0; //浮點數

  63.     flag1s = 0;
  64.         Dlflag = 1;
  65.         TH0 = 0; //清零TH0準備計數
  66.         TL0 = 0; //清零TL0準備計數
  67.         IT0 = 1; //設置T0低電平計數
  68.         ET0 = 1; //打開T0使能中斷
  69.         TF1 = 1; //進入T1中斷
  70.     TR0 = 1; //啟動T0開始計數
  71.         while(!flag1s)//flag1s標記位
  72.         ET0 = 0; //關閉T0使能中斷
  73.     TR0 = 0; //關閉T0
  74.         while(1)
  75.         {
  76.            th1 = TH0;        //讀取TH0值
  77.            tl = TL0;        //讀取TL0值
  78.            th2 = TH0;        //再次讀取TH0值           
  79.            if(th1 == th2) //對比讀取的2次TH0值,確保沒TL0沒進位后退出
  80.            {
  81.                      break;
  82.            }
  83.            
  84.         }
  85.         //關中斷防止計算出錯
  86.         EA = 0;
  87.         num = th1*256 + tl; //計算脈沖數
  88.         temp = num;

  89.         if(temp<1000)
  90.         {
  91.            temp2 = temp;
  92.            LedBuff[2] = LedChar[temp2%10];
  93.            LedBuff[1] = LedChar[temp2/10%10];
  94.            LedBuff[0] = LedChar[temp2/100%10];
  95.         }
  96.         else
  97.         {
  98.           temp = temp/10;
  99.           if(temp < 1000)
  100.           {
  101.                   temp2 = temp;
  102.                 LedBuff[2] = LedChar[temp2%10];
  103.             LedBuff[1] = LedChar[temp2/10%10];
  104.             LedBuff[0] = LedChar[temp2/100%10];
  105.                 LedBuff[0] &= 0x7f;
  106.           }
  107.           else
  108.           {
  109.                   temp2 = temp/10;
  110.                 LedBuff[2] = LedChar[temp2%10];
  111.             LedBuff[1] = LedChar[temp2/10%10];
  112.             LedBuff[0] = LedChar[temp2/100%10];
  113.                 LedBuff[1] &= 0x7f;
  114.           }
  115.         }
  116.         EA = 1;
  117.         
  118. }
  119. /* 配置并啟動T1,ms-T0定時時間 */
  120. void ConfigTimer1(unsigned int ms)
  121. {
  122.     unsigned long tmp;  //臨時變量
  123.    
  124.     tmp = 24000000 / 12;      //12T定時器
  125.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  126.     tmp = 65536 - tmp;        //計算定時器重載值
  127.     tmp = tmp;           //補償中斷響應延時造成的誤差
  128.     T1RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  129.     T1RL = (unsigned char)tmp;
  130.     TMOD &= 0x0f;   //清零T1的控制位
  131.     TMOD |= 0x10;   //配置T1為模式1
  132.     TH1 = T1RH;     //加載T0重載值
  133.     TL1 = T1RL;
  134.     ET1 = 1;        //使能T0中斷
  135.     TR1 = 1;        //啟動T0
  136. }
  137. /*數碼管掃描*/
  138. void LedScan()
  139. {
  140.         static unsigned char i = 0;
  141.         
  142.         P1 = 0xff;
  143.         switch(i)
  144.         {
  145.           case 0:  DIG1 = 0; DIG2 = 1; DIG3 = 1; i++; P1 = LedBuff[0]; break;
  146.           case 1:  DIG1 = 1; DIG2 = 0; DIG3 = 1; i++; P1 = LedBuff[1]; break;
  147.           case 2:  DIG1 = 1; DIG2 = 1; DIG3 = 0; i=0; P1 = LedBuff[2]; break;
  148.           default: break;
  149.         }
  150. }
  151. /*定時器1中斷*/
  152. void InterruptTimer1() interrupt 3
  153. {   
  154.         static unsigned int tc = 0;
  155.         TH1 = T1RH;
  156.         TL1 = T1RL;
  157.                                                                                                                                                                                                                
  158.         LedScan();
  159.         if(Dlflag)
  160.         {
  161.                    tc++;
  162.                 if(tc >= 500)
  163.                 {
  164.                    tc = 0;
  165.                    Dlflag = 0;
  166.                    flag1s = 1;
  167.                 }
  168.         }
  169. }
復制代碼
回復

使用道具 舉報

ID:1130621 發表于 2024-12-10 22:58 | 顯示全部樓層
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. sfr  P1M0 = 0x92; //P1口IO模式控制寄存器M0
  4. sfr  P1M1 = 0x91; //P1口IO模式控制寄存器M1
  5. sfr  P3M0 = 0xb2; //P3口IO模式控制寄存器M0
  6. sfr  P3M1 = 0xb1; //P3口IO模式控制寄存器M1
  7. sbit DIG1 = P3^5; //位選1
  8. sbit DIG2 = P3^6; //位選2
  9. sbit DIG3 = P3^7; //位選3

  10. bit flag1s = 0; //1s定時標志
  11. bit Dlflag = 0;        //開始計時標志位
  12. unsigned char T1RH = 0;  //T0重載值的高字節
  13. unsigned char T1RL = 0;  //T0重載值的低字節
  14. void  GetFrequency(); //獲取方波脈沖函數
  15. void ConfigTimer1(unsigned int ms); //配置T1定時器中斷
  16. unsigned char code LedChar[]={
  17.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  18.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  19.         };
  20. unsigned char LedBuff[3]={
  21.         0xc0, 0xc0, 0xc0
  22.         };
  23. /*500ms延時函數*/
  24. void Delay500ms()                //@24.000MHz
  25. {
  26.         unsigned char i, j, k;

  27.         _nop_();
  28.         _nop_();
  29.         i = 61;
  30.         j = 225;
  31.         k = 62;
  32.         do
  33.         {
  34.                 do
  35.                 {
  36.                         while (--k);
  37.                 } while (--j);
  38.         } while (--i);
  39. }
  40. /** 主函數 **/
  41. void main()
  42. {
  43.     P1M0 = 0x00; //配置P1口為雙向IO
  44.         P1M1 = 0x00;
  45.         P3M0 |= 0x00; //配置P3.5 P3.7 P3.7為雙向IO,其他為高阻輸入
  46.         P3M1 &= 0x1f;

  47.         TMOD &= 0xf0; //清零T0的控制位
  48.     TMOD |= 0x05; //設置T0為計數器  工作模式1 用P3^4/T0進行脈沖計數
  49.     EA = 1;
  50.         ConfigTimer1(2); //2ms定時器1中斷

  51.     while (1)
  52.     {
  53.             GetFrequency();
  54.             Delay500ms();
  55.     }
  56.        
  57. }
  58. void  GetFrequency()
  59. {
  60.     unsigned char th1,th2,tl; //用于TH0,TL0值的存放
  61.     unsigned int num,temp2;        //num保存脈沖數,temp2計算顯示用
  62.         float temp = 0; //浮點數

  63.     flag1s = 0;
  64.         Dlflag = 1;
  65.         TH0 = 0; //清零TH0準備計數
  66.         TL0 = 0; //清零TL0準備計數
  67.         IT0 = 1; //設置T0低電平計數
  68.         ET0 = 1; //打開T0使能中斷
  69.         TF1 = 1; //進入T1中斷
  70.     TR0 = 1; //啟動T0開始計數
  71.         while(!flag1s)//flag1s標記位
  72.         ET0 = 0; //關閉T0使能中斷
  73.     TR0 = 0; //關閉T0
  74.         while(1)
  75.         {
  76.            th1 = TH0;        //讀取TH0值
  77.            tl = TL0;        //讀取TL0值
  78.            th2 = TH0;        //再次讀取TH0值          
  79.            if(th1 == th2) //對比讀取的2次TH0值,確保沒TL0沒進位后退出
  80.            {
  81.                      break;
  82.            }
  83.           
  84.         }
  85.         //關中斷防止計算出錯
  86.         EA = 0;
  87.         num = th1*256 + tl; //計算脈沖數
  88.         temp = num;

  89.         if(temp<1000)
  90.         {
  91.            temp2 = temp;
  92.            LedBuff[2] = LedChar[temp2%10];
  93.            LedBuff[1] = LedChar[temp2/10%10];
  94.            LedBuff[0] = LedChar[temp2/100%10];
  95.         }
  96.         else
  97.         {
  98.           temp = temp/10;
  99.           if(temp < 1000)
  100.           {
  101.                   temp2 = temp;
  102.                 LedBuff[2] = LedChar[temp2%10];
  103.             LedBuff[1] = LedChar[temp2/10%10];
  104.             LedBuff[0] = LedChar[temp2/100%10];
  105.                 LedBuff[0] &= 0x7f;
  106.           }
  107.           else
  108.           {
  109.                   temp2 = temp/10;
  110.                 LedBuff[2] = LedChar[temp2%10];
  111.             LedBuff[1] = LedChar[temp2/10%10];
  112.             LedBuff[0] = LedChar[temp2/100%10];
  113.                 LedBuff[1] &= 0x7f;
  114.           }
  115.         }
  116.         EA = 1;
  117.        
  118. }
  119. /* 配置并啟動T1,ms-T0定時時間 */
  120. void ConfigTimer1(unsigned int ms)
  121. {
  122.     unsigned long tmp;  //臨時變量
  123.    
  124.     tmp = 24000000 / 12;      //12T定時器
  125.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  126.     tmp = 65536 - tmp;        //計算定時器重載值
  127.     tmp = tmp;           //補償中斷響應延時造成的誤差
  128.     T1RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  129.     T1RL = (unsigned char)tmp;
  130.     TMOD &= 0x0f;   //清零T1的控制位
  131.     TMOD |= 0x10;   //配置T1為模式1
  132.     TH1 = T1RH;     //加載T0重載值
  133.     TL1 = T1RL;
  134.     ET1 = 1;        //使能T0中斷
  135.     TR1 = 1;        //啟動T0
  136. }
  137. /*數碼管掃描*/
  138. void LedScan()
  139. {
  140.         static unsigned char i = 0;
  141.        
  142.         P1 = 0xff;
  143.         switch(i)
  144.         {
  145.           case 0:  DIG1 = 0; DIG2 = 1; DIG3 = 1; i++; P1 = LedBuff[0]; break;
  146.           case 1:  DIG1 = 1; DIG2 = 0; DIG3 = 1; i++; P1 = LedBuff[1]; break;
  147.           case 2:  DIG1 = 1; DIG2 = 1; DIG3 = 0; i=0; P1 = LedBuff[2]; break;
  148.           default: break;
  149.         }
  150. }
  151. /*定時器1中斷*/
  152. void InterruptTimer1() interrupt 3
  153. {   
  154.         static unsigned int tc = 0;
  155.         TH1 = T1RH;
  156.         TL1 = T1RL;
  157.                                                                                                                                                                                                               
  158.         LedScan();
  159.         if(Dlflag)
  160.         {
  161.                    tc++;
  162.                 if(tc >= 500)
  163.                 {
  164.                    tc = 0;
  165.                    Dlflag = 0;
  166.                    flag1s = 1;
  167.                 }
  168.         }
  169. }
復制代碼
回復

使用道具 舉報

ID:1133081 發表于 2024-12-11 11:09 | 顯示全部樓層
給你一個成熟的頻率表電路和程序參考,結構簡單,也可以用于STC8H1K08-20單片機
數顯頻率表程序.rar (22.12 KB, 下載次數: 0)



無標題.jpg

回復

使用道具 舉報

ID:161164 發表于 2024-12-12 15:49 | 顯示全部樓層
47行或了個寂
但沒關系,P35~P37也配置為推挽模式

什么叫"無法正常顯示在數碼管上"?
回復

使用道具 舉報

ID:1130621 發表于 2024-12-12 22:40 | 顯示全部樓層

就是,顯示出來的是正常的頻率,是亂跳的數字,
回復

使用道具 舉報

ID:161164 發表于 2024-12-13 09:46 | 顯示全部樓層
眼小自然萌 發表于 2024-12-12 22:40
就是,顯示出來的是正常的頻率,是亂跳的數字,

看代碼
定時器1定時1ms
定時器0計數模式
定時器1累計5秒后計算定時器0的計數
你打開了定時器0的中斷但又沒有中斷函數
有沒有可能五秒內定時器0溢出了
結果程序跑飛了?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩av一区二区在线观看 | 久草电影网 | 五月免费视频 | 国产精品日产欧美久久久久 | 日韩欧美国产精品 | 久久久久久高潮国产精品视 | 91视频免费| 乳色吐息在线观看 | 欧美成人精品一区二区男人看 | 精品国产一区二区三区久久 | 国产成人综合一区二区三区 | 亚洲欧洲日韩 | 最新中文字幕在线 | 午夜影院毛片 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 亚洲精品乱码久久久久久蜜桃 | 美女久久久久久久 | 国产免费拔擦拔擦8x高清 | 成人在线视频一区 | 精品久久久久久国产 | 久久精品免费一区二区三 | 国产在视频一区二区三区吞精 | 欧美成人激情 | 国产高清在线 | 日日噜噜噜夜夜爽爽狠狠视频97 | 2020天天操 | 久久不卡 | 欧美一区二区三区视频在线 | 国产精品欧美一区二区三区 | 欧美专区在线 | 久久伊人影院 | 日本成人福利 | 亚洲一本 | 久久狼人天堂 | 成人欧美一区二区三区在线观看 | 狠狠骚 | 国产精品国产精品国产专区不片 | 亚洲成人久久久 | 国产在视频一区二区三区吞精 | 在线一区二区三区 | 国产一区二区麻豆 |