找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于STC15W204S单片机的计数器

[复制链接]
跳转到指定楼层
楼主
ID:387938 发表于 2023-2-19 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人不才,以前的时候学过stc51单片机,用过定时器0和定时器1的方式0模式,在51单片机里是设置TMOD  基本就是设置选择哪个定时器  哪个模式,然后就是定时器赋值,然后再开启定时器,开启总中断。然后就写主程序和中断程序


今天到手了一个stc15w204s的单片机,查了手册的时候才发现只有定时器0和定时器2,定时器0是内部计时,定时器2是可计时可计数(P3.2)然后找了一顿也没看懂  貌似T0设置TMOD  T2设置AUXR


但是网上没有找到类似的文章,而且我用了定时器0号选择内部1秒中断  发现已经对AUXR赋值了 也没搞懂为什么要这样写 AUXR &= 0x7F;  直接写AUXR = 0x7F;不可以吗  



想请各位大佬帮忙解决一下,大概意思就是 用定时器t0获得一个一秒的中断  用T2做计数器  用来获得外部脉冲进行测速(每秒一转)   


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

使用道具 举报

沙发
ID:579397 发表于 2023-2-20 02:32 | 只看该作者
void main()
{
P0M0=0x00;P0M1=0x00;
P1M0=0x00;P1M1=0x00;
P2M0=0x00;P2M1=0x00;
P3M0=0x00;P3M1=0x00;
P4M0=0x00;P4M1=0x00;
P5M0=0x00;P5M1=0x00;
P6M0=0x00;P6M1=0x00;
P7M0=0x00;P7M1=0x00;
AUXR &= 0x7F;        //定时器时钟12T模式
TMOD &= 0xF0;        //设置定时器模式
TL0=0xB0;        //设置定时初始值,50毫秒@12.000MHz
TH0=0x3C;        //设置定时初始值,50毫秒@12.000MHz
TF0=0;        //清除TF0标志
TR0=1;        //定时器0开始计时
ET0=1;  //使能定时器0中断
AUXR |= 0x04;  //定时器2为1T模式
AUXR |= 0x08;  //T2_C/T=1, T2(P3.1)引脚为时钟源
T2H=T2L=0xff;  //初始化计时值
AUXR |= 0x10;  //定时器2开始计时
IE2 |= 0x04;  //开定时器2中断
EA=1;
while (1);
}

void tm0_isr() interrupt 1
{
static unsigned char count,counts;
if(count++==20)        //50ms*20 → 1s
{
//1秒定时
}
}

void t2int() interrupt 12  //中断入口
{
//计数器
}
回复

使用道具 举报

板凳
ID:1034262 发表于 2023-2-20 10:12 | 只看该作者
楼主是否看错资料?

1、定时/计数器0和2都可以定时或对外计数,对外计数时定时器0从P1.2输入脉冲,定时器2从P3.1输入脉冲。

2、没搞懂为什么要这样写 AUXR &= 0x7F;  直接写AUXR = 0x7F;不可以吗 ?
    楼主可能很少编程,这是标准做法。
    AUXR &= 0x7F 是对AUXR的bit7请0,其余位不变。
    AUXR = 0x7F   是将bit7写入0,其余位写入1,跟上面的操作差别很大的。重新看看C语言吧。

3、用定时器t0获得一个一秒的中断  用T2做计数器 来测速。
     对于一圈一个脉冲的,这种方法很慢,误差也很大,一般用测周期的方式计算转速。
     如果是300线以上的同轴编码器则可以。
回复

使用道具 举报

地板
ID:879348 发表于 2023-2-21 09:59 | 只看该作者
打开STC下载软件,找到对应型号,点开右边的范例程序,里面基本所有外设操作都有,整合的时候注意共用的寄存器操作即可
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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