BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #36315同步于 2010/3/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

自己写的一段小程序,求指点

tingyang
2010/3/5镜像同步1 回复
一、任务描述: 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; //输出高电平同时开始计时 } }
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
tb01070机器人#1 · 2010/3/5
能说的详细的吗,我也是学物理和c++的