51单片机汇编程序编写方波输出程序

51单片机汇编程序编写方波输出程序,第1张

ORG 0000H

LJMP START

ORG 001BH

LJMP Timer1Interrupt

START:

MOV SP,#60H

LCALL InitTimer1

LOOP:

主循环 添加其他代码

LJMP LOOP

InitTimer1:

MOV TMOD,#10H

MOV TH1,#9EH

MOV TL1,#58H

SETB EA

SETB ET1

SETB TR1

RET

Timer1Interrupt:

PUSH DPH

PUSH DPL

PUSH ACC

MOV TH1,#9EH

MOV TL1,#58H

CPL P1.1//对P1.1进行取反

POP ACC

POP DPL

POP DPH

RETI

END

可以使用多个定时器,每个定时器输出不同的方波频率

每个定时器的计数器应配置为对应的频率,并使用每个定时器的比较寄存器生成方波。可以使用引脚分配多个方波,也可以使用外部设备(例如,模拟输出)。

请确保编写程序以使用多个定时器,并且不会对其他功能造成影响。

下面是一个使用51单片机同时输出不同频率方波的简单示例(使用 C 语言):

#include <reg51.h>

unsigned int counter1, counter2

void Timer0_Init()

{

TMOD = 0x01// 设置 Timer0 为模式 1(16 位计数器)

TH0 = 0xFC// 初始化频率为 1kHz 的方波

TL0 = 0x67

TR0 = 1// 启动 Timer0

}

void Timer1_Init()

{

TMOD = ((TMOD &0x0F) | 0x10)// 设置 Timer1 为模式 1(16 位计数器)

TH1 = 0xFD// 初始化频率为 500Hz 的方波

TL1 = 0x4B

TR1 = 1// 启动 Timer1

}

void main()

{

P0 = 0x00// 初始化 P0 引脚为低电平

Timer0_Init()

Timer1_Init()

while(1)

{

if(TF0 == 1) // Timer0 比较寄存器中断

{

TF0 = 0

TH0 = 0xFC

TL0 = 0x67

counter1++

if(counter1 == 1000) // 每隔 1000 个计数周期,改变 P0 引脚状态

{

counter1 = 0

P0 = ~P0

}

}

if(TF1 == 1) // Timer1 比较寄存器中断

{

TF1 = 0

TH1 = 0xFD

TL1 = 0x4B

counter2++

if(counter2 == 500) // 每隔 500 个计数周期,改变 P0 引脚状态

{

counter2 = 0

P0 = ~P0

}

}

}

}

希望能帮到你

首先选择一个I/O设置为输出模式,这个就是用于输出

方波

的硬件接口。

频率可调,可以根据你要想要的频率,换算成中断周期,实质上是一个计数器。建议弄一个300K的中断服务。那么可以这样整:如果要30K的频率,那么每10次中断视为一次完整的周期,执行一次你要的处理。

占空比

问题,比如30%的占空比,那么你前三次中断都把状态设置为1,后面七次都设置为0状态。照这个思路就实现你的占空比了。当然这些中断次数的依据需要你自己对占空比的要求进行换算得到。在中断服务程序中去 *** 作I/O口状态,当然你还可以在该程序结束的时候或者开始的时候,再次修改中断时间从而调整输出频率。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7686105.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-08
下一篇2023-04-08

发表评论

登录后才能评论

评论列表(0条)

    保存