#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char pwm_M1_val ;//M1電機占空比值 取值范圍0-255,0最快
unsigned char pwm_M2_val;//M2電機占空比值 取值范圍0-255 ,0最快
unsigned char pwm_M3_val;//M3電機占空比值 取值范圍0-255,0最快
unsigned char pwm_M4_val;//M4電機占空比值 取值范圍0-255 ,0最快
unsigned char pwm_t;//周期
sbit led_right=P1^1; // 定義右路尋跡為P1.1
sbit led_middle=P1^2; // 定義中路尋跡為P1.2
sbit led_left=P1^3; // 定義左路尋跡為P1.3
sbit PWM2A=P1^4;//定義M1電機為P1.4的I/O口,即為小車右邊第一個電機
sbit PWM2B=P1^5;//定義M2電機為P1.5的I/O口,即為小車左邊第一個電機
sbit PWM0B=P1^6;//定義M3電機為P1.6的I/O口,即為小車左邊第二個電機
sbit PWM0A=P1^7;//定義M4電機為P1.7的I/O口,即為小車右邊第二個電機
sbit SER =P2^5;//定義74hc595芯片 DS腳數據線
sbit RCK =P2^6;//定義 LATCH腳 輸出存儲器鎖存時鐘線
sbit SCK =P2^7;//定義輸入時鐘線
void delay(unsigned int z)//毫秒級延時
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void HC595SendData(u8 SendVal)
{
u8 i;
for(i=0;i<8;i=i++)
{
SER=SendVal&0x80;//1000 0000 1000 0000
SendVal=SendVal<<1;//0000 0000 0000 0000 每次取1位左移
SCK=0; //先將串行時鐘輸入端SH_CP置成低電平
_nop_();
_nop_(); //兩個時鐘周期
SCK=1; //數據在串行時鐘輸入端SH_CP的上升沿輸入到移位寄存器
}
RCK=0; //鎖存
_nop_();
_nop_();
RCK=1; //移位寄存器上升沿時,數據進入存儲寄存器
}
void forward() //小車前進
{
PWM2A=1; //M1電機使能
PWM2B=1; //M2電機使能
PWM0B=1; //M3電機使能
PWM0A=1; //M4電機使能
HC595SendData(0x95);//1001 0101 M1,M2反轉 M3,M4正轉,小車前進
delay(3000) ;
}
void left_run() //小車左轉
{
PWM2A=1; //M1電機使能
PWM2B=1; //M2電機使能
PWM0B=1; //M3電機使能
PWM0A=1; //M4電機使能
HC595SendData(0x95);//0000 0101 右側電機前進,左側電機不動
delay(3000) ;
}
void right_run() //小車右轉
{
PWM2A=1; //M1電機使能
PWM2B=1; //M2電機使能
PWM0B=1; //M3電機使能
PWM0A=1; //M4電機使能
HC595SendData(0x95);//1001 0000 左側電機前進,右側電機不動
delay(3000) ;
}
void turn_back() //小車后退
{
PWM2A=1; //M1電機使能
PWM2B=1; //M2電機使能
PWM0B=1; //M3電機使能
PWM0A=1; //M4電機使能
HC595SendData(0x6a);//0110 1010 左側電機前進,右側電機后退
delay(3000) ;
}
void stop() //小車停止
{
PWM2A=0; //M1電機不使能
PWM2B=0; //M2電機不使能
PWM0B=0; //M3電機不使能
PWM0A=0; //M4電機不使能
delay(3000) ;
}
//定時器0中斷
void timer0() interrupt 1
{
pwm_t++;//周期計時加
if(pwm_t == 255)
pwm_t=PWM2A=PWM2B=PWM0A=PWM0B=0;
if(pwm_M1_val == pwm_t)//M1電機占空比
PWM2A = 1;
if(pwm_M2_val == pwm_t)//M2電機占空比
PWM2B = 1;
if(pwm_M3_val == pwm_t)//M3電機占空比
PWM0B = 1;
if(pwm_M4_val == pwm_t)//M4電機占空比
PWM0A = 1;
}
void main()
{
TMOD |= 0x02;//定時器工作方式2,8位自動重裝模塊
TH0 = 220;
TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
TR0 = 1;//啟動定時器0
ET0 = 1;//允許定時器0中斷
EA = 1;//總中斷允許
while(1)
{ //沒有檢測到黑線,小車不動
if(led_right==1&&led_middle==1&&led_left==1) //沒有檢測到黑線
{
stop() ;//調用小車停止函數
}
else
{
if(led_right==0&&led_middle==0&&led_left==0) //左邊檢測到黑線
{
forward();//前進
}
if(led_right==0&&led_middle==1&&led_left==1) //右邊檢測到黑線
{
right_run();//右轉
}
if(led_right==1&&led_middle==1&&led_left==0) //左邊檢測到黑線
{
left_run();//左轉
}
}
}
}
|