導航:首頁 > 操作系統 > 51單片機占空比程序c語言

51單片機占空比程序c語言

發布時間:2022-10-29 00:18:10

Ⅰ 求51單片機輸出固定占空比c程序

;//*********************************************************
;//*文件名:直流電機控製程序

;//*創建人:巫升輝

;//*2006.2.25

;功能:通過定時間定時一秒種,並測出當前電機的轉速,送顯示並調整
;PWM的占控比來調整電機最後控制電機在設定穩定的轉速,並通過串
;行7279顯示轉速。

;接線:最小系統p1.0口接電機單元的control口,最小系統的INT0接電機的pulseOut

;//*********************************************************

OUTPUT BIT P1.0 ;PWM 輸出
DBUF DATA 030H
COUNT EQU 50H ;計數值
INT_L EQU 51H ;中斷計數緩沖單元低地址
COUNT_TIME EQU 52H ;時間中斷數
TTM EQU 5 ;軟體計數值50mS*10=500mS
PWM_H EQU 55H ;PWM高脈沖寬度
PWM_L EQU 56H ;PWM低脈沖寬度
SPEED EQU 57H ;速度
BIT_COUNT DATA 020H
DATA_OUT DATA 021H
TIMER DATA 022H
CLK BIT P1.6
DAT BIT P1.7

ORG 0000H
LJMP START
ORG 0003H ;外部中斷EX0入口地址
LJMP EX_INT0 ;外部中斷服務程序
ORG 000BH
LJMP INTS_T0 ;定時器T0中斷服務程序
ORG 0100H
START: CLR A
MOV P1,A ;關閉不相乾的發光管
MOV SP,#60H ;設置sp指針
CLR OUTPUT ;停止
MOV PWM_H,#50 ;設置初始速度
MOV PWM_L,#50
MOV SPEED,#40 ;設置運行速度40轉/秒
MOV INT_L,#00H
MOV COUNT,#00H
MOV COUNT_TIME,#TTM
MOV TMOD,#01H ;T0定時器
MOV TL0,#98H ;50ms (65536-17000*12/12=BD98)
MOV TH0,#0BDH
MOV COUNT_TIME,#TTM
SETB TR0 ;開始定時操作
SETB ET0 ;允許定時中斷
CLR C ;清進位標志
SETB IT0 ;設置中斷觸發方式:脈沖觸發
SETB EX0 ;允許外部中斷EX0中斷
SETB EA ;總的中斷允許

MLOOP:
LCALL TOBCD ;十六進制整數轉換成BCD碼整數
LCALL DRIVE ;驅動輸出
LCALL DisplayResult ;BCD碼整數拆開兩個位元組
LCALL DRIVE ;驅動輸出
LCALL DRIVE ;驅動輸出
LJMP MLOOP

INTS_T0: ;定時器T0中斷服務程序
PUSH ACC
CLR TR0
DJNZ COUNT_TIME,BACK ;軟體計數,次數不到返回
MOV COUNT_TIME,#TTM
MOV INT_L,COUNT ;刷新顯示部分
LCALL DISPLAY ;顯示
MOV COUNT,#00H
MOV A,INT_L
CJNE A,SPEED,SHIFT
SJMP BACK
SHIFT:
JC SHIFT1
INC PWM_L ;SPEED<INT_L
DEC PWM_H
SJMP BACK
SHIFT1: ;SPEED>INT_L
INC PWM_H
DEC PWM_L
BACK: POP ACC
MOV TMOD,#01H ;T0定時器
MOV TL0,#98H ;50ms (65536-17000*12/12=BD98)
MOV TH0,#0BDH
SETB TR0 ;重新開始定時操作
RETI

EX_INT0: ;外部中斷服務程序
INC COUNT ;將中斷緩沖區低地址加1
MOV A,COUNT ;判斷是否有進位
RETI ;中斷返回

DRIVE: ;PWM驅動輸出
SETB OUTPUT
MOV R0,PWM_H
LCALL DELAY3
CLR OUTPUT
MOV R0,PWM_L
LCALL DELAY3
RET
DISPLAY:
ANL P2,#00H ; CS7279有效
MOV DATA_OUT,#10100100B ; A4H,復位命令
CALL SEND
MOV DATA_OUT,#10000000B ; 在第一個數碼管上顯示
CALL SEND
MOV DATA_OUT,DBUF
CALL SEND
MOV DATA_OUT,#10000001B ; 解碼方式0,2位顯示在第二個數碼管上顯示
CALL SEND
MOV DATA_OUT,DBUF+1
CALL SEND
MOV DATA_OUT,#10000010B ; 解碼方式0,3位顯示在第三個數碼管上顯示
CALL SEND
MOV DATA_OUT,#3eh
CALL SEND
;MOV DATA_OUT,#10000011B ; 解碼方式0,4位顯示在第四個數碼管上顯示
;CALL SEND
;MOV DATA_OUT,DBUF+3
;CALL SEND
;MOV DATA_OUT,#10000100B ; 解碼方式0,5位顯示在第五個數碼管上顯示
;CALL SEND
;MOV DATA_OUT,DBUF+4
;CALL SEND
RET

SEND: MOV BIT_COUNT,#8 ; 發送字元子程序
ANL P2,#00H
CALL LONG_DELAY
SEND_LOOP:
MOV C,DATA_OUT.7
MOV DAT,C
SETB CLK
MOV A,DATA_OUT
RL A
MOV DATA_OUT,A
CALL SHORT_DELAY
CLR CLK
CALL SHORT_DELAY
DJNZ BIT_COUNT,SEND_LOOP
CLR DAT
RET
LONG_DELAY: MOV TIMER,#80 ;延時約200US
DELAY_LOOP: DJNZ TIMER,DELAY_LOOP
RET
SHORT_DELAY: MOV TIMER,#6 ;延時約20US
SHORT_LP: DJNZ TIMER,SHORT_LP
RET

; 功能:雙位元組十六進制整數轉換成雙位元組BCD碼整數
; 入口條件:待轉換的雙位元組十六進制整數在R6、R7中。
; 出口信息:轉換後的三位元組BCD碼整數在R3、R4、R5中。

TOBCD:;===================
MOV R7,INT_L
MOV R6,#00H
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙位元組十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當於乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙位元組十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3 ;處理完16bit

;BCD碼拆開送緩存
DisplayResult:
mov a, R3
anl a,#0fh
mov DBUF+4,A ;R3低四位送緩存0
mov a, R4
swap a
anl a,#0fh
mov DBUF+3,a ;R4高四位送緩存1
mov a, R4
anl a,#0fh
mov DBUF+2,a ;R4低四位送緩存2
mov a, R5
swap a
anl a,#0fh
mov DBUF+1,a ;R5高四位送緩存3
mov a, R5
anl a,#0fh
mov DBUF,a ;R5低四位送緩存4
ret
DELAY: LCALL DELAY3
LCALL DELAY3
LCALL DELAY3
LCALL DELAY3
LCALL DELAY3
RET
Delay2:
mov r5, #2
A0: mov r6, #20
A1: mov r7, #50
DelayLoop:
NOP
NOP
djnz r7, DelayLoop
djnz r6, A1
djnz r5, A0
RET
DELAY3: MOV R1, #0
DLOOP1: DJNZ R1, DLOOP1
DJNZ R0, DELAY3
RET
END

Ⅱ 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);//死循環,中斷程序完成波形輸出
}

Ⅲ 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單片機產生周期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單片機輸出方波,周期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單片機調占空比方波

給你提供給一個思路:利用51定時器產生us級別的中斷,然後設置兩個變數,一個是pwm周期,也就是你說的1/10kHz,另一個是占空比變數,讓占空比變數的值是周期寄存器值的一半就可以了這樣就是50%占空比的方波,等到你要改占空比或者頻率的時候只要改這兩個變數就行

Ⅶ 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單片機測占空比和周期程序求解

您好,單片機可以實現對方波頻率、占空比的檢測。做這個東西你得從以下方面入手:
1、首先測出方波的頻率(這個跟占空比無關),利用這個計算出周期T;
2、利用一個獨立的外部中斷,在測量完頻率後啟動。
(1)先開啟中斷,並設置為上升邊沿觸發;
(2)方波從低電平跳變到高電平後,中斷觸發後,將其設置為下降邊沿觸發,同時啟動定時器;
(3)第二次觸發中斷後,停止計時,兩次中斷之間的間隔修正補償後,就是高電平的持續時間Tu。
占空比可以計算出來,就是q=Tu/T*100%,
然後就顯示即可。

Ⅸ 用c語言實現51單片機的可調PWN輸出實驗,要求用按鍵s20~s23分別實現不同的占空比,s20對

http://blog.163.com/asm_c/blog/static/24820311320106300530959/

參考。

閱讀全文

與51單片機占空比程序c語言相關的資料

熱點內容
如何批量快速壓縮視頻 瀏覽:432
我的世界如何加入ice伺服器 瀏覽:873
兄弟cnc編程說明書 瀏覽:204
php閃電入門教程學習 瀏覽:152
金岳霖邏輯pdf 瀏覽:938
linuxtomcat線程 瀏覽:77
pboc長度加數據加密 瀏覽:187
英雄聯盟國際服手游怎麼下安卓 瀏覽:297
程序員的思路 瀏覽:234
只能用命令獲得的四種方塊 瀏覽:358
怎麼用命令方塊防止開創造 瀏覽:807
掃描版的pdf 瀏覽:790
編程貓怎樣做3d游戲 瀏覽:207
怎麼查找雲伺服器上的ftp 瀏覽:156
我的世界伺服器如何注冊賬號 瀏覽:934
統計英文字元python 瀏覽:423
linux信息安全 瀏覽:908
壓縮機接線柱爆 瀏覽:999
程序員自主創業 瀏覽:584
匯編程序員待遇 瀏覽:359