PWMH DATA 30H ;高电平脉冲的个数
PWM DATA 31H ;PWM周期
COUNTER DATA 32H
pwmhmin DATA 33H
ORG 0000H
AJMP MAIN
;ORG 0003H
;AJMP INT_X0
;ORG 0013H
;AJMP INT_X1
ORG 000BH
AJMP INT_T0
ORG 0100H
MAIN:
MOV SP,#60H ;给堆栈指针赋初值
mov ie,#87h
MOV PWMH,#02H ;
MOV COUNTER,#01H
MOV PWM,#14H
MOV TMOD,#02H ;定时器0在模式2下工作
MOV TL0,#38H ;定时器每200us产生一次溢出
MOV TH0,#38H ;自动重装的值
SETB ET0 ;使能定时器0中断
SETB EA ;使能总中断
SETB TR0
SETB IT0
SETB IT1
sjmp $
INT_X0:
MOV A,PWMH
CJNE A,PWM,INC1
SJMP EXIT1
INC1:
clr TR0
MOV A,PWMH
INC A
MOV PWMH,A
EXIT1:
setb TR0
RETI
INT_X1:
MOV A,PWMH
CJNE A,#01h,DEC1
SJMP EXIT2
DEC1:
clr TR0
MOV A,PWMH
DEC A
MOV PWMH,A
EXIT2:
setb TR0
RETI
INT_T0:
INC COUNTER ;计数值加1
MOV A,COUNTER
CJNE A,PWMH,INTT01 ;如果等于高电平脉冲数
CLR P1.0 ;P1.0变为低电平
INTT01: CJNE A,PWM,INTT02 ;如果等于周期数
MOV COUNTER,#01H ;计数器复位
SETB P1.0 ;P1.0为高电平
INTT02:
RETI
END
关键字:PWM方波 51程序
引用地址:
PWM方波产生51程序
推荐阅读最新更新时间:2024-03-16 15:11
MCS-51单片机并行口输出彩灯移动程序举例
1.程序结构采用主程序和中断服务子程序结构 2.定时中断程序,并行口输出,控制彩灯移动 定时器0于方式1,16位,10ms中断一次 40H 10ms计数单元 41H 初值为01101101B 位地址 00H=1 定时方式1为10MS:THX=0ECH,TLX=78H 3.参考程序 ; DISP EQU 0DE00H ;显示子程序入口 ; ORG 0000H START: AJMP MAIN ; ORG 000BH ;定时器0中断服务程序入口 AJMP TINT0 ; ORG 0030H MAIN: MOV R0,#39H
[单片机]
51单片机的精确延时程序一
51单片机的精确延时程序分析(C语言和汇编语言程序) 一、C51程序 在晶振为11.0592的情况下,如下程序能实现ms级的比较精确的延时: 1 void Delayms(unsigned int n) 2 { 3 unsigned int i,j; 4 for(j=n;j 0;j--) 5 for(i=112;i 0;i--); 6 } 用keil可以看出这个延时的时间,我们先延时1ms,即Delayms(1)。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时
[单片机]
93C46/93c06/93c46/93c56/93c66/93c86的驱动程序(C51)
简介:SPI总线驱动程序 包括的普通封装标准模式,特殊封装标准模式 。 —————————————————————*/ /*通用93c06-93c86系列使用说明 93c06=93c4693c56=93c6693c76=93c86 dipx 可以自行定义*/ #include reg51.h #include intrins.h /*----------------------------------------------------- SPI93cXX系列时序函数调用(普通封装) 调用方式:自行定义 函数说明:私有函数,封装各接口定义 ------------------------------------------
[单片机]
51单片机+74HC595驱动数码管程序
这里是电路图: 完整的源码和图纸下载地址: http://www.51hei.com/bbs/dpj-20392-1.html 下面是51单片机驱动74hc595芯片的程序: #include reg52.h //包含51单片机的头文件 #include stdio.h #define uint unsigned int #define uchar unsigned char //sbit sin_595 =P1^0; //sbit rclk_595 =P1^1; //sbit sclk_595 =P1^2; //sbit s_clr =P1^3; sbit a_cp_595
[单片机]
C51中延时程序的编写
C51及C51和汇编的混合编程的资料都是从前辈那儿偷来的,先谢谢各位前辈的分享!:) 众所周知,c51在编程时很难掌握程序运行的时间,所以编写延时程序时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。 1、us级延时程序 常用的一个函数如下: void delayus(unsigned char x) { while(--x) ; } 生成的汇编代码为: C:0x001C
[单片机]
keil c51是如何启动c程序的
汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接。下面看看它和main()函数是如何编译的; //主函数如下; void main(void) { while (1)这是个无条件空循环。 { } } 把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下; ?C_C51STARTUPSEGMENTCODE ?PR?main?TESTMAINSEGMENT CODE ?STACKSEGMENTIDATA RSEG?STACK DS1 CSEGAT0 ?C_STARTUP:LJMPSTARTUP1 C
[单片机]
51单片机汇编语言子程序调用指令RET RETI
控制转移 指令 用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移 指令 相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 . 子程序调用指令(1条) 子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 LCALL
[单片机]
基于C51的RS232基本通信程序
由于即将用到C#与单片机的通信程序,我回头使用了STC12系列的单片机,暂时停止AVR。因为AVR的编程器不属于RS232接口通信,弄起来麻烦。为了兼容性,我把程序的名称定义为和AVR里的名称一样,而且使用回调方式,让应用程序能够知道单片机现在发生了什么。编译器:Keil 程序如下: /*********** 函数说明 ******************** 本程序由discovery编写,基于8位UART通信 本程序占用TIMER1,并且占用using2寄存器组 使用本函数建议其它程序不要使用TIMER1 需要在系统里指定UART中断回调处理函数 void initUSART( // 初始化UART
[单片机]