找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机定时/计数器的疑惑

[复制链接]
跳转到指定楼层
#
下面的代码来自STC89C52的手册,代码如下:
#include <reg52.h>

#define FOSC 18432000L
#define T1MS (65535-FOSC/12/1000)

sbit TEST_LED=P2^0;

unsigned int count;

void tm0_isr() interrupt 1
{
        TL0=T1MS;
        TH0=T1MS>>8;
        if(count--==0)
        {
                count=1000;
                TEST_LED=!TEST_LED;
        }
}

void main()
{
        TMOD=0x01;
        TL0=T1MS;
        TH0=T1MS>>8;
        TR0=1;
        ET0=1;
        EA=1;
        count=0;
        
        while(1);
}


代码是用T0定时器,定时1秒翻转led灯,源码如下:

疑问1:
#define FOSC 18432000L   这个18432000L是什么意思?怎么得出来的?
疑问2:
测试这套代码,演示并不准确,是程序本身出了问题,还是我操作有问题?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:517951 发表于 2023-10-14 09:08 | 只看该作者
定时器程序可以自己写, 总体思路是晶振频率(12分频, 可以选择不12分频) 一次 ,定时器就加或减一下. 预设的TH0,TL0 溢出了就进入定时器中断服务函数做处理(翻转IO口电平).  
定时器有一定的精度, 但要求高就要换更高规格的时钟芯片了.
回复

使用道具 举报

板凳
ID:1064915 发表于 2023-10-14 08:29 | 只看该作者
常量也是有类型的,不同类型有不同的存储空间。在常数后面加L,表示此常量为long类型的,占4字节空间.
回复

使用道具 举报

沙发
ID:213173 发表于 2023-10-14 07:39 | 只看该作者
//#define FOSC 18432000L//晶振频率18.432MHz
//#define FOSC 12000000L//晶振频率12.0MHz
#define FOSC 11059200L//晶振频率11.0592MHz
//#define T1MS (65535-FOSC/12/1000)
#define T1MS (65536-FOSC/12/1000)
回复

使用道具 举报

楼主
ID:1085441 发表于 2023-10-14 00:52 | 只看该作者
1,18432000表示晶振频率是18.432MHz
2,单片机平常用的是11.0592M或22.1184M,可能你的单片机晶振频率是这个,与例子不一样,所以定时不准确
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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