普通51的话需要模拟PWM,如果是加强版51有内置PWM模块,
PIC和AVR以及430还有STM也有集成PWM的型号!
如果是单纯输出方波的话就简单了。
程序如下:
//功能,按下P1_0的开关降低频率,按P1_1为升高频率
#include<AT89X52.H> //引用AT89X52的库文件
#defineucharunsignedchar //替换简称
#defineuintunsignedint //替换简称
ucharsm; //定义临时变量
voiddelay_ms(uintms) //延时子函数,一个循环12uS
{
while(--ms);
}
voidT0_IRQ(void)interruptTF0_VECTOR //定时器0中断函数
{
TH0=sm; //将变量赋予定时器0的高位
P2_0=!P2_0; //翻转IO
}
//寄存器初始化子函数
voidmcu_init()
{
ET0=1; //开定时器0中断
EA=1; //开总中断
TMOD=0x01; //设置为16位定时器0
TH0=0xFF; //填充定时器高位
TR0=1; //开定时器0
sm=0xFF; //变量初始化
}
voidmain() //主函数
{
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
}
elseP2_1=0; //到达边界点亮LED
}
elseif(!P1_1) //否则如果P1_1按键按下
{
while(!P1_1); //等待按键放手
if(sm<0xFF) //检测变量小于0xFF
{
++sm; //自加1
P2_1=1;
}
elseP2_1=0;
}
}
}
}
㈡ 用单片机实现方波的产生,代码应该如何写
可以用单片机的定时器功能啊,你分别算出这两个方波的半周期,然后设置定时初值,到时就产生中断,然后进入中断程序,在中断程序中队输出口取反(开始的时候一定要置高或置低),总之要在1/2t内有电平的高低变换
㈢ 用单片机发生方波 程序
假设方波的周期为8微秒 如图所示 由p1.0引脚产生方波
定时时间=方波周期/2=4微秒
定时时间 t=(2的8次方-X)12/(12×1000000)=(256-x)×1微秒
X=256-4=252=0FCH 由于定时时间很短 工作在方式可以选择方式2 为8位自动重装载的
选择定时器T1定时
参考程序
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV TMOD,#20H
MOV TH1,#0FCH
MOV TL1,#0FCH
SETB TR1
LL31: JNB TF1,LL31
CLR TF1
CPL P1.0
SJMP LL31
哈啊 别忘了 要为俺选择(满意回答)
㈣ 如何用单片机产生正弦波,方波(附图,程序)
就是让某一个I/O口输出高低电平,例如让P0^0输出1HZ的方波吧,就是让它持续500ms的高电平,500ms的低电平,程序如下
#include
sbit
L1=P0^0;
void
delay1ms();
void
main()
{
LI=1;
delay1ms(500)
L1=0;
delay1ms(500);
}
㈤ 单片机方波是什么意思,什么是一个方波,如何控制,最好举例说明一下
矩形波是一种底部和顶部水平,上升沿和下降沿接近垂直的波形,而方波是矩形波的一种特殊情况(占空比为50%)。把占空比不是50%的矩形波叫成方波是错误的,至少是不严谨的。至于对称与否,那是对电压而言,不是针对占空比。
你在提问中说要“控制”方波,不知你要怎么控制?
㈥ 单片机如何产生多路不同频率的方波
如果将P1口的变化写成二进制的方式,你就容易理解了。
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0
。
。
。
看出规律了吗?P1.0中断一次变换一次,P1.1中断两次变换一次,P1.2中断4次变换一次,依次类推,一次中断时间是500us,那么产生的脉冲周期就是P1.0为500*2us=1ms,P1.1为2ms,P1.2为4ms依次类推
㈦ 单片机中把两个16位无符号单字节数求和相加,设计程序
如果把6MHZ改成12MHZ程序应该怎么改?
可以使用方式1。
X = M-N = 65 536 - 1 000 = 64 536 = FC 18H
需要修改的指令为如下三条。
MOV TH0, #0FCH ; T0赋初值
MOV TL0, #18H
MOV TMOD, #01H
========================
如果把题目改成把两个16位无符号单字节数求和相加,程序怎么变化?
把:
ADDC A, @R1 ; 两个高位字节带Cy相加
改为:
ADD A, @R1 ; 两个高位字节带Cy相加
即可。