单片机源程序如下:

#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;

[1] [2]
关键字:单片机  pcf8591  直流电机  正反转 引用地址:通过单片机pcf8591电位器控制直流电机正反转

上一篇:51单片机gy906测温,语音播报,eepromc存储
下一篇:单片机定时倒计时提醒制作

推荐阅读

  从电影里的畅想到现实中的黑科技,无人驾驶的实现用了10年。近日“全国首辆自动驾驶出租车”在广州大学城上路试运行,但由于道路较为复杂“被叫停”,目前已转至交通环境较适宜的生物岛向市民提供试乘服务。值得注意的是,该自动驾驶出租车在被叫停前一切顺利,在短时间内就完成了100多次服务。  有了先行者谷歌的洗脑,加上现实中特斯拉的铺垫,无...
据韩国先驱报报道,有半导体行业观察人士指出,历经了今年的惨烈暴跌后,韩国内存芯片产业有望在2020年出现好转迹象,主要原因是5G设备需求持续增长、全球数据中心的投资开始复苏。韩国大信证券(Daishin Securities)分析师李素斌(Lee Su-bin)表示,半导体行业基本面的诸多迹象显示,该产业景气将在2020年有所改善。李补充说,受惠于主要芯片制造商的产...
当前,消费电子和电子电器行业各大主要品牌商对可回收材料的需求日益旺盛,全球领先的多元化化工企业沙特基础工业公司(SABIC)近日宣布其工程塑料业务将进一步拓宽其含有高含量的消费后回收材料(PCR)的CYCOLOY™和LEXAN™树脂产品系列。该产品组合的典型应用场合将涵盖消费电子产品,如充电器、打印机复印机和笔记本电脑外壳以及周边配件等。 SABIC PC...
刚刚咱们讲了电子秒表用的是C语言,接下来咱们再讲一讲用汇编。硬件设计(末尾附文件)电路图1:数码管显示;时间清零;启动计时;暂定计时;继续计时;电路图2程序设计TLOW EQU 78HTHIGH EQU 0ECHLED_WEI_Pro EQU 0f0H;数码管位选 保护位;寄存器设置COUN_INT EQU 21H ;5ms * 20 = 100ms = 0.1SCOUN_PASSNUM EQU 22H ;C...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved