使用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;
- }
- }
- }
复制代码 |