使用STC8H1K08芯片,進行頻率采集并顯示在數碼管上,被采集的為霍爾元件產生的方波信號,現在輸出的信號無法正常顯示在數碼管上,各位大佬幫我看看哪里不對。頻率范圍0-300Hz,用示波器能正常顯示方波,霍爾正常產生方波頻率
代碼- #include <reg52.h>
- #include<intrins.h>
- sfr P1M0 = 0x92; //P1口IO模式控制寄存器M0
- sfr P1M1 = 0x91; //P1口IO模式控制寄存器M1
- sfr P3M0 = 0xb2; //P3口IO模式控制寄存器M0
- sfr P3M1 = 0xb1; //P3口IO模式控制寄存器M1
- sbit DIG1 = P3^5; //位選1
- sbit DIG2 = P3^6; //位選2
- sbit DIG3 = P3^7; //位選3
- bit flag1s = 0; //1s定時標志
- bit Dlflag = 0; //開始計時標志位
- unsigned char T1RH = 0; //T0重載值的高字節
- unsigned char T1RL = 0; //T0重載值的低字節
- void GetFrequency(); //獲取方波脈沖函數
- void ConfigTimer1(unsigned int ms); //配置T1定時器中斷
- unsigned char code LedChar[]={
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- };
- unsigned char LedBuff[3]={
- 0xc0, 0xc0, 0xc0
- };
- /*500ms延時函數*/
- void Delay500ms() //@24.000MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 61;
- j = 225;
- k = 62;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /** 主函數 **/
- void main()
- {
- P1M0 = 0x00; //配置P1口為雙向IO
- P1M1 = 0x00;
- P3M0 |= 0x00; //配置P3.5 P3.7 P3.7為雙向IO,其他為高阻輸入
- P3M1 &= 0x1f;
- TMOD &= 0xf0; //清零T0的控制位
- TMOD |= 0x05; //設置T0為計數器 工作模式1 用P3^4/T0進行脈沖計數
- EA = 1;
- ConfigTimer1(2); //2ms定時器1中斷
- while (1)
- {
- GetFrequency();
- Delay500ms();
- }
-
- }
- void GetFrequency()
- {
- unsigned char th1,th2,tl; //用于TH0,TL0值的存放
- unsigned int num,temp2; //num保存脈沖數,temp2計算顯示用
- float temp = 0; //浮點數
- flag1s = 0;
- Dlflag = 1;
- TH0 = 0; //清零TH0準備計數
- TL0 = 0; //清零TL0準備計數
- IT0 = 1; //設置T0低電平計數
- ET0 = 1; //打開T0使能中斷
- TF1 = 1; //進入T1中斷
- TR0 = 1; //啟動T0開始計數
- while(!flag1s)//flag1s標記位
- ET0 = 0; //關閉T0使能中斷
- TR0 = 0; //關閉T0
- while(1)
- {
- th1 = TH0; //讀取TH0值
- tl = TL0; //讀取TL0值
- th2 = TH0; //再次讀取TH0值
- if(th1 == th2) //對比讀取的2次TH0值,確保沒TL0沒進位后退出
- {
- break;
- }
-
- }
- //關中斷防止計算出錯
- EA = 0;
- num = th1*256 + tl; //計算脈沖數
- temp = num;
- if(temp<1000)
- {
- temp2 = temp;
- LedBuff[2] = LedChar[temp2%10];
- LedBuff[1] = LedChar[temp2/10%10];
- LedBuff[0] = LedChar[temp2/100%10];
- }
- else
- {
- temp = temp/10;
- if(temp < 1000)
- {
- temp2 = temp;
- LedBuff[2] = LedChar[temp2%10];
- LedBuff[1] = LedChar[temp2/10%10];
- LedBuff[0] = LedChar[temp2/100%10];
- LedBuff[0] &= 0x7f;
- }
- else
- {
- temp2 = temp/10;
- LedBuff[2] = LedChar[temp2%10];
- LedBuff[1] = LedChar[temp2/10%10];
- LedBuff[0] = LedChar[temp2/100%10];
- LedBuff[1] &= 0x7f;
- }
- }
- EA = 1;
-
- }
- /* 配置并啟動T1,ms-T0定時時間 */
- void ConfigTimer1(unsigned int ms)
- {
- unsigned long tmp; //臨時變量
-
- tmp = 24000000 / 12; //12T定時器
- tmp = (tmp * ms) / 1000; //計算所需的計數值
- tmp = 65536 - tmp; //計算定時器重載值
- tmp = tmp; //補償中斷響應延時造成的誤差
- T1RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
- T1RL = (unsigned char)tmp;
- TMOD &= 0x0f; //清零T1的控制位
- TMOD |= 0x10; //配置T1為模式1
- TH1 = T1RH; //加載T0重載值
- TL1 = T1RL;
- ET1 = 1; //使能T0中斷
- TR1 = 1; //啟動T0
- }
- /*數碼管掃描*/
- void LedScan()
- {
- static unsigned char i = 0;
-
- P1 = 0xff;
- switch(i)
- {
- case 0: DIG1 = 0; DIG2 = 1; DIG3 = 1; i++; P1 = LedBuff[0]; break;
- case 1: DIG1 = 1; DIG2 = 0; DIG3 = 1; i++; P1 = LedBuff[1]; break;
- case 2: DIG1 = 1; DIG2 = 1; DIG3 = 0; i=0; P1 = LedBuff[2]; break;
- default: break;
- }
- }
- /*定時器1中斷*/
- void InterruptTimer1() interrupt 3
- {
- static unsigned int tc = 0;
- TH1 = T1RH;
- TL1 = T1RL;
-
- LedScan();
- if(Dlflag)
- {
- tc++;
- if(tc >= 500)
- {
- tc = 0;
- Dlflag = 0;
- flag1s = 1;
- }
- }
- }
復制代碼 |