//********************************
//程序
//*********************************
#include"reg51.h"
#include"math.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp1,temp2; //定义占空比的变量
uchar t=0; //定义中断记数器
///数码管
sbit shi=P1^6; /* 数码管 1--十位 */
sbit ge=P1^7; /* 数码管 2--个位 */
//uchar shuma; //****定义数码管的口,用P2口的P2^0到P2^7做为八位控制端,
//uint num1,num2;//数码管显示的数--num1十位,num2个位
uchar code table[]={
0x03,0x9f,0x25,0x0d,
0x99,0x49,0x41,0x1f,
0x01,0x09,0x11,0xc1,
0x63,0x85,0x61,0x71};
///按键
sbit an0=P3^5; /* 正反转 */
sbit an1=P3^6; /* 加速 */
sbit an2=P3^4; /* 减速 */
///电机控制位定义
sbit s1=P1^3; /* L298的Input 1 */
sbit s2=P1^4; /* L298的Input 2 */
uchar m1=0;//反转占空比
/* 电机1速度值 */
///ad转换
sbit cs=P1^0; /* ad--cs */
sbit rd=P1^1; /* ad--rd */
sbit wr=P1^2; /* ad--wr */
uchar ad,ap; //定义ad的口,用P0口的P0^0到P0^7做为八位接受端,
uchar k=1;//正反转标志;k==0--反转
sbit fz=P1^5;
uint v;
//****************************************
//***************延时函数****************
//***************************************
delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
{
for(j=0;j<11;j++);
}
}
//****************************************
//*************** 数码管-1-AD-显示函数 ***********
//***************************************
void display1(uchar trnum)
{
uchar sw,gw; //函数中的十位个位
uint x,y;
sw=trnum/16;
gw=trnum%16;
for(x=0;x<8;x++)
{
for(y=0;y<3;y++)
{
shi=0;ge=1;
P2=table[sw];
delay(2);
shi=1;ge=0;
P2=table[gw];
delay(2);
}
}
}
//****************************************
//*************** 数码管-2-键盘-显示函数 ***********
//***************************************
void display2(uchar tnum)
{
uchar swe;//,gwe; //函数中的十位个位
uint p,q;
swe=tnum/16;
//gwe=tnum%16;
for(p=0;p<8;p++)
{
for(q=0;q<2;q++)
{
shi=0;ge=1;
P2=table[swe];
delay(2);
// shi=1;ge=0;
// P2=table[gwe];
// delay(1);
}
}
}
//****************************************
//*************** 按键扫描函数 ***********
//***************************************
void keyscan()
{
if(an1==0) //加速
{
//delay(50);
if(an1==0)
{
ap=ap+16;
while(!an1);
{
display2(ap);
}
// delay(2);
while(!an1)
{
display2(ap);
}
}
}
if(an2==0) //减速
{
ap=ap-16;
//delay(50);
if(an2==0)
{
while(!an2)
{
display2(ap);
}
// delay(2);
while(!an2)
{
display2(ap);
}
}
}
}
//****************************************
//*************** 正负极扫描函数 ***********
//***************************************
void fanzhuan()
{
if(an0==0) //反转
{
delay(50);
if(an0==0)
{
k=!k;
while(!an0);
}
}
}
//****************************************
//*************** PWM---定时中断 ***********
//***************************************
void timer0() interrupt 1 using 2
{
TMOD=0x01;
TH0=(65536-10)/256; //一次中断的时间为50us
TL0=(65536-10)%256;
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
temp1=ad;
temp2=m1;//反转
}
if(k==1) //小车正转的标志
{
if(t<temp1)
{
s1=1; //右轮
s2=0;
}
else
{
s1=0; // 产生电机1的PWM信号 //一个PWM信号的周期为2.5ms
s2=0;
}
}
if(k==0) //小车正转的标志
{
if(t<temp2)
{
s2=1; //右轮
s1=0;
}
else
{
s1=0; // 产生电机1的PWM信号 //一个PWM信号的周期为2.5ms
s2=0;
}
}
t++; //完成一次中断,记数一次
if(t>255)
t=0; // 1个PWM信号由50次中断产生
}
//主函数
void main()
{
TMOD=0x01;
TH0=(65536-10)/256; //一次中断的时间为50us
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
k=1;
//m1=255;
//display(m1);
while(1)
{
if(fz==1)
{
//ad
cs=0;
wr=1;
_nop_();
wr=0;
_nop_();
wr=1;
fanzhuan();
for(v=0;v<1;v++)
{
fanzhuan();
display1(ad);
}
//an0=0;////////////////////////////////////////////
P0=0xff;
rd=1;
_nop_();
rd=0;
_nop_();
ad=P0;//;
fanzhuan();
m1=ad;
rd=1;
delay(1);
}
else if(fz==0)
{
ap=145;
display2(ap);
ad=ap;
m1=ap;
while(1)
{
cs=1;
fanzhuan();
keyscan();
ad=ap;
m1=ap;
}
}
keyscan();
}
}