普通51的話需要模擬PWM,如果是加強版51有內(nèi)置PWM模塊,
成都創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的達州服務(wù)器托管服務(wù)
PIC和AVR以及430還有STM也有集成PWM的型號!
如果是單純輸出方波的話就簡單了。
程序如下:
//功能,按下P1_0的開關(guān)降低頻率,按P1_1為升高頻率
#includeAT89X52.H ?//引用AT89X52的庫文件
#define?uchar?unsigned?char ?//替換簡稱
#define?uint??unsigned?int ?//替換簡稱
uchar?sm; //定義臨時變量
void?delay_ms(uint?ms) //延時子函數(shù),一個循環(huán)12uS
{
while(--ms);
}
void?T0_IRQ(void)?interrupt?TF0_VECTOR ?//定時器0中斷函數(shù)
{
TH0=sm; ?//將變量賦予定時器0的高位
P2_0=!P2_0; ?//翻轉(zhuǎn)IO
}
?//寄存器初始化子函數(shù)
void?mcu_init()
{
ET0=1; //開定時器0中斷
EA=1; ??? //開總中斷
TMOD=0x01;? //設(shè)置為16位定時器0
TH0=0xFF; //填充定時器高位
TR0=1; //開定時器0
sm=0xFF; //變量初始化
}
void?main() //主函數(shù)
{
mcu_init(); //調(diào)用初始化函數(shù)
while(1) //主循環(huán)
{
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(sm0xFF) //檢測變量小于0xFF
{
?? ++sm; ? //自加1
P2_1=1;
}
else?P2_1=0;
}
}
}
}
附上代碼,講解在后面:
public class Program
{
static void Main(string[] args)
{
ListPoint range = new ListPoint(5 * 5);
for (int i = 0; i 5; i++)
{
for (int j = 0; j 5; j++)
{
range.Add(new Point { X = j, Y = i });
}
}
//移動方向的順序
MoveDirection[] md = new[]
#include
sbit wave=P1^0;
void SetupTimer0()
{
TMOD = 0XF0; //僅保留T1信息
TMOD |= 0X02; //設(shè)置T0: 定時功能,方式2,自動重載8位定時器/計數(shù)器
TH0 = 256-250;//定時每0.25ms中斷一次
TL0 = 256-250;
TR0 = 1; //開啟定時器
ET0 = 1; //定時器0中斷打開
}
data unsigned char us250;
data unsigned int ms;
bit WAVE; //用以記住當前wave的狀態(tài)
void Timer0_ISR() interrupt 1 //定時中斷服務(wù)程序,為按鍵消抖服務(wù)
{
if (++us2504) return;
us250=0; ++ms;
if (ms10) return;
//每10ms波形變化一次,20ms完成一個波形,所以波形是50Hz的
ms=0;
WAVE=~WAVE; wave=WAVE; //方波輸出
}
void main()
{
us250=ms=0;
wave=WAVE=0;
SetupTimer0();
EA = 1; //全局中斷打開
while(1); //在中斷函數(shù)中實現(xiàn)方波輸出
}
最好還是不要用延時函數(shù)
比較準確的方法是利用定時器
以c51為例:
/*********定時器方波************/
/*********16位定時器************/
/************機器周期1us********/
/*********占空比50%*************/
/*********方波周期1s*************/
int a; // 定義全局整形變量
void int() interrupt 1
{
設(shè)置定時器初值為500;
a++;
if(a == 1000)
{
"輸出取反"
}
}
當前題目:c語言里的方波函數(shù) 方波 函數(shù)
路徑分享:http://www.rwnh.cn/article32/dodocsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、外貿(mào)建站、搜索引擎優(yōu)化、服務(wù)器托管、網(wǎng)站營銷、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)