调速程序.zip
(48.97 KB, 下载次数: 1)
#include <reg52.h>
#include <intrins.h>
#define led1 d1=0;d2=0
#define led2 d1=0;d2=1
#define led3 d1=1;d2=0
#define UCHAR unsigned char
#define UINT unsigned int
#define uchar unsigned char
#define uint unsigned int
/*
button0,button1 是小车的启动停止控制位
*/
sbit button0 = P1^0; //开始 停止
/*
左右循迹传感器
*/
sbit track_l = P1^1; // 循迹传感器1
sbit track_r = P1^2; // 循迹传感器2
/*
左右电机正负极
*/
sbit motorl1 = P1^4; //电机接口
sbit motorl2 = P1^5;
sbit motorr1 = P1^6;
sbit motorr2 = P1^7;
/*
数码管位选
*/
sbit d1=P2^6; //段选1
sbit d2=P2^7; //段选2
sbit K2=P3^0; //开始 停止
sbit K3=P3^1; // 复位
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};// 带小数点
uchar count,num,knum;
void tracking(void);
/*
小车的行驶状态
*/
void front(void);
void right(void);
void left(void);
void stop(void);
void right_back(void);
void left_back(void);
void delay_us(UINT t);
void pwm(void (*car_move)(void), UCHAR speed);
void delay(uint z) //秒表延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}
void unit() //设置定时器
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void keyscan() //按键子程序
{
if(K2==0) //计时开始 停止
{
delay(5);
if(K2==0)
{
while(!K2);
TR0=~TR0;
}
}
if(K3==0) //复位键
{
delay(5);
if(K3==0)
{
while(!K3);
knum=0;
num=0;
}
}
}
void display() //显示时间子程序
{
uchar shi,ge;
shi=knum/10;
ge=knum%10;
led2;
P0=table[num];
delay(3);
led3;
P0=table1[ge];
delay(3);
led1;
P0=table[shi];
delay(5);
}
void tracking(void)
{
track_l = 1; //左循迹传感器
track_r = 1; //右循迹传感器
while(1)
{
if(track_l == 1 && track_r == 1) // 都在黑线外
{
front();
pwm(front, 15); // 前进
}
else if(track_l == 1 && track_r == 0) // 左边在外 右边在里
{
right(); // 右转
pwm(right, 1);
}
else if(track_l == 0 && track_r == 1) // 左边在里 右边在外
{
left(); // 左转
pwm(left, 1);
}
else if(track_l == 0 && track_r == 0) //都在黑线内
{stop();}
}
}
void front(void)
{
motorl1 = 1;
motorr1 = 1;
motorl2 = 0;
motorr2 = 0;
}
void right(void)
{
motorl1 = 1;
motorr1 = 0;
motorl2 = 0;
motorr2 = 0;
}
void left(void)
{
motorl1 = 0;
motorr1 = 1;
motorl2 = 0;
motorr2 = 0;
}
void stop(void)
{
motorl1 = 0;
motorr1 = 0;
motorl2 = 0;
motorr2 = 0;
}
void
time0() interrupt 1 //定时器中断0方式1中断子函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==2)
{
count=0;
num++;
if(num>=9)
{
num=0;
knum++;
if(knum>=99)
{
knum=0;
}
}
}
}
void delay_us(UINT t)
{
while(--t);
}
void pwm(void (*car_move)(void), UCHAR speed) // pwm调速
{
(*car_move)();
delay_us(speed * 200);
stop();
delay_us(100);
}
void xianshi (void)
{
{
unit();
while(1)
{
keyscan();
display(); } //加秒表显示
}
}
void main()
{
tracking();
xianshi();
}
一周热门 更多>