历史上的今天
今天是:2024年11月26日(星期二)
2020年11月26日 | 通过单片机pcf8591电位器控制直流电机正反转
2020-11-26 来源:51hei


单片机源程序如下:
#include #include typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; sbit PWM01=P1^4; sbit PWM02=P1^5; //电机1 sbit PWM11=P1^6; sbit PWM12=P1^7; //电机2 sbit PWM21=P2^2; sbit PWM22=P2^3; //电机3 sbit PWM31=P3^6; sbit PWM32=P3^7; //电机4 sbit ADDRC = P1^0; sbit ADDRB = P1^1; sbit ADDRA = P1^2;//控制138译码器的三个引脚 uint8 AD_value0 = 0;//AD值 uint8 AD_value1 = 0;//AD值 uint8 AD_value2 = 0;//AD值 uint8 AD_value3 = 0;//AD值 uint8 Top = 255; uint8 Low = 0; uint8 between0 = 127; uint8 between1 = 128; sbit I2C_SDA = P2^1; sbit I2C_SCL = P2^0;//I2C通信的两个引脚 bit flag_300ms = 0;//300ms时间标志位 uint8 T0RH = 0;//定时器高8位初值 uint8 T0RL = 0;//定时器低8位初值 //uint8 AD_value = 0;//AD值 uint8 code led_char[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//LED段码 void config_timer0(uint8 ms); uint8 get_ADC_vaule(uint8 chn); void motor_deal0(); void motor_deal1(); void motor_deal2(); void motor_deal3(); void main() { config_timer0(1);//初始化通用定时器0,定时1ms while(1) { if(flag_300ms == 1) //判断300ms时间是否到了 { flag_300ms = 0;//清除标志位 AD_value0 = get_ADC_vaule(0);//读取通道0的AD值 AD_value1 = get_ADC_vaule(1);//读取通道0的AD值 AD_value2 = get_ADC_vaule(2);//读取通道0的AD值 AD_value3 = get_ADC_vaule(3);//读取通道0的AD值 } motor_deal0(); motor_deal1(); motor_deal2(); motor_deal3(); } } void motor_deal0() { if(AD_value0 == between0 || AD_value0 == between1) //stop { PWM01=1; PWM02=1; } else if(AD_value0>=Low && AD_value0 PWM01=0; PWM02=1; } else //反 { PWM01=1; PWM02=0; } } void motor_deal1() { if(AD_value1 == between0 || AD_value1 == between1) //stop { PWM11=1; PWM12=1; } else if(AD_value1>=Low && AD_value1 PWM11=0; PWM12=1; } else //反 { PWM11=1; PWM12=0; } } void motor_deal2() { if(AD_value2 == between0 || AD_value2 == between1) //stop { PWM21=1; PWM22=1; } else if(AD_value2>=Low && AD_value2 PWM21=0; PWM22=1; } else //反 { PWM21=1; PWM22=0; } } void motor_deal3() { if(AD_value3 == between0 || AD_value3 == between1) //stop { PWM31=1; PWM32=1; } else if(AD_value3>=Low && AD_value3 PWM31=0; PWM32=1; } else //反 { PWM31=1; PWM32=0; } } void I2C_delay()//I2C延时函数 { _nop_(); _nop_(); _nop_(); _nop_(); } void I2C_start()//I2C起始信号 { I2C_SDA = 1; I2C_SCL = 1; I2C_delay(); I2C_SDA = 0; I2C_delay(); I2C_SCL = 0; I2C_delay(); } void I2C_stop()//I2C停止信号 { I2C_SDA = 0; I2C_SCL = 0; I2C_delay(); I2C_SCL = 1; I2C_delay(); I2C_SDA = 1; I2C_delay(); } bit I2C_write(uint8 dat)//I2C写一个字节 { bit ack = 0;
史海拾趣
|
ZW0201 Z-Wave单芯片是一个用于家庭自动化的完整的无线解决方案,该方案包括一个集成的RF收发器、一个8051微控制器、Z-Wave SW应用编程接口(API),以及用于用户应用软件的闪存。… 查看全部问答> |
|
ARM32位单片机 LM3S系列有没可以代替_nop_()的C51指令的指令? 开发环境为IAR。 ARM32位单片机 LM3S系列没有_nop_()这条C51指令,我想问下可以用啥代替,精确延时一个机器周期。… 查看全部问答> |
|
我用的是AT89C52 想做到0.5KHZ~20KHZ之间精确线性调频脉冲信号,怎么也实现不了,以下是代码,请教一下高手意见! /***************************************************************************** * 程序名称: ...… 查看全部问答> |
|
本人第一次接触驱动程序开发,想问一下在xp下做驱动程序开发需要哪些开发环境 还有我下载了vtoolsd3。0能不能在xp下做开发呢… 查看全部问答> |
|
该资料介绍了STM32在keil上的使用,并提供STM32固件库V3.5;和STM32固件库V3.5在keil工程详细步骤。 https://download.eeworld.com.cn/ ... E%8E%E8%8E%8E/23493… 查看全部问答> |




