【51单片机】【代码】按键控制PWM波形占空比,并在数码管上显示。

#include"at89x52.h"

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

uchar code acLEDCS[]={
   0xfe,0xfd,0xfb,0xf7};	/* 位选地址码,“0”有效,位选接的是P2口高4位 */
uchar code acLedSegCode[]={
   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};/* 段码 */
uchar acLED[4];							/* 显示缓冲区 */
char  cScanIndex;						/* 位选指针0~3 */

uchar  cKey;							/* 初始键值	*/
uchar  cKeyCode;						/* 键值	*/
uchar  cLongDelay;						
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题我可以帮你解决。 以下是一个基于C语言的单片机控制数码显示比和控制电机正反转的示例代码: ``` #include <reg52.h> sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit key1=P3^1; sbit key2=P3^2; sbit motor_forward=P1^0; sbit motor_backward=P1^1; unsigned char code duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //0~9,A,b,C,d,E,F,-,0. unsigned char num=0; unsigned char duty_cycle=0; void delay(unsigned int time) { unsigned int i,j; for(i=0;i<time;i++) for(j=0;j<110;j++); } void display(unsigned char i) { switch(i) { case(0):LSA=0,LSB=0,LSC=0;break; case(1):LSA=1,LSB=0,LSC=0;break; case(2):LSA=0,LSB=1,LSC=0;break; case(3):LSA=1,LSB=1,LSC=0;break; case(4):LSA=0,LSB=0,LSC=1;break; case(5):LSA=1,LSB=0,LSC=1;break; case(6):LSA=0,LSB=1,LSC=1;break; case(7):LSA=1,LSB=1,LSC=1;break; } } void motor_control(unsigned char direction) { if(direction == 0) //正转 { motor_forward = 1; motor_backward = 0; } else if(direction == 1) //反转 { motor_forward = 0; motor_backward = 1; } else { motor_forward = 0; motor_backward = 0; } } void main() { while(1) { if(key1 == 0) //按键1按下 { delay(10); //短暂延时,防止按键抖动 if(key1 == 0) //再次检测按键状态,确保按键被稳定按下 { duty_cycle++; //比加1 if(duty_cycle > 99) //比不能超过99 { duty_cycle = 99; } } while(!key1); //等待按键释放 } if(key2 == 0) //按键2按下 { delay(10); //短暂延时,防止按键抖动 if(key2 == 0) //再次检测按键状态,确保按键被稳定按下 { num--; //倒计数减1 if(num == 255) //倒计数不能小于0 { num = 0; } } while(!key2); //等待按键释放 } P0 = duan[num/10]; //显示倒计数的十位数码 display(0); //设置数码管的LSA、LSB和LSC引脚状态 delay(duty_cycle); //等待比时间 P0 = duan[num%10]; //显示倒计数的个位数码 display(1); //设置数码管的LSA、LSB和LSC引脚状态 delay(100-duty_cycle); //等待剩余的时间 if(num == 0) //倒计数归零时,电机停止转动 { motor_control(2); //电机停止 } else if(num % 2 == 0) //倒计数为偶数时,电机正转 { motor_control(0); //电机正转 } else //倒计数为奇数时,电机反转 { motor_control(1); //电机反转 } } } ``` 在这个代码中,我们使用了两个按键key1和key2来分别设置比和倒计数,使用了一个变量duty_cycle来存储比的值,使用了一个变量num来存储倒计数的值。 在每次循环中,我们首先检测按键的状态,如果按键1被按下,则将比加1,如果按键2被按下,则将倒计数减1。然后根据当前的比和倒计数,分别控制数码管的显示和电机的转动方向。具体来说,我们使用P0口来显示倒计数的数码,使用display函数来设置数码管的LSA、LSB和LSC引脚状态,使用delay函数来等待比时间,从而实现数码管的显示。同时,我们根据倒计数的奇偶性来控制电机的正反转,当倒计数为0时,电机停止转动。 需要注意的是,为了避免按键的抖动干扰,我们在检测按键状态时,加入了短暂的延时,并在等待按键释放后再进行下一步操作。另外,为了控制电机的转动方向,我们使用了两个引脚motor_forward和motor_backward来控制电机正反转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值