感悟网 导航

用单片机 输出50hz方波 用两个按键调节占空间比例 初始值为最低 89c52单片机做 帮写个程序吧 用89C52系列单片机实现能输出0.1~50Hz的正弦波、三...

作者&投稿:欧狭 (若有异议请与网页底部的电邮联系)
大师,从外部输入方波,怎么对89C52单片机编程对方波进行脉冲计数啊?不过我没分了,您能帮一下忙吗?~

对方波进行脉冲计数,方法很多,可以在T1,T0输入,也可以在INT0,INT1输入。
计数之后,又该怎样处理?
如果当场显示就是计数器;
如果每秒钟显示一次,就是频率计;
如果统计每分钟的次数,就是脉搏测量仪器。
这些应用的电路和程序,在我的空间里面都有的,欢迎来踩。

你好!这个实现还是有难度的?显示用什么呢,数码管还是液晶?

50Hz的方波相当于20ms周期,用定时器来做12M晶振下定时计数值为20000,占空比每1%为200,所以可以做如下参考程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit pulse=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
uint zkb;
uchar flag;
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
void t0isr() interrupt 1
{
if(flag)
{
flag=0;
TR0=0;
TH0=(65536-zkb*200)/256;
TL0=(65536-zkb*200)%256;
TR0=1;
pulse=1;
}
else {
flag=1;
TR0=0;
TH0=(65536-(20000-zkb*200))/256;
TL0=(65536-(20000-zkb*200))%256;
TR0=1;
pulse=0;
}
}
main()
{
TMOD=0x01;
TH0=(65536-zkb*200)/256;
TL0=(65536-zkb*200)%256;
zkb=50;
flag=1;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
zkb++;
if(zkb==100)zkb=1;
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
zkb--;
if(zkb==0)zkb=99;
}
}
}
}

#include<reg52.h>
#define TRUE 1
#define FALSE 0
#define uint unsigned int
#define uchar unsigned char
sbit si=P1^0;// LED灯
sbit add=P3^6; // 加 占空比
sbit dec=P3^7;// 减
uint idata a,b,c;
//-------------------------------------------------------
void Delay_1ms(uint x)
{
uint j;
while(x--)
{
for(j=0;j<125;j++) //
{;}
}
}
void main()
{
P1=0xff;
P3=0xff;
a=20000;// 频率 1 ~ 60000
b=50;// 占空比 1 ~ 100
c=b;
TMOD=0x01;
TH0=(65536-a)/256; //设置PWM波周期
TL0=(65536-a)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if (!add)
{
Delay_1ms(3);
if (!add)
{
if (b<100) {b++;};
};
//while (!add); // 这行打开后, 按一次键加一占空比数字
};
if (!dec)
{
Delay_1ms(3);
if (!dec)
{
if (b>1) {b--;};
};
//while (!dec);
};
};
}
void timer0() interrupt 1 using 1
{
if (c>0)
{
c--;
}
else
{
if(si)
{
si=FALSE;
c= 100-b;
}
else
{
si=TRUE;
c= b;
};
};
TH0=(65536-a)/256; //设置PWM波周期
TL0=(65536-a)%256; //重新装载,如果时间能够满足要求,最好自动装载的模式
}

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网