#冲刺创作新星#51单片机出现正在检测单片机的原因以及点灯测试的 原创

念980
发布于 2022-9-23 15:36
浏览
0收藏


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

关于开发环境注意事项:

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

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

#冲刺创作新星#51单片机出现正在检测单片机的原因以及点灯测试的-鸿蒙开发者社区

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

#冲刺创作新星#51单片机出现正在检测单片机的原因以及点灯测试的-鸿蒙开发者社区

编辑

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

#冲刺创作新星#51单片机出现正在检测单片机的原因以及点灯测试的-鸿蒙开发者社区


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

点灯测试代码

独立按键控制LED移位

#include <REGX52.H>

void Delayxms(unsigned int		//@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		//@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,但是这里却反过来了(原因不详,应该是设计问题)。

#冲刺创作新星#51单片机出现正在检测单片机的原因以及点灯测试的-鸿蒙开发者社区


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-9-27 21:26:58修改
收藏
回复
举报
回复
    相关推荐