51单片机出现正在检测单片机的原因以及点灯测试的注意事项

51单片机是对兼容英特尔8051指令系统单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。

关于开发环境注意事项:

我们一般使用keil5来生成程序文件,用stc-isp将其下载到开发板上。由于下载资源很丰富,所以这里不赘述下载过程(keil5有两个版本,一个适用于51,另一个适用于开发stm32,虽然长得一样,但是适用范围不同,需要仔细甄别)。

这里需要注意的是:在用stc-isp下载程序时,需要严格按照单片机上的型号选择。例如我的单片机型号是STC89C52RC(虽然51单片机操作大都类似,但这里的型号必须严格对照自己单片机的型号选择),最开始选成了STC89C5,导致一直显示正在检测单片机

 具体型号可以看自己的单片机上的丝印 

以及单片机写入程序时需要冷启动,即重启单片机,否则也会一直显示正在检测单片机,所以在电脑上点击下载后要按下单片机开关重启(这个白色按钮就是开关)。

 还有就是在插线的时候动作要轻,有一些单片机由于设计原因,它的USB接口会很紧,所以插上去的时候动作要慢,不然很有可能会折断接口!!!

点灯测试代码

独立按键控制LED移位

#include <REGX52.H>

void Delayxms(unsigned int x )		//@12.000MHz
{
	unsigned char i, j;
	while(x--)
	{
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}


void main()
{
	P2 = 0xFE;
	while(1)
	{
		if(P3_1==0)
		{
			Delayxms(20);
			while(P3_1==0);
			Delayxms(20);
			P2 = ~((~P2)>>1);
			if(P2==0xFF)
			{
				P2=0x7F;
			}
		}
		if(P3_0==0)
		{
			Delayxms(20);
			while(P3_0==0);
			Delayxms(20);
			P2=~((~P2)<<1);
			if(P2==0xFF)
			{
				P2=0xFE;
			}
		}
	} 
}

独立按键控制LED显示二进制

#include <REGX52.H>

void Delayxms(unsigned int x )		//@12.000MHz
{
	unsigned char i, j;
	while(x--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		}while (--i);
	}
}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delayxms(20);
			while(P3_1==0);
			Delayxms(20);
			P2--;
		}
	}
}

这里有一个知识点,就是对于无符号的整数0,减1后应该为-1,但是事实上,由于整数在单片机中以补码表示,0-1表示为0000 0000(补)+1111 1111(补)= 1111 1111(补),如果它是有符号整数,那么计算机会认为它是整数-1,这没问题。但如果它被定义为无符号整数,因为无符号整数中没有符号位,所以它会被认为是Umax,也就是+255,这也是之前一直困扰我的问题,为什么0-1=255,在这里做下解释,防止哪天忘了。

另外:在写程序时需要先仔细看下开发板的原理图(虽然都差不多),但由于厂家不同,其引脚的命名也可能会不同(有时候还会很莫名奇妙),所以别人写的51程序有时候不一定使用于自己的单片机。

比如这里的独立按键模块,按道理来说K1应该接P3_0,K2应该接P3_1,但是这里却反过来了(原因不详,应该是设计问题)。

 

版权声明:本文为CSDN博主「念980」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_62343847/article/details/122734553

生成海报
点赞 0

念980

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许