返回信息流一、任务描述:
1、输入200~1000Hz频率信号,峰值5V,占比50%,输出4~20mA
2、9~24V供电
二、
编程思路:由外部输入产生中断,t1计时。计时50ms关闭外部中断,将50ms内脉冲个数传给输出控制函数。由t0、t1产生PWM,t1控制占空比,某时刻(t0、t1初始化完毕)输出高电平,t1计时溢出输出低电平同时t0开始计时,溢出返回。循环上述过程。
#include "reg51.h"
//sbit Fin p3^2;
bit I_O; //计时器1状态选择标志,=0时计时50ms,=1是计时50us
sbit Vout=p1^0; //输出口
sfr Freq; //频率值存储器
sfr count; //计数闸门时间内输入脉冲个数
void outputcon(void)//输出控制函数
void initial_int0() //外部中断0初始化
//void initial_t1_50ms() //计时器1初始化,用于测频闸门时间计时
void initial_t1_50us()//T1二次初始化,用于PWM高电平时间计时
void initial_t0()//关外部中断,T0控制PWM低电平时间
void INT_0() //外部中断函数
void Timer_0() //计时器0中断函数
void Timer_1() //计时器1中断函数
void main()
{
while(1)
{
Vout=0; //输出初始值0
/***************************检频***************************************/
IE=0; //禁止所有中断
IP=0xA; //设置T0、T1优先级高于INT0
TMOD=0X11; //设置t0、t1为16位计时方式
initial_int0();//初始化外部中断0
//初始化t1,计时50ms
/***************************频率输出***********************************/
outputcon();
}
}
/************************外部中断0初始化*******************************/
void initial_int0()
{
TI1=1;//下降沿触发
EX0=1; //使能外部中断
EA=1; //使能所有中断
/*****************计时器1第一次初始化,控制闸门时间********************/
TH1=0x3c; //计时初值=65535-50mS/1uS
TL1=0xaf; //取12MHz晶振,1uS=12/12MHz
ET1=1; //开T1中断
TR1=1; //开始计时
EA=1;
I_O=0; //选择计时时长
}
/**********************计时器0初始化,含参*****************************/
void initial_t0(void)
{
IE=0; //关外部中断
TH0=((65485-count)>>8)&0xFF;//给T0送初值
TL0=(65485-count)&0xFF; //T0计时65535-50-count(低电平时间),PWM周期50uS
ET0=1; //使能计时中断
TR0=1; //T0中断优先级高,用来决定PWM周期
EA=1;
}
/********************计时器1二次初始化,控制占空比********************/
void initial_t1_50us(void)
{
TH1=((65535-count)>>8)&0xFF;//给T1赋初值
TL1=(65535-count)&0xFF; //T1决定占空比,即电流大小
ET1=1;
TR1=1;
EA=1;
I_O=1;
}
/*************************外部中断函数*******************************/
void INT_0(void) interrupt0 using 0
{
count++; //计脉冲个数
}
/*************************计时器0中断函数****************************/
void Timer_0(void) interrupt1 using 1
{
//计时到50us-高电平时间时输出低电平
TF0=0; //清除T0溢出标志
ET1=0; //关闭计时器1
ET0=0; //关闭计时器0并返回
}
/************************计时器1中断函数****************************/
void Timer_1(void) interrupt1 using 2
{
if(I_O==0) //I_O=0时执行50ms中断
{
TF1=0; //清除溢出标志
EX0=0; //关闭外部中断0
return;
}
if(I_O==1) //I_O=1时执行50us中断
{
Vout=0; //输出低电平
TF1=0; //清除溢出标志
}
}
/*****************输出控制子程序************************/
void outputcon(void)
{
if(count==0)
Vout=0; //无频率信号输入
else
{
Freq=cout*20; //暂存频率值,单位Hz
initial_t0(); //初始化t0
initial_t1_50us(); //初始化t1
Vout=1; //输出高电平同时开始计时
}
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #36315同步于 2010/3/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
自己写的一段小程序,求指点
tingyang
2010/3/5镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复