找回密码
 立即注册

QQ登录

只需一步,快速开始

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

要做一个单片机脉冲计数器。结果无论如何就是不成功

[复制链接]
跳转到指定楼层
楼主
本来设计要做了个ADC电路,实验挺成功的。下一步要做一个脉冲计数器。结果无论如何就是不成功。

先声明,我自己做了NE555方波发生器。50%固定占空,频率从 0.72Hz ~ 72kHz 可调产生出来的波形送给51单片机P34引脚。虽然样子丑了点,但是功能完全正常。

单片机型号为STC8A8K64S4A12所有的测试都做过了。先写了一个简单代码,就是检测外部脉冲,LED跟着闪烁就行



测试结果完全正常,说明准双向口输入输出均正常。


但下面妖魔鬼怪就来了。
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. sbit    P05         =   P0^5;

  4. void TM0_Isr() interrupt 1
  5. {
  6.     P05 = !P05;                                 //测试端口
  7. }

  8. void main()
  9. {
  10.     TMOD = 0x04;                                //外部计数模式
  11.     TL0 = 0x08;
  12.     TH0 = 0x00;
  13.     TR0 = 1;                                    //启动定时器
  14.     ET0 = 1;                                    //使能定时器中断
  15.     EA = 1;

  16.     while (1);
  17. }
复制代码

这段程序可不是我写的,是人家STC官方的范例程序,只是测试端口
修改为P05,计数次数改成了8次。然后就没有然后了,我已无法用语言形容。更可恨的是换成定时器1、定时器2、定时器3、定时器4都不能正常计数。甚至连芯片都换了也白搭。

我已无法用见了鬼来形容了,无语了,词穷了。

请各路大神来赐教一下吧,谢谢啦。

51hei图片_20200919213659.jpg (72.43 KB, 下载次数: 82)

51hei图片_20200919213659.jpg

51hei图片_20200919213705.jpg (69.34 KB, 下载次数: 80)

51hei图片_20200919213705.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2020-9-20 09:19 | 只看该作者
你是怎么测试的? 就说不成功
回复

使用道具 举报

板凳
ID:820855 发表于 2020-9-20 10:10 | 只看该作者
亲,你的定时器都没有初始化,时钟都没设定。另外你要检测555定时器的输出脉冲的话,代码不是这么写的。需要用捕获模式,中断函数里面也不对。你这段代码即使把定时器设好了,也是上电闪几次灯的事情,可能太快眼睛都看不见。
回复

使用道具 举报

地板
ID:213173 发表于 2020-9-20 10:39 | 只看该作者
本帖最后由 wulin 于 2020-9-20 17:33 编辑

定时器初值错误,应该是65536-8=65528=0xFFF8,中断中也要重新赋初值FFF8。
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. sbit P05=P0^5;

  4. void TM0_Isr() interrupt 1
  5. {
  6.     P05=!P05;                                 //测试端口
  7.     TL0 = 0xf8;
  8.     TH0 = 0xff;
  9. }

  10. void main()
  11. {
  12.     TMOD = 0x04;                                //外部计数模式
  13.     TL0 = 0xf8;
  14.     TH0 = 0xff;
  15.     TR0 = 1;                                    //启动定时器
  16.     ET0 = 1;                                    //使能定时器中断
  17.     EA = 1;

  18.     while (1);
  19. }
复制代码
回复

使用道具 举报

5#
ID:719608 发表于 2020-9-20 15:47 | 只看该作者
好像有问题,稍后看看
回复

使用道具 举报

6#
ID:342822 发表于 2020-9-20 18:24 | 只看该作者


#include <reg51.h>
#include <stdio.h>


#include "intrins.h"

sbit    P05         =   P0^5;

void TM0_Isr() interrupt 0
{
    P05 = ~P05;                                 //测试端口
}

void main()
{
  EA =1;
        EX0 =1;
        IT0= 1;

    while (1);

}

回复

使用道具 举报

7#
ID:224104 发表于 2020-9-20 20:49 | 只看该作者
本帖最后由 guysxpf 于 2020-9-20 20:52 编辑
wulin 发表于 2020-9-20 10:39
定时器初值错误,应该是65536-8=65528=0xFFF8,中断中也要重新赋初值FFF8。

我明白了,谢谢,定时器是从设定值累加到FF。看来是当时学的原理都忘光了。
学习了,谢谢您!
回复

使用道具 举报

8#
ID:224104 发表于 2020-9-20 20:51 | 只看该作者
laoshu2521 发表于 2020-9-20 10:10
亲,你的定时器都没有初始化,时钟都没设定。另外你要检测555定时器的输出脉冲的话,代码不是这么写的。需 ...

我的代码不是自己写的,是STC官方给的,简单改了改。

不过问题已经有另外两个大神解答了,不过还是谢谢您
回复

使用道具 举报

9#
ID:224104 发表于 2020-9-20 21:02 | 只看该作者
wulin 发表于 2020-9-20 10:39
定时器初值错误,应该是65536-8=65528=0xFFF8,中断中也要重新赋初值FFF8。

初值的定义我理解错了,谢谢指正。。

可是是有一点我不太理解,我选的是自动重载模式,但,您说“中断函数里面要重新赋初值FFF8”,已经自动重载了还有这个必要吗?
回复

使用道具 举报

10#
ID:224104 发表于 2020-9-20 21:02 | 只看该作者

太详细了,谢谢您
回复

使用道具 举报

11#
ID:213173 发表于 2020-9-21 06:00 | 只看该作者
guysxpf 发表于 2020-9-20 21:02
初值的定义我理解错了,谢谢指正。。

可是是有一点我不太理解,我选的是自动重载模式,但,您说“中断 ...

已经设置自动重载模式就不需在中断函数里面重新赋初值。
回复

使用道具 举报

12#
ID:224104 发表于 2020-9-21 11:18 | 只看该作者
wulin 发表于 2020-9-21 06:00
已经设置自动重载模式就不需在中断函数里面重新赋初值。

OK
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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