1、P1口接8个发光二极管,利用定时计数器1编写程序,使8个发光二极管同时点亮1秒、灭1秒,周而复始,设晶振为6MHZ。(利用查询方式实现) 2、编写一段程序,P2.0口输出占空比为60%,频率为100HZ的矩形波(用定时器1完成),fosc=6MHZ
时间: 2024-10-16 10:15:32 浏览: 48
51单片机源码程序-用右移运算流水点亮P1口8位LED.zip
1. 要使用定时计数器1 (T1) 实现P1口控制8个LED灯的亮灭周期,首先需要设置T1工作于模式1,即13位自动重装定时/计数模式。你需要分配定时器1的工作方式寄存器TMOD,配置成0x50,以便将P1.0~P1.7映射到T1的高4位。接着设置TH1和TL1的值,使得定时时间为1秒(因为6MHz的晶振,每个机器周期为1/6MHz,1秒等于6000000机器周期)。在查询方式下,你可以使用中断向量表中的中断入口点(如 Timer1_Interrupt)来处理定时溢出事件,并在中断服务程序里通过改变P1口状态来控制LED的亮灭。
```c
#include <reg52.h>
void Timer1_Init(void) {
TMOD = 0x50; // 设置定时器1为模式1
TH1 = 0xFD; // 高4位设定为1秒时间,低3位留给溢出标志
TL1 = 0xFA;
}
// 中断服务函数
void Timer1_Interrupt() interrupt 1 {
P1 ^= 0xFF; // 翻转P1口,LED交替点亮和熄灭
EA = 1; // 开启总中断
TI = 0; // 清除中断标志
}
```
记得在主程序里开启中断,并调用`Timer1_Init()`初始化定时器1。
2. 对于P2.0输出占空比为60%的100Hz矩形波,可以使用定时器1的模式2(8位计数/自动重装载模式),并配合中断实现。先设置TMOD为0x10,配置好初值使其计数到一定次数后,使P2.0由高电平变为低电平,然后等待一段时间(100Hz的周期 - 占空比60%的时间)再回到高电平。同样需要一个中断来管理这个过程。
```c
void Waveform_Init(void) {
TMOD = 0x10; // 设置定时器1为模式2
T1InitValue = fosc / (100 * (1 + 60)); // 计算初始计数值
}
void Waveform_ISR() interrupt 1 {
if (TF1 == 1) { // 到达计数值
P2.0 = !P2.0; // 变换P2.0电平
TF1 = 0; // 清除溢出标志
}
}
```
别忘了在主程序中开启中断,并调用`Waveform_Init()`。
阅读全文