2021-04-17 粤嵌单片机兴趣课(五)

粤嵌单片机兴趣课(五)

前言
本次实验所用单片机为C51单片机CPUAT89C52,使用的开发软件是Keil uVision4,将程序下载到单片机所使用的软件为stc-isp-15xx-v6.85H.exe

注意事项
(1)如果需要创建工程并添加文件和学习如何向单片机烧入可执行程序,请参考博客https://blog.csdn.net/APPDREAMER/article/details/115568852,本篇博客不在做相关赘述。

(2)由于实验结果需要上传视频,因此没有将相关实验结果图片放置于博客中。

(3)具体学习所有过程请参考博客粤嵌单片机兴趣课(一)~(六)
(注:链接如下:粤嵌单片机兴趣课(一)
(注:链接如下:粤嵌单片机兴趣课(二)
(注:链接如下:粤嵌单片机兴趣课(三)
(注:链接如下:粤嵌单片机兴趣课(四)
(注:链接如下:粤嵌单片机兴趣课(六)

C51单片机之延时函数的实现方式一
1、使用stc-isp-15xx-v6.85H.exe中的软件延时计算器功能,按照如图所示设置,点击生成代码

2、生成1毫秒的延时函数。(注:程序如下)

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

C51单片机之延时函数的实现方式二
1、使用stc-isp-15xx-v6.85H.exe中的定时器计算器功能,按照如图所示设置,点击生成代码

2、生成1毫秒的定时器中断函数。(注:程序如下)

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

3、利用中断实现延时器(注:程序如下)

int count = 0;
	void Timer0Init(void)		//1毫秒@11.0592MHz
	{
		AUXR &= 0x7F;		//定时器时钟12T模式
		TMOD &= 0xF0;		//设置定时器模式
		TMOD |= 0x01;		//设置定时器模式
		TL0 = 0x66;		//设置定时初值
		TH0 = 0xFC;		//设置定时初值
		TF0 = 0;		//清除TF0标志
		TR0 = 1;		//定时器0开始计时
	}

	void time0_isr() interrupt 1
	{
		conut--;
		TL0 = 0x66;		//设置定时初值
		TH0 = 0xFC;		//设置定时初值
		
	}
	void delayms(unsigned int n)//延时n毫秒
	{
		conut = n;
		while(n>0);
	}
	
	int main()
	{
		delayms(8);
	}

C51单片机之红外线循迹避障实验
1、实验原理如图所示。
(注:概念原理如下)

(注:电路连接原理如下)

2、通过原理连接好电路然后代码实现即可。(注:程序如下)

#include<reg52.h>
//电机引脚
sbit a1 = P0^0;
sbit a2 = P0^1;
sbit b1 = P0^2;
sbit b2 = P0^3;


//红外引脚
sbit infrared1 = P1^0;     //右边红外
sbit infrared2 = P1^1;	   //左边红外

//函数声明
void ahead();
void left();
void right();
void leftahead();
void rightahead();
void slowahead();
void Delay1ms();
//void delayms(unsigned int n);	   
void stop();

unsigned char i;

//延时函数,延时1ms	 
void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

//前进
void ahead()
{
     a1=0;
	 a2=1;
	 b1=1;
	 b2=0;
}

//原地左转
void left()
{
	a1=0;
	a2=0;
	b1=1;
	b2=0;
}

//原地右转
void right()
{
	a1=0;
	a2=1;
	b1=0;
	b2=0;
}

//后退
void goback()
{
     a1=1;
	 a2=0;
	 b1=0;
	 b2=1;
}

//左前方前进(右轮全速,左轮差速前进)
void leftahead()
{
  	 b1=1;
	 b2=0;
	 Delay5ms();
	 b2=1;
	 Delay5ms();
	 /*
	 a1=1;
	 while(1)
	 {
	   	 a2=0;
	     Delay25ms();
	     a2=1;
	     Delay25ms();
	 }
	 */
	 a1=1;
     a2=1;

}

//停止前进
void stop()
{
   a1=1;
   a2=1;
   b1=1;
   b2=1;
}

//右前方前进
void rightahead()
{
	 a1=0;
	 a2=1;
     Delay5ms();
	 a2=0;
     Delay5ms();
	 /*
	 b1=1;
	 while(1)
	 {
	   	 b2=0;
	     Delay25ms();
	     b2=1;
	     Delay25ms();
	 }
	 */
	  b1=1;
	  b2=1;

}

//慢速前进
void slowahead()
{
	 while(1)
	 {
	   	 a1=0;
		 b1=1;

		 a2=1;
		 b2=0;
         for (i=1;i<=4;i++)
		 {
		      Delay1ms();
		 }
	     a2=0;
		 b2=1;
         for (i=1;i<=4;i++)
		 {
		      Delay1ms();
		 }
	 }
}

int main()
{ 
	while(1)
	{
	//小车正常移动
      	 a1=0;
		 b1=1;

		 a2=1;
		 b2=0;
         for (i=1;i<=4;i++)
		 {
		      Delay1ms();
		 }
	     a2=0;
		 b2=1;
         for (i=1;i<=4;i++)
		 {
		      Delay1ms();
		 }
     //对红外进行判断,使小车循迹移动
	 if(infrared1==0 && infrared2==0)
	 {
	 a1=0;
	 b1=1;
	 a2=1;
     Delay5ms();
	 a2=0;
	 Delay5ms();
	 b2=0;
     Delay5ms();
	 b2=1;
	 Delay5ms();
	 }
	 Delay5ms();
	 if(infrared1==1 && infrared2==0)
	 {
	    while(1)
		{
		  rightahead();
	      if(infrared1==0)
		  {
			break;
		  }
		}
	 }
     Delay5ms();
	 if(infrared2==1 && infrared1==0)
	 {
	     while(1)
		{
		  leftahead();
	      if(infrared2==0)
		  {
			break;
		  }
		}
	 }
	 Delay5ms();
	 if(infrared2==1 && infrared1==1)
	 {
	    stop();
		return 0;
	 }
	 Delay5ms();
	 }
	 return 0; 
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值