标题: 利用单片机定时/计数器T0实现对输入脉冲信号4分频.怎么弄啊? [打印本页]

作者: wgxawwy    时间: 2021-5-26 16:16
标题: 利用单片机定时/计数器T0实现对输入脉冲信号4分频.怎么弄啊?
我的理解是单片机晶振频率为6mhz,一个机器周期2us,实现四分频就是变成一个周期8us,然后编程proteus用示波器显示出来
程序这样子,但是我感觉不太对啊,求指导。
# include <reg51.h>
sbit LED0=P1^4;
void main()
{
TMOD = 0x01;
TH0 = 65534/ 256;
TL0 = 65534% 256;
EA = 1; ET0 = 1;
TR0 = 1;
while(1) {; }
}
void T0_int( ) interrupt 1
{
TH0 = 65534 / 256;
TL0 = 65534 % 256;
LED0 = !LED0;
}


作者: tyrl800    时间: 2021-5-26 20:23
你程序里没有输入信号吧
作者: Tuier    时间: 2021-5-26 20:29
本帖最后由 Tuier 于 2021-5-26 20:35 编辑

#include<reg52.h>

sbit input=P1^0;
sbit output=P1^1;

void main()
{
        TMOD=0x051;                 //模式设置,定时计数器0用于定时,定时计数器1用于计数

        TR0=1; //打开定时器0
        TR1=1; //开通TR1计数器
        TH0=(65536-46080)/256;// 计时器每隔50000微秒(晶振11.0592MHz)发起一次中断。
        TL0=(65536-46080)%256;

        ET0=1;                         //开定时器0中断        
        EA=1;                         //开总中断
        while(1)
        {//TL1为定时计数器1对应的内部寄存器的低八位。每当外部脉冲由1变为0时,其值加一。

                if(TL1==2)        //对从T1端口采得的波形四分频。1为二分频,2为四分频,3为6分频,以此类推。
                                        //每计数一次(即采的模拟输入方波的一个周期),即执行此函数
                        {
                                output=~output;//模拟方波的周期为100ms,而此处,每隔一个输入方波的周期,
                                               //输出信号电平变换一次,故其周期为200ms,实现了二分频。
                                TL1=0;
                        }
        }
}

void timer0() interrupt 1
{
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        input=~input; //定时器每隔50ms发起一次中断,input电平变换一次,故模拟输入方波的周期为100ms

}

无标题.jpg (269.3 KB, 下载次数: 62)

无标题.jpg

作者: wulin    时间: 2021-5-26 20:43
  1. #include <reg51.h>

  2. sbit LED0=P1^4;

  3. void main()
  4. {
  5.         TMOD = 0x05; //外部脉冲计数
  6.         TH0 = 65534/ 256;
  7.         TL0 = 65534% 256;
  8.         EA = 1;
  9.         ET0 = 1;
  10.         TR0 = 1;
  11.         while(1);
  12. }

  13. void T0_int( ) interrupt 1
  14. {
  15.         TH0 = 65534 / 256;
  16.         TL0 = 65534 % 256;
  17.         LED0 = !LED0;
  18. }
复制代码

作者: Tuier    时间: 2021-5-26 20:58

#include<reg52.h>

sbit input=P1^0;
sbit output=P1^1;

void main()
{
        TMOD=0x051;                 //模式设置,定时计数器0用于定时,定时计数器1用于计数

        TR0=1; //打开定时器0
        TR1=1; //开通TR1计数器
        TH0=(65536-46080)/256;// 计时器每隔50000微秒(晶振11.0592MHz)发起一次中断。
        TL0=(65536-46080)%256;

        ET0=1;                         //开定时器0中断       
        EA=1;                         //开总中断
        while(1)
        {//TL1为定时计数器1对应的内部寄存器的低八位。每当外部脉冲由1变为0时,其值加一。

                if(TL1==2)        //对从T1端口采得的波形四分频。
                                        //每计数一次(即采的模拟输入方波的一个周期),即执行此函数
                        {
                                output=~output;//模拟方波的周期为100ms,而此处,每隔一个输入方波的周期,
                                               //输出信号电平变换一次,故其周期为200ms,实现了二分频。
                                TL1=0;
                        }
        }
}

void timer0() interrupt 1
{
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        input=~input; //定时器每隔50ms发起一次中断,input电平变换一次,故模拟输入方波的周期为100ms

}

无标题.jpg (269.3 KB, 下载次数: 78)

无标题.jpg

作者: 杨超韩国    时间: 2021-5-26 21:12
于 2021-5-26 20:43 | 只看该作者 #include <reg51.h>  sbit LED0=P1^4;  void main() {         TMOD = 0x05; //外部脉冲计数         TH0 = 65534/ 256;          TL0 = 65534% 256;         EA = 1;          ET0 = 1;         TR0 = 1;          while(1); }  void T0_int( ) interrupt 1 {         TH0 = 65534 / 256;          TL0 = 65534 % 256;         LED0 = !LED0; }
作者: wgxawwy    时间: 2021-5-26 22:13
Tuier 发表于 2021-5-26 20:58
#include

sbit input=P1^0;

谢谢大哥,我悟了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1