80c51单片机实现,P2口数码管显示占空比,可以一个按键设定倒计数占空比,另一按键正反转P1口并按上电机显示转动

时间: 2024-03-20 12:44:53 浏览: 17
以下是实现该功能的示例代码: ```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口并显示转动。数码管显示当前的占空比,每隔一段时间更新一次。

相关推荐

最新推荐

recommend-type

单片机测量占空比、方波的频率及其相位差方法论.doc

当脉冲的上升沿来临时,将定时器打开;紧接着的下降沿来临时,读取定时器的值,假设定时时间为t1;下一个上升沿来临时关闭定时器,读取定时器的值,假设定时...一个比较好的思路,可以试一下~文档内附有部分代码和截图
recommend-type

输出两路占空比和频率可调的互补PWM

如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM ,高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。
recommend-type

51单片机模拟PWM输出占空比可调.doc.doc

51单片机模拟PWM输出占空比可调.docdoc,51单片机模拟PWM输出占空比可调.doc
recommend-type

51单片机脉冲宽度调制(PWM)控制LED灯亮度

绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯...
recommend-type

LED亮度线性变化难搞?PWM占空比帮你忙

本篇文章从软件的角度给出了调节PWM占空比,来确保亮度是线性变化的方法。是比较偏向基础类的文章,希望大家在阅读过本篇文章之后能够有所收获。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。