‘壹’ 如何用单片机接收脉冲信号
STC15W系列单片机,采用外部INT触发中断(可以上升沿 与下降沿 同时使能), 脉冲输入信号用电阻分压就可以(峰值控制在 3.3 或者 5V,根据VCC电源),可以运行 在 空闲时 掉电状态(单片机 掉电状态 电流在 微安 级 低功耗)。
‘贰’ STC12C5A60S2单片机如何接收计数脉冲信号脉冲信号需要电压范围吗对外部脉冲信号的要求是什么
STC12C5A60S2中有2个定时/计数器T0和T1,对应外部引脚是P3.4和P3.5,你可以用其中一个定时/计数器接收脉冲信号。以T1定时器为例,把需要计数的脉冲接在P3.5口,编程时把TOMD定时器中的TOMD.6设置为1(即设为计数工作模式),通过读取寄存器TH1,TL1值得到脉冲的计数值。需要注意的是最大计数值为65535,超过计数范围则翻转,启动计数前先把TH1,TL1清零。脉冲信号的电压范围是0~5V,脉冲宽度不小于1个机器周期。如果脉冲信号和单片机不共地,最好用光耦隔离。
‘叁’ 求大神帮忙写个51单片机的接收脉冲程序。
用计数器T1的中断控制蜂鸣器发出1KHz音频
#include<reg51.h> // 包含51单片机寄存器定义的头文件
sbit sound=P3^7; //将sound位定义为P3.7引脚
/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
EA=1; //开总中断
ET1=1; //定时器T1中断允许
TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1
TH1=(65536-921)/256; //定时器T1的高8位赋初值
TL1=(65536-921)%256; //定时器T1的高8位赋初值
TR1=1; //启动定时器T1
while(1)//无限循环等待中断
;
}
/**************************************************************
函数功能:定时器T1的中断服务程序
**************************************************************/
void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数
{
sound=~sound;
TH1=(65536-921)/256; //定时器T1的高8位重新赋初值
TL1=(65536-921)%256; //定时器T1的高8位重新赋初值
}
改改 就成了你的
‘肆’ 51单片机处理接收的脉冲
核心的思想就是在一个时间段内计算脉冲的数量。可以用外部中断,有下降沿的时候找个标记位标记一下。程序外通过扫描标记位,对脉冲进行计数。
对脉冲计数的时候可以根据脉冲宽度进行一下过滤。脉冲的计数周期也需要根据脉冲输出特性进行调整。
‘伍’ 请大家帮忙:单片机采集外来输入的脉冲,经过处理输出4到20ma的电流。
用51单片机控制的话,我建议如下
1.T1、T0设置工作方式为TMOD=0x52;这意思是,T1工作在16位计数状态,T0工作在8位计时状态
2.T1引线(P3.5)就可以直接接脉冲信号
3.利用定时T0中断,执行中断斗笑读取T1计数的程序。这里要注意设置T0中断的时间,该时间为脉冲最大频率小于65355的时间最好,但你也可以多次采样,求平均值的方法来获得频率F,再把这F存到全局变量K中,就可以了,这里要注意,存的位置是全局变量!!
4.采样来的频率F经过转换如下公式羡销哪转化为数字量D,我举例采用的是8位的D/A,DAC0832是个输出电流型D/A,你也可以选用16位的,可分点就更多了,如果要很精确的话,记得兄码数据类型要用FLOAT来计算结果转为INT,最后赋给D
D=((F+最大频率/5)/最大频率)*256
这里说明下,你要输出的是4~20,F=0时,D要等于4mA