普通51的话需要模拟PWM,如果是加强版51有内置PWM模块,
PIC和AVR以及430还有STM也有集成PWM的型号!
如果是单纯输出方波的话就简单了。
程序如下:
//功能,按下P1_0的开关降低频率,按P1_1为升高频率
#include
#define uchar unsigned char //替换简称
#define uint unsigned int //替换简称
uchar sm; //定义临时变量
void delay_ms(uint ms) //延时子函数,一个循环12uS
{
while(--ms);
}
void T0_IRQ(void) interrupt TF0_VECTOR //定时器0中断函数
{
TH0=sm; //将变量赋予定时器0的高位
P2_0=!P2_0; //翻转IO
}
//寄存器初始化子函数
void mcu_init()
{
ET0=1; //开定时器0中断
EA=1; //开总中断
TMOD=0x01; //设置为16位定时器0
TH0=0xFF; //填充定时器高位
TR0=1; //开定时器0
sm=0xFF; //变量初始化
}
void main() //主函数
{
mcu_init(); //调用初始化函数
while(1) //主循环
{
if((!P1_0)||(!P1_1)) //检测是否有按键按下
{
delay_ms(8333); //延时去抖
if(!P1_0) //如果是P1_0按键按下
{
while(!P1_0); //等待按键放手
if(sm) //检测变量不为0
{
--sm; //自减1
P2_1=1; //取消边界LED
}
else P2_1=0; //到达边界点亮LED
}
else if(!P1_1) //否则如果P1_1按键按下
{
while(!P1_1); //等待按键放手
if(sm<0xFF) //检测变量小于0xFF
{
++sm; //自加1
P2_1=1;
}
else P2_1=0;
}
}
}
}
#include
#define uchar unsigned char
#define CLOCK P1.0
void delay_ms(uchar ms) //延时函数
{
uchar i,j;
for(i=ms;ms>0;i--)
for(j=0;j<110;j++)
}
void main() //主函数
{
while(1)
{
CLOCK=0; //P1.0输出低电平
delay_ms(50); //延时
CLOCK=1; //P1.0输出高电平
delay_ms(50); //延时
}
}
这个简单啊,最简单的就是高电平是5V低电平是0V这也是方波啊。用单片机的定时器就可以形成方波信号。不明白1819944815可以交流,验证就输单片机
方波就是高低电平的转换啊
MOV R1,#72
MOV A,#00H
MOV DPTR,#6000H
LOOP4:MOV 20H,A
MOVC A,@A+DPTR
MOV R2,DPL
MOV R3,DPH
MOV DPTR,#0FEFFH
MOVX @DPTR,A
MOV DPL,R2
MOV DPH,R3
MOV A,20H
INC A
DJNZ R1,LOOP4
LJMP START
while(1) P1.0 ^= 1;