51单片机 1.概述及点灯测试

主要学习资料

江科大 51单片机入门教程
https://www.bilibili.com/video/BV1Mb411e7re?p=4&vd_source=169e0bcb4f2e42dcc73afa3b48bb3cac

单片机介绍

●单片机 英文 MicroControllerunit 简称MCU
●内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能
●单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
●单片机跟计算机相比,算是一个袖珍版的计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但MCU成本低、体积小、结构简单,在生活和 工业控制领域大有所为
●学习使用单片机是了解计算机原理与结构的最佳选择
●51单片机是对兼容英特尔8051指令系统的单片机的统称

STC89C52单片机(本学习使用的开发板型号)

●所属系列:51单片机系列
●公司:STC公司
●位数:8位
●RAM:512字节
●ROM:8K(Flash)
●工作频率:12MHZ

命名规则

●STC89C52系列单片机命名规则

STC – 公司
89 – 芯片系列 STC12T/6T 8051
C – 工作电压:C:5.5V-3.8V LE:3.6V-2.4V/3.4V-2.4V
52 – 程序空间及RAM空间大小。

如:
		51是4K字节程序空间及512字节RAM空间;
		52是8K字节程序空间及512字节RAM空间;
		53是12K字节程序空间及512字节RAM空间;
		14是14K字节程序空间及512字节RAM空间;
	  	54是16K字节程序空间及1280字节RAM空间;
	  	58是32K字节程序空间及1280字节RAM空间;
	 	510是40K字节程序空间及1280字节RAM空间;
	  	512是48K字节程序空间及1280字节RAM空间;
	  	514是56K字节程序空间及1280字节RAM空间;
	  	516是62K字节程序空间及1280字节RAM空间;

40 – 工作频率
I – 工作温度范围:I:工业级 -40℃-85摄氏度 C:商业级 0℃-70℃
PDIP – 封装类型:如 PDIP,LQFP,PLCC,PQFP
40 – 管脚数

二进制转化十六进制

51单片机 1.概述及点灯测试_第1张图片

第一次点灯失败

在用STC-ISP将点灯程序下载到开发板上时,一直显示正在检测单片机,点灯失败;

失败原因:STC-ISP上单片机型号选择错误,需要严格按照所使用的的单片机型号选,我的单片机型号是STC89C52RC,我还按照视频教程选择了STC89C52

51单片机 1.概述及点灯测试_第2张图片

点灯成功

51单片机 1.概述及点灯测试_第3张图片

#include 

void main()
{
	P2 = 0x69; //0110 1001
	while(1);
}

点灯代码和之前学的C还是有点不一样的,主函数不需要返回值;之前的是

int main()
{
	...
	return 0;
}

当我试着按照之前的习惯,return 0 时,出现warning
51单片机 1.概述及点灯测试_第4张图片

LED灯闪烁

#include 

void DelayXms( unsigned int X );

void main()
{
	while(1){
		P2 = 0xAA; //1010 1010
		DelayXms(1000);
		P2 = 0x55; //0101 0101
		DelayXms(1000);
	}
}

void DelayXms( unsigned int X )
{
	unsigned char i,j;
	
	while(X--){
		i = 2;
		j = 239;
		
		do{
			while(--j);
		}while(--i);
	}
}

LED跑马灯

1.枚举

#include 
#include 

void DelayXms( unsigned int X );

void DelayX500ms( unsigned int X );

void main()
{
	while(1){
		
		P2 = 0xFE;  //1111 1110
//		DelayXms(500);
		DelayX500ms(2);
		
		
		P2 = 0xFD; //1111 1101
		DelayX500ms(2);
		
		P2 = 0xFB; //1111 1011;
		DelayX500ms(2);
		
		P2 = 0xF7; //1111 0111;
		DelayX500ms(2);
		
		P2 = 0xEF; //1110 1111;
		DelayX500ms(2);
		
		P2 = 0xDF;
		DelayX500ms(2);
		
		P2 = 0xBF;
		DelayX500ms(2);
		
		P2 = 0x7F;
		DelayX500ms(2);
	}
}

void DelayXms( unsigned int X )
{
	unsigned char i,j;
	while(X--){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void DelayX500ms( unsigned int X )		//@12.000MHz
{
	unsigned char i, j, k;

		while(X--){
			
			_nop_();
			i = 4;
			j = 205;
			k = 187;
			do
			{
				do
				{
					while (--k);
				} while (--j);
			} while (--i);
	}
}

2.位运算

#include 

void DelayXms( unsigned int xms );

void main()
{
	unsigned char LEDNum = 0;
	while(1){
		P2 = ~(0x01 << LEDNum);
		LEDNum++;
		LEDNum %= 8;
		
		DelayXms(500);
	}
}

void DelayXms( unsigned int xms )
{
	unsigned char i,j;
	
	while(xms--){
		i = 2;
		j = 239;
		
		do{
			while(--j);
		}while(--i);
	}
}

独立按键

按下亮灯,松手灯灭

#include 

void main()
{
	while(1){
		if(P3_1 == 0){
			
			P2_0 = 0;
		}else{
			P2_0 = 1;
		}
	}
}

按一下亮,再按一下灭

这里需要有一个非常重要的注意点,那就是按键抖动,有硬件消抖,也有软件消抖;我们这里采用软件消抖;
51单片机 1.概述及点灯测试_第5张图片

#include 

void DelayXms( unsigned int xms );

void main()
{
	while(1){
		if(P3_1 == 0){
			
			DelayXms(20);
			while(P3_1 == 0);
			DelayXms(20);
			
			P2_0 = ~P2_0;
		}
	}
}

void DelayXms( unsigned int xms )
{
	unsigned char i,j;
	
	while(xms--){
		i = 2;
		j = 239;
		
		do{
			while(--j);
		}while(--i);
	}
}

按键显示二进制

#include 

void DelayXms( unsigned int xms );

void main()
{
	unsigned char LEDNum = 0;
	while(1){
		if(P3_1 == 0){
			DelayXms( 20 );
			while(P3_1 == 0);
			DelayXms( 20 );
			
			LEDNum++;
			P2 = ~LEDNum;
		}
	}
}

void DelayXms( unsigned int xms )
{
	unsigned char i,j;
	
	while(xms--){
		i = 2;
		j = 239;
		
		do{
			while(--j);
		}while(--i);
	}
}

按键控制LED位移

#include 

void DelayXms( unsigned int xms );

void main()
{
	unsigned char LEDNum = 0;
	P2 = 0xFE;
	
	while(1){
		
		if(P3_1 == 0){
			
			DelayXms( 20 );
			while(P3_1 == 0);
			DelayXms( 20 );
			
			LEDNum++;
			LEDNum %= 8;
			
			P2 = ~(0x01 << LEDNum);
		}
		
		if(P3_0 == 0){
			
			DelayXms( 20 );
			while(P3_0 == 0);
			DelayXms( 20 );
			
			if(LEDNum == 0){
				LEDNum = 7;
			}else{
				LEDNum--;
			}
			
/*			LEDNum += 7;
			LEDNum %= 8;
*/			
			P2 = ~(0x01 << LEDNum);
		}
	}
}

void DelayXms( unsigned int xms )
{
	unsigned char i,j;
	
	while(xms--){
		i = 2;
		j = 239;
		
		do{
			while(--j);
		}while(--i);
	}
}

小结

千里之行,始于足下。我已经会点灯,离做出智能机器人不远了!!!

你可能感兴趣的:(学习笔记之51单片机,51单片机)