51单片机的晶振频率为12MHZ,使用定时器 0 与定时器 1 进行定时, 编写汇编语言实验程序在 P1.0 及 P1.1 引脚上分别输出 1 秒和 2 秒的方波信号,通过二极管亮灭 来观察实验现象。
时间: 2024-02-13 15:01:26 浏览: 170
单片机为什么要晶振_51单片机晶振频率
本实验需要使用定时器0和定时器1产生定时中断,并在P1.0和P1.1引脚上分别输出1秒和2秒的方波信号。由于51单片机的晶振频率为12MHZ,需要根据晶振频率和定时器的计数方式计算出定时器的初值。以1秒为例,计算公式如下:
```
定时器初值 = 65536 - (1秒计数次数 × 12MHZ / 12)
```
其中,1秒计数次数为定时器计数器每计数一次所用的机器周期数。在本实验中,我们选择定时器0的工作模式为模式1,即16位自动重载计数器,每计数一次需要12个机器周期。因此,1秒计数次数为 12 × 65536 = 786432。
按照上述公式计算,1秒的定时器初值为 0xBDB4,2秒的定时器初值为 0x1B58。以下是一种实现方式:
```
ORG 0000h
MOV TMOD, #11h ; 设置定时器0和定时器1为模式1,即16位自动重载计数器
MOV TH0, #0xBD ; 设置定时器0计数器初值为0xBDB4,以获得1秒钟的计时周期
MOV TL0, #0xB4
MOV TH1, #0x1B ; 设置定时器1计数器初值为0x1B58,以获得2秒钟的计时周期
MOV TL1, #0x58
SETB TR0 ; 开启定时器0
SETB TR1 ; 开启定时器1
SETB ET0 ; 开启定时器0的中断
SETB ET1 ; 开启定时器1的中断
CLR LED ; 初始化输出电平为低电平
MAIN_LOOP:
SJMP MAIN_LOOP ; 主循环
TIMER0_ISR:
CLR TF0 ; 清除定时器0中断标志
CPL LED ; 取反输出电平
MOV P1.0, LED ; 将输出电平输出到P1.0引脚上
RETI ; 返回中断
TIMER1_ISR:
CLR TF1 ; 清除定时器1中断标志
CPL LED ; 取反输出电平
MOV P1.1, LED ; 将输出电平输出到P1.1引脚上
RETI ; 返回中断
END
```
在程序中,我们使用了一个变量 LED 来记录当前应该输出高电平还是低电平,并在定时器中断服务程序中将其取反。通过观察 P1.0 和 P1.1 引脚上的方波信号,可以看到 LED 灯的亮灭情况,从而判断程序是否正常运行。
阅读全文