双直流电机BTS7960模块正反转程序

/************* 本程序功能说明 **************

读ADC测量外部电压,使用外部TL431基准计算电压.

用STC的MCU的IO方式控制74HC595驱动8位数码管。

用户可以修改宏来选择时钟频率.

用户可以在"用户定义宏"中选择共阴或共阳. 推荐尽量使用共阴数码管.

使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.

右边4位数码管显示测量的电压值值.

外部电压从板上测温电阻两端输入, 输入电压0~VDD, 不要超过VDD或低于0V.

实际项目使用请串一个1K的电阻到ADC输入口, ADC输入口再并一个电容到地.

******************************************/

#include "config.H"

#include "adc.h"

#define P1n_pure_input(bitn) P1M1 |= (bitn), P1M0 &= ~(bitn)

/****************************** 用户定义宏 ***********************************/

#define Cal_MODE 0 //每次测量只读1次ADC. 分辨率0.01V

// #define Cal_MODE 1 //每次测量连续读16次ADC 再平均计算. 分辨率0.01V

#define LED_TYPE 0x00 //定义LED类型, 0x00--共阴, 0xff--共阳

#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒

/*****************************************************************************/

/************* 本地常量声明 **************/

u8 code t_display[]={ //标准字库

// 0 1 2 3 4 5 6 7 8 9 A B C D E F

0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

//black - H J K L N o P U t G Q r M y

0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,

0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码

/************* IO口定义 **************/

sbit P_HC595_SER = P4^0; //pin 14 SER data input

sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock

sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock

/************* 本地变量声明 **************/

u8 LED8[8]; //显示缓冲

u8 display_index; //显示位索引

bit B_1ms; //1ms标志

u16 msecond;

u16 Bandgap;

/************* 本地函数声明 **************/

u16 get_temperature(u16 adc);

/**************** 外部函数声明和外部变量声明 *****************/

/********************** ADC配置函数 ************************/

void ADC_config(void)

{

ADC_InitTypeDef ADC_InitStructure; //结构定义

ADC_InitStructure.ADC_Px = ADC_P12 | ADC_P13; //设置要做ADC的IO, ADC_P10 ~ ADC_P17(或操作),ADC_P1_All

ADC_InitStructure.ADC_Speed = ADC_90T; //ADC速度 ADC_90T,ADC_180T,ADC_360T,ADC_540T

ADC_InitStructure.ADC_Power = ENABLE; //ADC功率允许/关闭 ENABLE,DISABLE

ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2; //ADC结果调整, ADC_RES_H2L8,ADC_RES_H8L2

ADC_InitStructure.ADC_Polity = PolityLow; //优先级设置 PolityHigh,PolityLow

ADC_InitStructure.ADC_Interrupt = DISABLE; //中断允许 ENABLE,DISABLE

ADC_Inilize(&ADC_InitStructure); //初始化

ADC_PowerControl(ENABLE); //单独的ADC电源操作函数, ENABLE或DISABLE

P1n_pure_input((1<<2) || (1<<3)); //把ADC口设置为高阻输入

}

/**********************************************/

void main(void)

{

u8 i;

u16 j;

display_index = 0;

ADC_config();

Timer0_1T();

Timer0_AsTimer();

Timer0_16bitAutoReload();

Timer0_Load(Timer0_Reload);

Timer0_InterruptEnable();

Timer0_Run();

EA = 1; //打开总中断

for(i=0; i<8; i++) LED8[i] = 0x10; //上电消隐

while(1)

{

if(B_1ms) //1ms到

{

B_1ms = 0;

if(++msecond >= 300) //300ms到

{

msecond = 0;

#if (Cal_MODE == 0)

//=================== 只读1次ADC, 10bit ADC. 分辨率0.01V ===============================

Get_ADC10bitResult(2); //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.

Bandgap = Get_ADC10bitResult(2); //读外部基准TL431对应的ADC

Get_ADC10bitResult(3); //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.

j = Get_ADC10bitResult(3); //读外部电压ADC

j = (u16)((u32)j * 250 / Bandgap); //计算外部电压, TL431电压为2.50V, 测电压分辨率0.01V

#endif

//==========================================================================

//===== 连续读16次ADC 再平均计算. 分辨率0.01V =========

#if (Cal_MODE == 1)

Get_ADC10bitResult(2); //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.

for(j=0, i=0; i<16; i++)

{

j += Get_ADC10bitResult(2); //读外部基准TL431对应的ADC

}

Bandgap = j >> 4; //16次平均

Get_ADC10bitResult(3); //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.

for(j=0, i=0; i<16; i++)

{

j += Get_ADC10bitResult(3); //读外部电压ADC

}

j = j >> 4; //16次平均

j = (u16)((u32)j * 250 / Bandgap); //计算外部电压, TL431电压为2.50V, 测电压分辨率0.01V

#endif

//==========================================================================

LED8[5] = j / 100 + DIS_DOT; //显示外部电压值

LED8[6] = (j % 100) / 10;

LED8[7] = j % 10;

// j = Bandgap;

// LED8[0] = j / 1000; //显示Bandgap ADC值

// LED8[1] = (j % 1000) / 100;

// LED8[2] = (j % 100) / 10;

// LED8[3] = j % 10;

}

}

}

}

/**********************************************/

/**************** 向HC595发送一个字节函数 ******************/

void Send_595(u8 dat)

{

u8 i;

for(i=0; i<8; i++)

{

dat <<= 1;

P_HC595_SER = CY;

P_HC595_SRCLK = 1;

P_HC595_SRCLK = 0;

}

}

/********************** 显示扫描函数 ************************/

void DisplayScan(void)

{

Send_595(~LED_TYPE ^ T_COM[display_index]); //输出位码

Send_595( LED_TYPE ^ t_display[LED8[display_index]]); //输出段码

P_HC595_RCLK = 1;

P_HC595_RCLK = 0; //锁存输出数据

if(++display_index >= 8) display_index = 0; //8位结束回0

}

/********************** Timer0 1ms中断函数 ************************/

void timer0 (void) interrupt TIMER0_VECTOR

{

DisplayScan(); //1ms扫描显示一位

B_1ms = 1; //1ms标志

}

////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////

#include "adc.h"

//========================================================================

// 函数: void ADC_Inilize(ADC_InitTypeDef *ADCx)

// 描述: ADC初始化程序.

// 参数: ADCx: 结构参数,请参考adc.h里的定义.

// 返回: none.

// 版本: V1.0, 2012-10-22

//========================================================================

void ADC_Inilize(ADC_InitTypeDef *ADCx)

{

P1ASF = ADCx->ADC_Px;

ADC_CONTR = (ADC_CONTR & ~ADC_90T) | ADCx->ADC_Speed;

if(ADCx->ADC_Power == ENABLE) ADC_CONTR |= 0x80;

else ADC_CONTR &= 0x7F;

if(ADCx->ADC_AdjResult == ADC_RES_H2L8) PCON2 |= (1<<5); //10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。

else PCON2 &= ~(1<<5); //10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。

if(ADCx->ADC_Interrupt == ENABLE) EADC = 1; //中断允许 ENABLE,DISABLE

else EADC = 0;

if(ADCx->ADC_Polity == PolityHigh) PADC = 1; //优先级设置 PolityHigh,PolityLow

else PADC = 0;

}

//========================================================================

// 函数: void ADC_PowerControl(u8 pwr)

// 描述: ADC电源控制程序.

// 参数: pwr: 电源控制,ENABLE或DISABLE.

// 返回: none.

// 版本: V1.0, 2012-10-22

//========================================================================

void ADC_PowerControl(u8 pwr)

{

if(pwr == ENABLE) ADC_CONTR |= 0x80;

else ADC_CONTR &= 0x7f;

}

/***2024 测试直流电机正反转past***/

/***2024 11 21板2024 12 14 *L1287CODE5861**/

#include <REG52.H>

#include <intrins.h>

#include <string.h>

#include "stdio.h"

#include <stdlib.h>

#define uint unsigned int

#define uchar unsigned char

sbit OLED_SCL=P1^1; //

sbit OLED_SDA=P1^0; //

sbit INTPUT1=P1^2; //电机A左行

sbit INTPUT2=P1^3; //电机A右行

sbit INTPUT3=P1^4; //电机B左行

sbit INTPUT4=P1^5; //电机B右行

sbit D1_ADD=P5^4; //

sbit D1_DEC=P1^6; //

sbit D2_ADD=P5^5; //

sbit D2_DEC=P1^7; //

sbit L1_PWM=P3^5; //

sbit L1_EN=P3^4; // 高电平使能 低电平关闭

sbit R1_PWM=P3^6; //

sbit R1_EN=P3^7; //

sbit L2_PWM=P3^2; //

sbit L2_EN=P3^0; //

sbit R2_PWM=P3^1; //

sbit R2_EN=P3^3; //

bit MOTORARUN_L; //电机A左行启动标志 0关闭 1启动

bit MOTORARUN_R; //电机A右行启动标志 0关闭 1启动

bit MOTORBRUN_L; //电机B左行启动标志 0关闭 1启动

bit MOTORBRUN_R; //电机B右行启动标志 0关闭 1启动

uchar count = 0;

uchar aa;

uchar kcounter,kstatus; //按键计数标志 按键状态标志

uchar time1,time2; //电机占空比

uchar timeA,timeB; //

#define high 1

#define low 0

#define uint unsigned int //

#define uchar unsigned char //

#define CMD_IDLE 0 //空闲模式

#define CMD_READ 1 //IAP字节读命令

#define CMD_PROGRAM 2 //IAP字节编程命令

#define CMD_ERASE 3 //IAP扇区擦除命令

#define ENABLE_IAP 0x82 //if SYSCLK<20MHz

#define IAP_ADDRESS 0x0000 //时间 EEPROM首地址

#define IAP_ADDRESS1 0x0200 //时间 EEPROM首地址

typedef unsigned char BYTE; //Catch_Up接上Catch_Dwon接下

typedef unsigned int WORD;

uchar code show1[]=

{

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/

0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/

0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/

0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/

0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/

};

uchar code show2[]=

{

0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,

0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,/*"左",0*/

0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,

0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,/*"右",1*/

0x80,0x60,0xF8,0x07,0x00,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x00,0x00,

0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x01,0x03,0x00,/*"停",2*/

0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,

0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"止",3*/

0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,

0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,/*"启",4*/

0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,

0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",5*/

0x00,0x04,0x84,0x84,0x94,0xE4,0x85,0x86,0x84,0xC4,0xB4,0x84,0x84,0x84,0x80,0x00,

0x80,0x60,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"产",6*/

0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,

0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,/*"量",7*/

0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00,

0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00,/*"进",8*/

0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00,

0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00,/*"退",9*/

0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,

0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,/*"刀",10*/

0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,

0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*"待",11*/

0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,

0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*"机",12*/

};

/*************Pin Define***************/

void Initial_LY096BG30();

void Delay_50ms(uint Del_50ms);

void fill_picture(uchar fill_Data);

void IIC_Start();

void IIC_Stop();

void Write_IIC_Command(uchar IIC_Command);

void Write_IIC_Data(uchar IIC_Data);

bit Write_IIC_Byte(uchar IIC_Byte);

void dis_Value(uchar s);

/*---------------延时子程序----------------*/

void delay (uint ms)

{

uint i,j;

for(i=0;i<ms;i++)

for(j=0;j<2;j++)

;

}

/**************Delay*******************************/

void Delay_50ms(uint Del_50ms) //

{

uint m;

for(;Del_50ms>0;Del_50ms--)

for(m=62450;m>0;m--);

}

/*************关所有输出*******************************/

void reset_io()

{

L1_PWM=1; //

L1_EN=1; //

R1_PWM=1; //

R1_EN=1; //

L2_PWM=1; //

L2_EN=1; //

R2_PWM=1; //

R2_EN=1; //

}

/*----关闭IAP----------------------------*/

void IapIdle()

{

IAP_CONTR = 0; //关闭IAP功能

IAP_CMD = 0; //清除命令寄存器

IAP_TRIG = 0; //清除触发寄存器

IAP_ADDRH = 0x80; //将地址设置到非IAP区域

IAP_ADDRL = 0;

}

/*-从ISP/IAP/EEPROM区域读取一字节-*/

BYTE IapReadByte(WORD addr)

{

BYTE dat; //数据缓冲区

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_READ; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

dat = IAP_DATA; //读ISP/IAP/EEPROM数据

IapIdle(); //关闭IAP功能

return dat; //返回

}

/*-写一字节数据到ISP/IAP/EEPROM区域-*/

void IapProgramByte(WORD addr, BYTE dat)

{

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_PROGRAM; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_DATA = dat; //写ISP/IAP/EEPROM数据

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

IapIdle();

}

/*---扇区擦除---------------*/

void IapEraseSector(WORD addr)

{

IAP_CONTR = ENABLE_IAP; //使能IAP val=IapReadByte(IAP_ADDRESS+1);

IAP_CMD = CMD_ERASE; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

IapIdle();

}

/****************按键计数器状态寄存器归零*************/

void RstKey()

{

kcounter=0; //按键计数器归零

kstatus=0; //状态寄存器归零

}

/*****************按键低电平检测函数*****************/

void LowVoltKey(void) //按键计数器状态标志加一

{

kcounter++;

kstatus++;

delay(5); //延时

}

/*****************按键高电平检测函数*****************/

void HighVoltKey(void) //按键计数器加一 状态标志归零

{

kcounter++; //按键计数器加一

kstatus=0; //按键状态标志归零

delay(5); //延时

}

/*******************IIC Start******************/

void IIC_Start()

{

OLED_SCL=high;

OLED_SDA=high;

nop();

OLED_SDA=low;

nop();nop();

OLED_SCL=low;

}

/*************IIC Stop*************************/

void IIC_Stop()

{

OLED_SDA=low;

nop();

OLED_SCL=high;

nop();nop();

OLED_SDA=high;

}

/*****************IIC Write byte***************/

bit Write_IIC_Byte(unsigned char IIC_Byte)

{

unsigned char i;

bit Ack_Bit; //应答信号

for(i=0;i<8;i++)

{

if(IIC_Byte & 0x80) //1?0?

OLED_SDA=high;

else

OLED_SDA=low;

OLED_SCL=high;

nop();nop();

OLED_SCL=low;

IIC_Byte<<=1; //loop

}

OLED_SDA=high; //释放IIC SDA总线为主器件接收从器件产生应答信号

nop();nop();

OLED_SCL=high; //第9个时钟周期

nop();nop();

Ack_Bit=OLED_SDA; //读取应答信号

OLED_SCL=low;

return Ack_Bit;

}

/*************IIC Write Command*****************/

void Write_IIC_Command(unsigned char IIC_Command)

{

IIC_Start();

Write_IIC_Byte(0x78); //Slave address,SA0=0

Write_IIC_Byte(0x00); //write command

Write_IIC_Byte(IIC_Command);

IIC_Stop();

}

/****************IIC Write Data*****************/

void Write_IIC_Data(uchar IIC_Data)

{

IIC_Start();

Write_IIC_Byte(0x78);

Write_IIC_Byte(0x40); //write data

Write_IIC_Byte(IIC_Data);

IIC_Stop();

}

/***************设置参数显示******************/

void dis_Val1(uchar s)

{

uchar x,y;

uint i=0;

uchar A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command(0XB4+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X10); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A2*16]);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command(0XB4+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X11); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A3*16]);

}

}

}

/***************设置参数显示******************/

void dis_Val2(uchar s)

{

uchar x,y;

uint i=0;

uchar A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command(0XB4+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X14); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A2*16]);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command(0XB4+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X115); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A3*16]);

}

}

}

/***************定时器参数显示******************/

void dis_Val(uchar s)

{

uchar x,y;

uint i=0;

uchar A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command(0XB6+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X12); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A2*16]);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command(0XB6+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X13); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A3*16]);

}

}

}

/***************设置参数显示******************/

void dis_Val4(uchar s)

{

uchar x,y;

uint i=0;

uchar A1,A2,A3;

A1=s/100;

A2=(s-A1*100)/10;

A3=s-A1*100-A2*10;

for(y=0;y<2;y++) //百位显示

{

Write_IIC_Command(0XB6+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X15); //横向第四个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表

}

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A2*16]);

}

}

for(y=0;y<2;y++) //十位显示

{

Write_IIC_Command(0XB6+y); //纵向页

Write_IIC_Command(00); //横向离左部边缘开始的距离

Write_IIC_Command(0X16); //横向第五个字

for(x=0;x<8;x++) //横向像素

{

Write_IIC_Data(show1[x+y*8+A3*16]);

}

}

}

/********************picture**********************/

void cleardisp()

{

uchar x,y;

for(y=0;y<8;y++)

{

Write_IIC_Command(0xb0+y);

Write_IIC_Command(0x00);

Write_IIC_Command(0x10);

for(x=0;x<128;x++) //横向像素

{

Write_IIC_Data(0X00);

}

}

}

/***********************Initial code*********************/

void Initial_LY096BG30()

{

Write_IIC_Command(0xAE); //display off

Write_IIC_Command(0x20); //Set Memory Addressing Mode

Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid

Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7

Write_IIC_Command(0xc8); //Set COM Output Scan Direction

Write_IIC_Command(0x00); //---set low column address

Write_IIC_Command(0x10); //---set high column address

Write_IIC_Command(0x40); //--set start line address

Write_IIC_Command(0x81); //--set contrast control register

Write_IIC_Command(0x7f);

Write_IIC_Command(0xa1); //--set segment re-map 0 to 127

Write_IIC_Command(0xa6); //--set normal display

Write_IIC_Command(0xa8); //--set multiplex ratio(1 to 64)

Write_IIC_Command(0x3F); //

Write_IIC_Command(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content

Write_IIC_Command(0xd3); //-set display offset

Write_IIC_Command(0x00); //-not offset

Write_IIC_Command(0xd5); //--set display clock divide ratio/oscillator frequency

Write_IIC_Command(0xf0); //--set divide ratio

Write_IIC_Command(0xd9); //--set pre-charge period

Write_IIC_Command(0x22); //

Write_IIC_Command(0xda); //--set com pins hardware configuration

Write_IIC_Command(0x12);

Write_IIC_Command(0xdb); //--set vcomh

Write_IIC_Command(0x20); //0x20,0.77xVcc

Write_IIC_Command(0x8d); //--set DC-DC enable

Write_IIC_Command(0x14); //

Write_IIC_Command(0xaf); //--turn on oled panel

}

/*-----------------------------------------*/

void red_eeprom(void)

{

time1=IapReadByte(IAP_ADDRESS); //十位

time2=IapReadByte(IAP_ADDRESS+1);

}

/***************************************/

void write_eeprom( )

{

IapEraseSector(IAP_ADDRESS); //扇区擦除

IapProgramByte(IAP_ADDRESS,time1); /**/

IapProgramByte(IAP_ADDRESS+1,time2);

}

/********************显示待机**********************/

void Diswait()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb6+y); //竖向第一行 待

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*11]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb6+y); //竖向第一行 机

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*12]); //字符表第8个字

}

}

}

/************电机一前进*****/

void LEFT_FORWARD()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 启

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*8]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 动

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*4]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 进

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*5]); //字符表第8个字

}

}

}

/*************电机一后退****/

void LEFT_BACK()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 启

Write_IIC_Command(0x00);

Write_IIC_Command(0x15); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*9]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 动

Write_IIC_Command(0x00);

Write_IIC_Command(0x16); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*4]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 进

Write_IIC_Command(0x00);

Write_IIC_Command(0x17); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*5]); //字符表第8个字

}

}

}

/**************电机一左进停止***/

void Left_ForStop()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 进

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*8]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 停

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*2]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 止

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*3]); //字符表第8个字

}

}

}

/**************电机一左退停止***/

void Left_BackStop()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 退

Write_IIC_Command(0x00);

Write_IIC_Command(0x15); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*9]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 停

Write_IIC_Command(0x00);

Write_IIC_Command(0x16); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*2]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb0+y); //竖向第一行 止

Write_IIC_Command(0x00);

Write_IIC_Command(0x17); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*3]); //字符表第8个字

}

}

}

/************电机二前进*****/

void RIGHT_FORWARD()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 启

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*8]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 动

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*4]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 进

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*5]); //字符表第8个字

}

}

}

/*************电机二后退****/

void RIGHT_BACK()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 启

Write_IIC_Command(0x00);

Write_IIC_Command(0x15); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*9]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 动

Write_IIC_Command(0x00);

Write_IIC_Command(0x16); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*4]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 进

Write_IIC_Command(0x00);

Write_IIC_Command(0x17); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*5]); //字符表第8个字

}

}

}

/**************电机二左进停止***/

void RIGHT_ForStop()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x10); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 进

Write_IIC_Command(0x00);

Write_IIC_Command(0x11); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*8]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 停

Write_IIC_Command(0x00);

Write_IIC_Command(0x12); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*2]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 止

Write_IIC_Command(0x00);

Write_IIC_Command(0x13); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*3]); //字符表第8个字

}

}

}

/**************电机二左退停止***/

void RIGHT_BackStop()

{

uchar x,y;

uint Cnt=32;

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 左

Write_IIC_Command(0x00);

Write_IIC_Command(0x14); //横向第一个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 退

Write_IIC_Command(0x00);

Write_IIC_Command(0x15); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*9]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 停

Write_IIC_Command(0x00);

Write_IIC_Command(0x16); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*2]); //字符表第8个字

}

}

//

for(y=0;y<2;y++)

{

Write_IIC_Command(0xb2+y); //竖向第一行 止

Write_IIC_Command(0x00);

Write_IIC_Command(0x17); //横向第二个字

for(x=0;x<16;x++) //横向像素

{

Write_IIC_Data(show2[x+y*16+Cnt*3]); //字符表第8个字

}

}

}

// MOTORRUN_L;=0; //

// MOTORRUN_R;=0; //

/**************定时中断*************************/

void timer0() interrupt 1

{

aa++;

if(aa>=30) //指示灯计数30取反

{

// OUT=~OUT;

aa=0;

}

if(MOTORARUN_L==1)

{

timeA++; //计数加

if(timeA<time1) //小于设置值

{

L1_PWM=0; //输出低电平

}

else if(timeA>time1&&timeA<99) //大于设置值小于MAX 99

{

L1_PWM=1; //输出高电平

timeA=0; //计数值归零

}

else if(timeA>99)

{

timeA=0; //计数值归零

}

}

else if(MOTORARUN_L==0)

{

L1_PWM=1;

L1_EN=1;

}

if(MOTORARUN_R==1)

{

timeA++; //计数加

if(timeA<time1) //time=20

{

R1_PWM=0;

}

else if(timeA>time1&&timeA<99)

{

R1_PWM=1;

timeA=0;

}

else if(timeA>99)

{

R1_PWM=0;

timeA=0;

}

}

else if(MOTORARUN_R==0)

{

R1_PWM=1;

R1_EN=1;

}

//电机一动作

if(MOTORBRUN_L==1)

{

timeB++; //计数加

if(timeB<time2) //小于设置值

{

L2_PWM=0; //输出低电平

}

else if(timeB>time2&&timeB<99) //大于设置值小于MAX 99

{

L2_PWM=1; //输出高电平

timeB=0; //计数值归零

}

else if(timeB>99)

{

timeB=0; //计数值归零

}

}

else if(MOTORBRUN_L==0)

{

L2_PWM=1;

L2_EN=1;

}

if(MOTORBRUN_R==1)

{

timeB++; //计数加

if(timeB<time2) //time=20

{

R2_PWM=0;

}

else if(timeB>time2&&timeB<99)

{

R2_PWM=1;

timeB=0;

}

else if(timeB>99)

{

R2_PWM=0;

timeB=0;

}

}

else if(MOTORBRUN_R==0)

{

R2_PWM=1;

R2_EN=1;

}

//电机二动作

}

/**************TMOD***********************************/

/**| 定时器1 | | 定时器0 |**/

/***GATE C/T M1 M0 GATE C/T M1 M0 ***/

//M1 M0 00 13位定时器/计数器,兼容8048定时模式,TL1使用低五位,TH1使用全部八位

//M1 M0 01 16位定时器/计数器

//M1 M0 10 8位自动重载定时器,当溢出时将TH1的值自动载入TL1

//M1 M0 11 定时器1无效

//M1 M0 11 定时器0作为双八位定时器/计数器,TL0作为八位定时器/计数器,通过标准定时器0

//的控制位控制,TH0仅作为一个八位定时器,由定时器1 的控制位控制

/*************************************************/

void main( ) /*主程序开始*/

{

TMOD&=0xF0; //设置定时器模式

TL0=0x00; //设置定时初始值

TH0=0x28; //设置定时初始值

ET0=1;

TF0=1; //清除TF0标志

TR0=1; //定时器0开始计时

EA=1; //

P3M0=0XFF; //强推挽

P3M1=0X00;

MOTORARUN_L=0; //电机A左使能关闭

MOTORARUN_R=0; //电机A右使能关闭

MOTORBRUN_L=0; //电机B左使能关闭

MOTORBRUN_R=0; //电机B右使能关闭

reset_io(); //

Initial_LY096BG30(); //初始化显示屏

Delay_50ms(2);

cleardisp(); //清除显示

Diswait(); //显示待机

Left_ForStop();

Left_BackStop(); //RIGHT

RIGHT_ForStop();

RIGHT_BackStop(); //RIGHT

red_eeprom(); //

dis_Val1(time1); //

dis_Val2(time1); //

while(1)

{

/***************电机一延时参数加*************/

dis_Val(aa);

dis_Val4(count);

RstKey(); //按键复位

for(;kcounter<5;) //按键循环5次

{

if(!D1_ADD) //按键低电平

{

LowVoltKey();

}

else if(~!D1_ADD) //按键高电平

{

HighVoltKey();

}

}

if(kstatus>=4) /*按键状态标志大于等于3为有效值*/

{ /*循环检测 */

time1++;

if(time1>99)

time1=0;

write_eeprom();

dis_Val1(time1);

}

/***************电机一延时参数减*************/

RstKey(); //按键复位

for(;kcounter<5;) //按键循环5次

{

if(!D1_DEC) //按键低电平

{

LowVoltKey();

}

else if(~!D1_DEC) //按键高电平

{

HighVoltKey();

}

}

if(kstatus>=4) /*按键状态标志大于等于3为有效值*/

{ /*循环检测 */

time1--;

if(time1<1)

time1=99;

write_eeprom();

dis_Val1(time1);

}

/***************电机二延时参数加*************/

RstKey(); //按键复位

for(;kcounter<5;) //按键循环5次

{

if(!D2_ADD) //按键低电平

{

LowVoltKey();

}

else if(~!D2_ADD) //按键高电平

{

HighVoltKey();

}

}

if(kstatus>=4) /*按键状态标志大于等于3为有效值*/

{ /*循环检测 */

time2++;

if(time2>99)

time2=0;

write_eeprom();

dis_Val2(time2);

}

/***************电机二延时参数减*************/

RstKey(); //按键复位

for(;kcounter<5;) //按键循环5次

{

if(!D2_DEC) //按键低电平

{

LowVoltKey();

}

else if(~!D2_DEC) //按键高电平

{

HighVoltKey();

}

}

if(kstatus>=4) /*按键状态标志大于等于3为有效值*/

{ /*循环检测 */

time2--;

if(time2<1)

time2=99;

write_eeprom();

dis_Val2(time2);

}

////////////////////////////////

//电机一左进 开左使能 关右使能 0关 1开

RstKey();

if(MOTORARUN_L==0) //如果电机左进关闭状态

{

for(;kcounter<5;) //按键循环5次

{

if(!INTPUT1) //按键低电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(~!INTPUT1) //按键高电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORARUN_L=1; //电机左运行标志

MOTORARUN_R=0; //电机右运行标志

L1_EN=0; //

LEFT_FORWARD(); //显示电机左进

}

}

//电机一左进停止 关左近使能 0关 1开

RstKey(); //高电平关电机左进

if(MOTORARUN_L==1) //如果电机左进开启状态

{

for(;kcounter<5;) //按键循环5次

{

if(~!INTPUT1) //按键高电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(!INTPUT1) //按键低电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORARUN_L=0;

Left_ForStop(); //显示左进停止

}

}

//电机一左退 开右使能 关左使能 0关 1开

RstKey();

if(MOTORARUN_R==0) //如果电机左退关闭状态

{

for(;kcounter<5;) //按键循环5次

{

if(!INTPUT2) //按键低电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(~!INTPUT2) //按键高电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORARUN_R=1; //电机右运行标志

MOTORARUN_L=0; //电机左运行标志

R1_EN=0;

LEFT_BACK(); //显示电机左退

}

}

//电机一左退停止 关右使能 0关 1开

RstKey(); //高电平关电机左退

if(MOTORARUN_R==1) //如果电机左退开启状态

{

for(;kcounter<5;) //按键循环5次

{

if(~!INTPUT2) //按键高电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(!INTPUT2) //按键低电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORARUN_R=0;

Left_BackStop(); //显示左退停止

}

}

//电机二左进 开左使能 关右使能 0关 1开

RstKey();

if(MOTORBRUN_L==0) //电机二左进关闭状态

{

for(;kcounter<5;) //按键循环5次

{

if(!INTPUT3) //按键低电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(~!INTPUT3) //按键高电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORBRUN_L=1; //电机左运行标志

MOTORBRUN_R=0; //电机右运行标志

L2_EN=0; //

RIGHT_FORWARD(); //显示电机左进

}

}

//电机二左进停止 关左使能 0关 1开

RstKey(); //高电平关电机左进

if(MOTORBRUN_L==1) //电机二左进开启状态

{

for(;kcounter<5;) //按键循环5次

{

if(~!INTPUT3) //按键高电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(!INTPUT3) //按键低电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORBRUN_L=0;

RIGHT_ForStop(); //显示左进停止

}

}

//电机二左退 开右使能 关左使能 0关 1开

RstKey();

if(MOTORBRUN_R==0) //电机二左退关闭状态

{

for(;kcounter<5;) //按键循环5次

{

if(!INTPUT4) //按键低电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(~!INTPUT4) //按键高电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORBRUN_R=1; //电机右运行标志

MOTORBRUN_L=0; //电机左运行标志

R2_EN=0;

RIGHT_BACK(); //显示电机左退

}

}

//电机二左退停止 关右使能

RstKey(); //高电平关电机左退

if(MOTORBRUN_R==1) //电机二左退开启状态

{

for(;kcounter<5;) //按键循环5次

{

if(~!INTPUT4) //按键高电平

{

LowVoltKey(); //按键低电平 计数器加一状态标志加一

}

else if(!INTPUT4) //按键低电平

{

HighVoltKey(); //按键计数器加一 状态标志归零

}

}

if(kstatus>=3) /*按键状态标志大于等于3为有效值*/

{

MOTORBRUN_R=0;

RIGHT_BackStop(); //显示左退停止

}

}

}

} //L1287CODE5861 12 14

1K的电阻到ADC输入口, ADC输入口再并一个电容到地

相关推荐
一路往蓝-Anbo2 小时前
第 1 章:M33 领航——STM32MP257F-DK 硬件解密与启动逻辑重构
linux·stm32·嵌入式硬件·重构
一路往蓝-Anbo3 小时前
第 2 章:全能开发环境与交叉编译工具链构建
stm32·单片机·嵌入式硬件·网络协议
我在这里呀5 小时前
DSP 多个 PWM 同步总出问题?28377S 同步链路和主从配置一次讲清!
单片机·嵌入式硬件
余生皆假期-6 小时前
硬件基础知识补全【六】BJT 晶体管 (三极管)
单片机·嵌入式硬件
嵌入式×边缘AI:打怪升级日志6 小时前
ARM Cortex-M 单片机启动流程与向量表深度解析(保姆级复习笔记)
arm开发·笔记·单片机
叫我韬韬6 小时前
硬核调试:在 Keil 中通过全手动栈回溯定位 FreeRTOS 死机任务
stm32·单片机·freertos
jyhappy1237 小时前
深入理解 STM32 的 GPIO — 从零开始点亮第一颗 LED
c语言·stm32·单片机·嵌入式硬件·mcu
上海合宙LuatOS18 小时前
LuatOS核心库API——【i2c】I2C 操作
linux·运维·单片机·嵌入式硬件·物联网·计算机外设·硬件工程
总结所学20 小时前
Typora最新版破解教程
嵌入式硬件