找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于8051单片机芯片的计数器设置问题

[复制链接]
跳转到指定楼层
楼主
ID:648939 发表于 2019-12-11 12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断采用外部脉冲计数,计数器1工作,我想设置收到脉冲400次后进入中断,运行后发现最大只能设置255次,求帮忙解决。
代码如下:
void Timer1Init()
{
        TMOD=0x60;  //设置定时器1,采用的是计数器0,工作模式1(M1=0,M0=1)                             
        TL1 =1;                //设置定时初值
        TH1 =1;     //设置定时重载值
        TF1 = 0;                        //清除TF1标志
        TR1 = 1;                        //定时器1开始计数
        EA=1;                        //开总中断
        ET1=1;                        //开定时器1中断   

}

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

使用道具 举报

沙发
ID:94031 发表于 2019-12-11 14:02 | 只看该作者
你设置的是8位计数器,最大255,你可以设置16位计数器 TMOD=0x50;
回复

使用道具 举报

板凳
ID:275826 发表于 2019-12-11 14:07 | 只看该作者
TMOD=0x60;改成TMOD=0x50;吧
回复

使用道具 举报

地板
ID:235200 发表于 2019-12-11 14:10 | 只看该作者
TL1 =1;                //设置定时初值
TH1 =1;     //设置定时重载值
这两条的初值应为0
要计数400次,要把TH1高8位和TL1低8位两个8位寄存器的数据转变为16位的数据
如转换结果存放count =(TH1<<8)+TL1,再用count来判断是否400次
回复

使用道具 举报

5#
ID:213173 发表于 2019-12-11 15:15 | 只看该作者
定时器被你设置为8位重装,脉冲400次后进入中断的初值也不对。所以最大只能设置255。示例如下:
  1. #include <reg51.h>

  2. sbit LED=P1^0;

  3. void InitTimer1(void)
  4. {
  5.         TMOD = 0x50;
  6.         TH1 = 0xFE;
  7.         TL1 = 0x70;
  8.         EA = 1;
  9.         ET1 = 1;
  10.         TR1 = 1;
  11. }

  12. void main(void)
  13. {
  14.         InitTimer1();
  15.         while(1);
  16. }

  17. void Timer1Interrupt(void) interrupt 3
  18. {
  19.         TH1 = 0xFE;
  20.         TL1 = 0x70;
  21.         LED=~LED;
  22. }
复制代码

回复

使用道具 举报

6#
ID:648939 发表于 2019-12-11 16:48 | 只看该作者
我现在设置成0x40可以计数到几百了,就是不知道计数中断的规则,设什么数字出什么结果。
void Timer1Init()
{
                TMOD=0x40;  //设置定时器1,采用的是计数器0,工作模式1(M1=0,M0=1)                             
        TL1 =8191;                //设置定时初值
        TH1 =8180;     //设置定时重载值
                TF1 = 0;                        //清除TF1标志
        TR1 = 1;                        //定时器1开始计数
        EA=1;                        //开总中断
        ET1=1;                        //开定时器1中断   

}
回复

使用道具 举报

7#
ID:7485 发表于 2019-12-11 18:23 | 只看该作者
计数器计到65535就满了,再加1就会溢出,就会产生中断。65536减去你设定的初值就是你需要的次数。如65536-400就是你需要的初值。16进制就是FE6F,FE(254)是TH的初值,6F(111)是TL的初值。
回复

使用道具 举报

8#
ID:213173 发表于 2019-12-12 09:00 | 只看该作者
t20ily 发表于 2019-12-11 16:48
我现在设置成0x40可以计数到几百了,就是不知道计数中断的规则,设什么数字出什么结果。
void Timer1Init( ...

你这样设置TMOD=0x40;定时器是13位。参见5楼完整程序的回帖。
unsigned int X;//计数范围0~65535
void InitTimer1(void)
{
        TMOD = 0x50;//T1模式1,外部计数 0101 0000
        TH1 = (65536-X)/256;//X=计数值
        TL1 = (65536-X)%256;//X=计数值
        EA = 1;
        ET1 = 1;
        TR1 = 1;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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