#冲刺创作新星#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 //@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,但是这里却反过来了(原因不详,应该是设计问题)。