锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-02-15 23:00:00 j4k07999传感器

主要学习材料

江科大 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是4K512字节程序空间RAM空间;   52是8K512字节程序空间RAM空间;   53是12K512字节程序空间RAM空间;   14是14K512字节程序空间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 – 管脚数

二进制转化为十六进制

在这里插入图片描述

第一次点灯失败

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

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

点灯成功

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

点灯代码与以前学过的C有点不同,主函数不需要返回值;以前是

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

按照以前的习惯,return 0 时,出现warning

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;
		}
	}
}

按一下亮,再按一下灭

这里需要有一个非常重要的注意点,那就是按键抖动,有硬件消抖,也有软件消抖;我们这里采用软件消抖;

#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);
	}
}

小结

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章