C8051F330用T0对外部计数,输入引脚怎么定义
发布网友
发布时间:2022-04-23 15:11
我来回答
共3个回答
热心网友
时间:2023-09-18 09:47
这个要设置PxSKIP来实现,一般C8051Fxxx系列的MCU都是引脚复用的,如果不设置引脚跳过,T0默认从P0.0使用,如果跳过的过,一直向下排,直到分配到没有跳过的引脚。这个在datasheet里有一张图解释,datasheet: 14.1.Priority Crossbar Decoder节有两个表,第一个表是晶振引脚没有跳过时的引脚使用优先级排布表,第二个是跳过P0.2,P0.3晶振使用的引脚后的优先级排布表,仔细看一下,拿个板子一试就知道了。以下程序就可完成P0.0口的外部输入计数。你可以参考一下。
#include <C8051F330.h>
unsigned int m_counter = 0;
void SysInit(void)
{
PCA0MD &= ~0x40;//关闭WDT
}
void Port_Init(void)
{
P0MDIN = 0x01; //设置P0.0不为模拟输入,因为要检测的是外部TTL电平
P0SKIP = 0x00; //都不跳过,因此MCU检测外部脉冲从P0.0口
XBR1 = 0x50;//交叉开关使能,T0连接到端口
}
void Timer_Init(void)
{
TMOD = 0x06;//T0计数外部引脚,8-bit reload
TH0 =0xFE; //设定重载值为0xFE,让T0再记一个数就溢出,进入中断服务程序。
//如果外部引脚有输入脉冲,T0就会计数,转而进入中断ISR,如果
//能进入ISR,说明已经记录外部引脚输入。
TL0 = TH0;
TR0 = 1; //定时器0工作
}
void Timer_ISR(void) interrupt 1
{
m_counter++; //外部脉冲计数
}
void main(void)
{
SysInit();
Port_Init();
Timer_Init();
EA = 1; //打开全局中断
ET0 = 1; //允许定时器0中断
while(1);
}
热心网友
时间:2023-09-18 09:47
这个要设置PxSKIP来实现,一般C8051Fxxx系列的MCU都是引脚复用的,如果不设置引脚跳过,T0默认从P0.0使用,如果跳过的过,一直向下排,直到分配到没有跳过的引脚。这个在datasheet里有一张图解释,datasheet: 14.1.Priority Crossbar Decoder节有两个表,第一个表是晶振引脚没有跳过时的引脚使用优先级排布表,第二个是跳过P0.2,P0.3晶振使用的引脚后的优先级排布表,仔细看一下,拿个板子一试就知道了。以下程序就可完成P0.0口的外部输入计数。你可以参考一下。
热心网友
时间:2023-09-18 09:48
330有CrossBar吗? 有的话你要看CrossBar那章和关于P0MDIN这些寄存器来定义输入或输出
C8051F330用T0对外部计数,输入引脚怎么定义
这个要设置PxSKIP来实现,一般C8051Fxxx系列的MCU都是引脚复用的,如果不设置引脚跳过,T0默认从P0.0使用,如果跳过的过,一直向下排,直到分配到没有跳过的引脚。这个在datasheet里有一张图解释,datasheet: 14.1.Priority Crossbar Decoder节有两个表,第一个表是晶振引脚没有跳过时的引脚使用优先级...