MAIN函数
#include "max.c"
sbit out1=P2^4; //左边轮
sbit out2=P2^5;
sbit out3=P2^6; //右边轮
sbit out4=P2^7;
uchar sec,min,flag;
uchar disp_buffer[4];
/***************电机驱动部分************/
void delayms(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++) ;
}
void run()
{
out1=1;
out2=0;
out3=1;
out4=0;
delayms(40);
out1=out2=out3=out4=0;
delayms(4);
}
void turn_left() //左转弯
{
out1=out2=0;
out3=1;
out4=0;
delayms(30);
out1=out2=out3=out4=0;
delayms(10);
}
void turn_right() //右转弯
{
out3=out4=0;
out1=1;
out2=0;
delayms(30);
out1=out2=out3=out4=0;
delayms(10);
}
void turn_right_90() //右转不大于90度的弯道
{
out3=out4=0;
out1=1;
out2=0;
delayms(1200);
}
void turn_left_90() //左转不大于90度的弯道
{
out1=out2=0;
out3=1;
out4=0;
delayms(1200);
}
/***************电机驱动部分************/
void System_Init()
{
Init_Max7221();
TMOD=0X01;
IE=0X83;
IP=0X02;
IT0=0;
TR0=1;
EX0=1;
TH0=0X38; //50ms定时
TL0=0XB0;
P1=0xff;
}
void main()
{
System_Init();
while(1)
{
switch(P1)
{
case 0xf6: run();break;
case 0xfe: turn_left_90();break;
case 0xfc: turn_left();break;
// case 0xff: run();break;
case 0xf7: turn_right_90();break;
case 0xf8: turn_left();break;
case 0xf1: turn_right();break;
case 0xf3: turn_right();break;
// case 0xf4: run();break;
// case 0xf2: run();break;
case 0xf5: turn_right_90();break;
// case 0xfa: run(); break;
default: run();break;
}
}
}
//定时器作计时器用。
void timer0()interrupt 1
{
TH0=0X38;
TL0=0XB0;
display(min,sec,disp_buffer);
if(++flag==19)
{
flag=0;
if(++sec==60)
{
sec=0;
++min;
}
}
}
//按下开关,停止计时,小车停止。
void extern0()interrupt 0
{
TR0=0;
out1=out2=0;
out3=out4=0;
}
MAX函数
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit Max7221DIN = P2^0;
sbit Max7221CSB = P2^1;
sbit Max7221CLK = P2^2;
/*****max7219控制计时部分********/
void WriteMax7221(uchar Address,uchar Data)
{
uchar i;
Max7221CSB = 0;
for (i=0;i<8;i++)
{
Max7221CLK = 0;
Max7221DIN = (Address&(0x80>>i)); //由高到低写入数据。
_nop_();
_nop_();
Max7221CLK = 1;
_nop_();
_nop_(); //延时一个机器周期,使用时必须包含intrins头文件。
}
for (i=0;i<8;i++)
{
Max7221CLK = 0;
Max7221DIN = (Data&(0x80>>i)) ; //由高到低写入数据。
_nop_(); //例如8:则会写入0000 1000,
_nop_();
Max7221CLK = 1;
_nop_();
_nop_();
}
Max7221CSB = 1;
}
void Init_Max7221()
{
WriteMax7221(0x09,0xff);
WriteMax7221(0x0a,0x07);
WriteMax7221(0x0b,0x04);
WriteMax7221(0x0c,0x01);
}
void display(uchar min,uchar sec,uchar disp_buffer[4])
{
uint i;
disp_buffer[3]=sec%10;
disp_buffer[2]=sec/10;
disp_buffer[1]=10;
disp_buffer[0]=min;
for(i=0;i<4;i++)
WriteMax7221(i+1,*(disp_buffer+i)) ;
}
/*****max7219控制计时部分********/
说明
主函数还需调用instrins.h函数,reg52.h函数及string.h函数。这里不多赘余,自己加上去就行了。我们在实现循迹的功能外加了数码管显示走的时间,数码管是用max7221驱动的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
这个程序我们在小车上试过了,可以。转锐角的时候时而有点困难,这与我们使用红外对管少有关。
一周热门 更多>