Ⅰ 求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/
参考。