粤嵌单片机兴趣课(五)
前言
本次实验所用单片机为C51单片机
,CPU
为AT89C52
,使用的开发软件是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;
}