数码管与PWM,编码器

一:数码管

共阴极数码管:引脚3跟8是点亮引脚所用的,当给10一个高电平时,灯10就会被点亮,其它灯同理。与之相反的是共阳极数码管,给一个低电平。

芯片驱动协议:

二:PWM

pwm跟捕获比较定时器有关系。

通用定时器只能输出一路,高级定时器可以输出两路。

PWM分为PWM1和PWM2,一般用的都是一,PWM1靠近左边。上面那个斜尖脚为比较寄存器,比这个寄存器(那条斜线)大的叫有效电平,比这个寄存器小的称为无效电平。

三:编码器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是基于51单片机的L298驱动JGB37-520编码器电机的代码: ```C #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit ENA = P1^0; // 电机A使能引脚 sbit IN1 = P1^1; // 电机A正转控制引脚 sbit IN2 = P1^2; // 电机A反转控制引脚 sbit ENB = P1^3; // 电机B使能引脚 sbit IN3 = P1^4; // 电机B正转控制引脚 sbit IN4 = P1^5; // 电机B反转控制引脚 sbit EOC = P3^4; // ADC0832转换结束标志位 sbit CS = P3^5; // ADC0832片选引脚 sbit CLK = P3^6; // ADC0832时钟引脚 sbit DO = P3^7; // ADC0832数据输出引脚 uchar code table[] = "0123456789"; // 数码管显示字符表 uint speed = 0; // 电机转速 void delay_ms(uint ms) { uint i, j; for(i=ms; i>0; i--) for(j=110; j>0; j--); } void delay_us(uint us) { while(us--); } void init_adc0832() { CLK = 0; CS = 1; } uchar read_adc0832() { uchar i, dat = 0; CS = 0; _nop_(); _nop_(); CLK = 1; _nop_(); _nop_(); CLK = 0; for(i=0; i<8; i++) { CLK = 1; _nop_(); _nop_(); dat <<= 1; dat |= DO; CLK = 0; } CS = 1; return dat; } void display_speed() { uchar i; P2 = 0x00; P0 = table[speed/1000]; P2 = 0x01; P0 = 0x80; delay_ms(5); P2 = 0x00; P0 = table[speed%1000/100]; P2 = 0x02; P0 = 0x40; delay_ms(5); P2 = 0x00; P0 = table[speed%100/10]; P2 = 0x04; P0 = 0x20; delay_ms(5); P2 = 0x00; P0 = table[speed%10]; P2 = 0x08; P0 = 0x10; delay_ms(5); } void main() { uchar key, adc_data; init_adc0832(); while(1) { key = P3 & 0x03; // 读取按键值 if(key == 0x01) // 按下按键1,电机正转 { ENA = 1; // 使能电机A IN1 = 1; IN2 = 0; } else if(key == 0x02) // 按下按键2,电机反转 { ENA = 1; // 使能电机A IN1 = 0; IN2 = 1; } else // 没有按键按下,电机停止 { ENA = 0; // 关闭电机A使能 } adc_data = read_adc0832(); // 读取ADC0832转换结果 speed = (uint)adc_data * 256 / 1024 * 60 / 20; // 计算电机转速 display_speed(); // 显示电机转速 } } ``` 需要注意的是,上述代码中使用了一个ADC0832模块来测量电机转速。因为JGB37-520编码器电机带有编码器,可以通过编码器输出的脉冲信号来测量电机转速,但这需要编写较为复杂的程序。为了简化程序,我们使用了一个ADC0832模块来测量电机转速。ADC0832模块通过读取电机输出轴上的磁铁的磁场强度来测量电机转速。具体来说,我们将模拟量输出连接到ADC0832的输入引脚上,然后通过单片机读取ADC0832的转换结果来计算电机转速。在上述代码中,我们假设电机输出轴上的磁铁每转一圈会产生20个脉冲信号,因此可以通过计算ADC0832转换结果与电机转速之间的比例关系来计算电机转速。 ### 回答2: 首先,对于使用51单片机驱动L298控制JGB37-520编码器电机实现正反转和调节速度的问题,您可以按照以下步骤进行操作: 1. 连接电路:将51单片机的I/O口与L298的输入引脚相连,使用pwm方法控制电机的速度。同时,将编码器的A、B相输出连接至51单片机的外部中断输入口,以进行电机速度的测量。 2. 编写驱动程序:使用51单片机的编程语言(如C语言)编写驱动程序,实现电机的正反转和调节速度功能。该程序需要设置用于控制电机转向的I/O口,并使用pwn方法调节电机的速度。 3. 设置中断:在代码中设置外部中断,用于检测编码器的脉冲信号。通过计算脉冲的数量和时间间隔,可以得到电机的转速。 4. 测量转速:通过adc0832模块连接到51单片机,将编码器的脉冲信号转换成电压值。根据转速与电压之间的关系,可以计算出电机的转速。 5. 显示转速:使用液晶显示屏(LCD),将测量得到的电机转速显示在屏幕上。通过适当的格式化,可以展示出清晰易读的转速数值。 总结起来,您需要编写代码来控制L298驱动JGB37-520编码器电机,使用按键来调节电机的速度,并且使用ADC0832模块测量电机的转速。最后,使用LCD显示屏将电机的转速实时显示出来。 ### 回答3: 51单片机使用L298驱动一个JGB37-520编码器电机用按键(PWM方法)调节电机速度,并实现正反转,测量电机速度(编码器ADC0832)并使用LCD显示转速的代码如下: #include <reg52.h> // 定义端口 sbit ENA = P1^0; sbit ENB = P1^1; sbit IN1 = P1^2; sbit IN2 = P1^3; sbit IN3 = P1^4; sbit IN4 = P1^5; sbit KEY1 = P3^4; sbit KEY2 = P3^5; // 定义LCD引脚 sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2; sbit LCD_D4 = P2^4; sbit LCD_D5 = P2^5; sbit LCD_D6 = P2^6; sbit LCD_D7 = P2^7; // 定义全局变量 unsigned int speed = 0; // 电机速度 bit direction = 0; // 电机方向,0为正转,1为反转 // 初始化LCD void initLCD() { delay_ms(15); sendCMD(0x38); sendCMD(0x0C); sendCMD(0x06); sendCMD(0x01); delay_ms(15); } // 发送命令到LCD void sendCMD(unsigned char cmd) { RS = 0; RW = 0; E = 0; P0 = cmd; delay_ms(1); E = 1; delay_ms(1); E = 0; delay_ms(1); } // 发送数据到LCD void sendDAT(unsigned char dat) { RS = 1; RW = 0; E = 0; P0 = dat; delay_ms(1); E = 1; delay_ms(1); E = 0; delay_ms(1); } // 显示电机速度 void displaySpeed() { char buffer[16]; sprintf(buffer, "Speed: %04d", speed); sendCMD(0x80 + 0x40); // 显示在第二行 for (int i = 0; i < 16; i++) { if (buffer[i] == '\0') break; sendDAT(buffer[i]); } } // 初始化定时器 void initTimer() { TMOD |= 0x01; // 设置T0为模式1 TH0 = 0xFC; // 定时1ms TL0 = 0x67; EA = 1; // 全局中断使能 ET0 = 1; // 定时器0中断使能 TR0 = 1; // 启动定时器0 } // 定时器0中断服务函数 void timer0() interrupt 1 { static bit toggle = 0; TH0 = 0xFC; // 重新加载计时值 TL0 = 0x67; toggle = !toggle; // 切换PWM的高低电平 if (toggle) { if(direction == 0) { IN1 = 1; IN2 = 0; } else { IN1 = 0; IN2 = 1; } IN3 = 1; IN4 = 0; } else { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; } } // 初始化外部中断 void initExternalInterrupt() { IT0 = 1; // 下降沿触发 EX0 = 1; // 外部中断0使能 IT1 = 1; // 下降沿触发 EX1 = 1; // 外部中断1使能 EA = 1; // 全局中断使能 } // 外部中断0服务函数 void externalInterrupt0() interrupt 0 { if (KEY1 == 0) { if (speed < 255) speed += 5; } } // 外部中断1服务函数 void externalInterrupt1() interrupt 2 { if (KEY2 == 0) { if (speed > 0) speed -= 5; } } void main() { initLCD(); initTimer(); initExternalInterrupt(); displaySpeed(); while (1) { displaySpeed(); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值