⑴ 用51單片機產生周期500,占空比%25(高電平125,低電平375)的矩形波,機器周期1us。用匯編和C語言。
;脈寬為500us;占空比為25%,高電平寬度為 500 / 4 = 125us = 125個機器周期
CLKOUT BIT P1.0 ;頻率輸出腳
ORG 00H
JMP MAIN
ORG 0BH
T0_ISR:
JBC CLKOUT,T0_ISR1
INC A
CJNE A,#03H,T0_ISR1
SETB CLKOUT
CLR A
T0_ISR1:
RETI
T0_INIT:
CLR A
SETB CLKOUT
MOV TMOD,#02H
MOV TL0,#(256 - 125)
MOV TH0,TL0
MOV IE,#82H
SETB TR0
RET
MAIN:
MOV SP,#5FH
CALL T0_INIT
JMP $
END
#include<reg51.h>
sbit CLKOUT = P1^0; //頻率輸出腳
unsigned char Cnt;
void T0ISR(void)interrupt 1
{
if(CLKOUT)
{
CLKOUT = 0;
}
else if(++Cnt >= 3)
{
Cnt = 0;
CLKOUT = 1;
}
}
void InitT0(void)
{
Cnt = 0;
CLKOUT = 1;
TMOD = 0x02;
TL0 = 131;
TH0 = 131;
IE = 0x82;
TR0 = 1;
}
void main(void)
{
InitT0();
while(1)
;
}
⑵ 如何用51程序改變占空比
*介紹一個51系列單片機採用脈沖寬度調制(PWM)方式控制LED燈亮度的一個程序,大家都知道,51單片機本身是沒有pwm介面的,這個程序是通過軟體模擬pwm.在一定的頻率的方波中,調整高電平和低電平的占空比,即可實現LED燈亮度控制。程序中使用定時器0產生2.5ms周期脈沖,使用占空比控制變數scale控制占空比,在低電平期間使LED燈亮,在高電平期間使LED燈滅,改變scale就改變了高電平與低電平的時間,因此也就控制了LED燈的亮度。*/#include "AT89X51.H" //模擬PWM輸出控制燈的10個亮度級 unsigned int scale; //占空比控制變數 void main(void) // 主程序 { unsigned int n; //延時循環變數 TMOD=0x02; //定時器0,工作模式2(0000,0010),8位定時模式 TH0=0x06; //寫入預置初值6到定時器0,使250微秒溢出一次(12MHz) TL0=0x06; //寫入預置值 TR0=1; //啟動定時器 ET0=1; //允許定時器0中斷 EA=1; //允許總中斷 while(1) //無限循環,實際應用中,這里是做主要工作 { for(n=0;n<50000;n++); //每過一段時間,就自動加一個檔次的亮度 scale++; //占空比控制變數scale加1 if(scale==10) scale=0; //如果scale=10,使scale為0 } } timer0() interrupt 1 //定時器0中斷服務程序 {unsigned int tt ; //tt用來保存當前時間在一秒中的比例位置 tt++; //每250微秒增加1 if(tt==10) //2.5毫秒的時鍾周期 { tt=0; //使tt=0,開始新的PWM周期 P2_0=0; //使LED燈亮 } if(scale==tt) //按照當前占空比切換輸出為高電平 P2_0=1; //使LED燈滅 } /*程序中從tt=0開始到scale為低電平,從scale開始到tt=10為高電平,由於scale是變數,所以改變scale就可以改變占空比。*/
⑶ AT89C51單片機P1.0口輸出一個周期為7ms,占空比為2:7的矩形波程序,用C語言編寫
高電平時間 7000us*2/9=1556us
低電平時間 7000us-1556=5444
程序大致這樣:
TMOD=0X01;
while(1)
{
P1^0=1;//高電平
TH0=(65536-1556)/256;
TL0=(65536-1556)%256;
TR0=1;
while(TF0==0);//等待定時時間到
TF0=0;TR0=0;//清溢出標志,停止計時
P1^0=0;//低電平
TH0=(65536-5444)/256;
TL0=(65536-5444)%256;
TR0=1;
while(TF0==0);//等待定時時間到
TF0=0;TR0=0;
}
雖然用了定時器,但由於中間有裝定時器初值,開啟定時器等指令,多少會佔用一點時間,
造成周期和占空比有誤 差,因此定時器初值需要微調
⑷ AT80C51單片機,用C語言編寫程序,在單片機的P3.7口產生一個占空比為2:5周期為500ums的方波脈沖信號
占空比為2:5周期為500ums的方波脈沖信號...
----
題目寫錯了。
第一、500ums,不是時間單位。
第二、占空比為2:5,也不是方波。
第三、題目並沒有給出晶振頻率。
因此,凡是按照題目回答的答案,都是錯誤的。
⑸ 51單片機輸出方波,周期20ms,占空比5%,p2^0串口,頻率333HZ,求大神給個c程序!
這是周期為20毫秒的程序,至於你說的頻率333Hz,與前者沖突選用前者
#include<reg51.h>
unsignedcharcnt;
sbitpwm=P2^0;
voidt0isr()interrupt1
{
cnt++;
if(cnt<5)pwm=1;
elsepwm=0;
if(cnt>=100)cnt=0;
}
main()
{
TMOD=0x02;
TH0=56;
TL0=56;
TR0=1;
ET0=1;
EA=1;
while(1);
}
⑹ 51單片機輸出可調節占空比的方波,周期20ms,占空比5%-10%,串口調節,求大神給個c程序。
周期20毫秒,占空比5%~10%,所以高電平為1ms~2ms,以1%變化為調節量(200us)計算來設計程序。
#include<reg51.h>
#define uchar unsigned char
sbit pwm=P1^0;
uchar u_p=5,num=0;
void t0isr() interrupt 1
{
num++;
if(num<=u_p)pwm=1;
if(num>u_p)pwm=0;
num%=100;
}
void uart() interrupt 4
{
if(RI)
{
RI=0;
u_p=SBUF;
}
}
main()
{
TMOD=0x22;
TH0=56;
TL0=56;
TH1=0xfd;
TL1=0xfd;
TR0=1;
TR1=1;
ET0=1;
ES=1;
EA=1;
pwm=1;
while(1);
}
⑺ 51單片機測占空比和周期程序求解
您好,單片機可以實現對方波頻率、占空比的檢測。做這個東西你得從以下方面入手:
1、首先測出方波的頻率(這個跟占空比無關),利用這個計算出周期T;
2、利用一個獨立的外部中斷,在測量完頻率後啟動。
(1)先開啟中斷,並設置為上升邊沿觸發;
(2)方波從低電平跳變到高電平後,中斷觸發後,將其設置為下降邊沿觸發,同時啟動定時器;
(3)第二次觸發中斷後,停止計時,兩次中斷之間的間隔修正補償後,就是高電平的持續時間Tu。
占空比可以計算出來,就是q=Tu/T*100%,
然後就顯示即可。
⑻ 51單片機測量PWM波的占空比的C語言程序
用定時器產生程序如下:
unsigned
int
a=0
,b=10;
void
main()
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
tr0=1;
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256
;
a++;
p1^1=0;
if(a=20)
{
a=0;
}
if(a=b)
{
p1^1=1;
}
}
調節a
,b的值即可調節占空比,程序框架就是這樣,具體自己改吧
⑼ 51單片機C語言編程實現10k占空比可變矩形波
#include<reg51.h>
//設CPU是時鍾12MHz的8051系列
voidSetupTimer0()
{
TMOD&=0XF0;//僅保留T1信息
TMOD|=0X02;//設置T0:定時功能,方式2,自動重載8位定時器/計數器
TH0=256-50;//每個周期為1us,定時每50us中斷一次,兩次為100us,
TL0=256-50;//自動重裝,TL0,TH0均置256-50
TR0=1;//開啟定時器
ET0=1;//定時器0中斷打開
}
voidTimer0_ISR()interrupt1//中斷服務程序
{
staticdataunsignedcharp0;
p0^=1;P0=p0;//p1完成翻轉後輸出到P1,兩次翻轉完成一個周期輸出
}
voidmain()
{
SetupTimer0();
EA=1;//全局中斷打開
while(1);//死循環,中斷程序完成波形輸出
}