80c51单片机实现,P2口数码管显示占空比,可以一个按键设定倒计数占空比,另一按键正反转P1口并按上电机显示转动
时间: 2024-03-20 19:44:53 浏览: 80
以下是实现该功能的示例代码:
```c
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^2; // 按键1,设定倒计数占空比
sbit key2 = P3^3; // 按键2,正反转P1口并显示转动
uchar code ledChar[] = { // 数码管显示字符对应的编码
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x00, // 空
0x40, // -
};
void delay(uint t) { // 延时函数
uint i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 120; j++);
}
}
void display(uint num) { // 数码管显示函数
uchar i;
uchar displayBuf[4] = {0}; // 数码管显示缓存
for (i = 0; i < 4; i++) {
displayBuf[i] = ledChar[num % 10];
num /= 10;
}
for (i = 0; i < 4; i++) {
P2 = 1 << i; // 选择数码管
P0 = displayBuf[i]; // 显示数码
delay(1); // 延时
P0 = 0x00; // 关灯
}
}
void main() {
uchar count = 10; // 初始占空比为10
uchar direction = 0; // 初始方向为顺时针
uint period = 20; // 周期为20ms
uint onTime = count * period / 10; // 高电平时间
uint offTime = period - onTime; // 低电平时间
uint timer = 0; // 定时器计数器
P1 = 0x00; // 初始P1口为低电平
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器0初值
TL0 = 0x66;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
while (1) {
display(count); // 显示占空比
if (!key1) { // 按键1被按下
delay(10); // 消抖
if (!key1) { // 再次检测按键状态
count--; // 占空比减1
if (count > 9) count = 9; // 限制最小占空比为0
onTime = count * period / 10; // 更新高电平时间
offTime = period - onTime; // 更新低电平时间
}
while (!key1); // 等待按键释放
}
if (!key2) { // 按键2被按下
delay(10); // 消抖
if (!key2) { // 再次检测按键状态
direction = !direction; // 反转方向
P1 = direction ? 0x01 : 0x02; // 更新P1口电平
}
while (!key2); // 等待按键释放
}
}
}
void timer0_isr() interrupt 1 { // 定时器0中断服务函数
TH0 = 0xfc; // 重置定时器0初值
TL0 = 0x66;
timer++; // 定时器计数器加1
if (timer == onTime) { // 高电平时间到达
P1 = direction ? 0x02 : 0x01; // 更新P1口电平
}
if (timer == period) { // 一个周期结束
timer = 0; // 重置定时器计数器
P1 = 0x00; // P1口输出低电平
}
}
```
在上述代码中,我们通过定时器0中断来控制电机的转动。定时器0的工作周期为20ms,其中高电平时间和低电平时间根据当前的占空比确定。按键1可以调整占空比,按键2可以正反转P1口并显示转动。数码管显示当前的占空比,每隔一段时间更新一次。
阅读全文