找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3006|回复: 6
打印 上一主题 下一主题
收起左侧

利用单片机定时/计数器T0实现对输入脉冲信号4分频.怎么弄啊?

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 2 次
跳转到指定楼层
楼主
我的理解是单片机晶振频率为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;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:275826 发表于 2021-5-26 20:23 | 只看该作者
你程序里没有输入信号吧
回复

使用道具 举报

板凳
ID:825397 发表于 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
回复

使用道具 举报

地板
ID:213173 发表于 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. }
复制代码
回复

使用道具 举报

5#
ID:825397 发表于 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
回复

使用道具 举报

6#
ID:927807 发表于 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; }
回复

使用道具 举报

7#
ID:921257 发表于 2021-5-26 22:13 | 只看该作者
Tuier 发表于 2021-5-26 20:58
#include

sbit input=P1^0;

谢谢大哥,我悟了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表