普通51的話需要模擬PWM,如果是加強版51有內置PWM模塊,
PIC和AVR以及430還有STM也有集成PWM的型號!
如果是單純輸出方波的話就簡單了。
程序如下:
//功能,按下P1_0的開關降低頻率,按P1_1為升高頻率
#include<AT89X52.H> ?//引用AT89X52的庫文件
#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;
}
}
}
}