51单片机入门(江科大)之个人笔记

发布于:2022-11-05 ⋅ 阅读:(769) ⋅ 点赞:(0)

目录

P3.单片机及开发板介绍

P4.点亮一个小灯泡

P5.LED闪烁

P6.LED流水灯

P7.独立按键控制LED亮灭

P8.独立按键控制LED状态

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

P10.独立按键控制LED移位

P11.静态数码管显示

P12.动态显示


P3.单片机及开发板介绍

1.单片机英文名为Micro Controller Unit,简称CPU;

2.CPU是芯片,是一种芯片;

3.ROM是read only memory;RAM是random access memory;

 两者都是存储器,只是RAM的速度要远远高于ROM的速度,在电脑日常操作中,很多程序都将临时运行的程序命令,存放在内存中,但一旦关机或者停电,内存里原本临时存储的程序信息将全部被清空,也就是内存只能临时存储东西,不能长久保存,而ROM则可以存储,即使掉电后也可以找到之前存储的文件,这也就是硬盘了;

4.    51单片机的由来

5. 命名规则

     例如我手上的这块写着:stc 89 c 52 40 I-PDIP 40意为:

电压在3.8到5.5V之间;工作频率可达40MHZ;为工业级PDIP包装;管脚有40只;

6.管脚图

 其中Gnd为负极;Vcc为正极;XTAL1,2为晶振接口;RST为复位接口;

如图:

 电容用于滤波;

P4.点亮一个小灯泡

1.不要按图索骥,你的单片机可能和老师的不一样;

比如:我的51是STC89C52RC,在STC-ISP中应选择正确的单片机型号;

我的晶振频率为11.0592MHZ;在软件延时计算器中不要选12M;

2.创建project:

选第二个是错的!

建新的文件夹

选择AT

 

创建代码

打函数

3.STC-ISP下载以后要开关单片机一次;

P5.LED闪烁

1.复制代码

2.在函数头处添加:(有nop)

3.注意IO口为大写的P;

4.在主函数中调用辅函数

Int main()
{
 P2=0xEF;
 Delay500ms();
 P2=0xFF;
 Delay500ms();
}

P6.LED流水灯

1.第一个头文件的来源

2.在Group1中添加iten时要把代码命名为main;

非则可能会出warning;

大佬解答:

3.上流水代码

void main()
{
 while(1){
   P2=0xFE;
 Delay500ms() ;
  P2=0xFD;
 Delay500ms() ;
  P2=0xFB;
 Delay500ms() ;
  P2=0xF7;
 Delay500ms() ;
  P2=0xEF;
 Delay500ms() ;
  P2=0xDF;
 Delay500ms() ;
  P2=0xBF;
 Delay500ms() ;
  P2=0x7F;
 Delay500ms() ;
  P2=0xFE;
 Delay500ms() ;
 }
}

P7.独立按键控制LED亮灭

1.按键的原理

按下io口电位为零(无电阻与地线GND相接)

 2.单个灯泡的控制:

用“_”

3.用“_”前改:

<REG52.H>为<REGX52.H>;

4.计算原理:

异或的原理是如果相同为0(false),反之;

P8.独立按键控制LED状态

1.主函数头为void!

2.要消除抖动——延时

3.自由定义延时时长(函数中加参数)

4.利用取反,实现开关灯!

 if表示按下;

 while表示长按;

完成一个过程后灯泡状态取反;

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

1.当延时函数中出现    _nop_()   时;

函数头加上   #include <INTRINS.H>  ;

2.有时单片机无法工作,可能要在主函数中加while(1):

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

3.PX的初始值为1111 1111(二进制);

4.全代码如下:

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int x)	
{
	unsigned char i, j;
  while(x--)
	{
		_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
 }
}
void main()
{ while(1){
	if(P3_1==0){
		Delay(20);
		while(P3_1==0);
		Delay(20);
	P2--;
	}
 }
}

注意unsigned表示无符号;

P10.独立按键控制LED移位

1.要认识移位符号<<和>>;

例如:P2=0x01<<1 意味着P2z从0000 0001变为0000 0010;

2.左移代码:

注意当LEDNum为0时,要赋回最大值 ;

3.右移代码:

同理要赋回最小值;

4.要注意的是,本代码需要给赋初值来让P2_0点亮:

即P2==~(0x01);

P11.静态数码管显示

1.数码管引脚定义

2.四位一体的引脚:

3.  74HC138译码器

 作用:

使用三个管脚控制八个LED;

使用方法:

C B A为三位的二进制数,可表示十进制中的0到7;

如果输入111,即使Y7电位为0;

4.    74HC245

作用:   由于单片机高电平驱动能力差,使用其从电源处汲取能量,加强驱动能力,使LED更亮;



5.我的单片机的不同:

a对应P0_0;

b对应1,c对应2.....dp对应P0_7;

 我的译码器接口为P2_2,3,4;

6.代码:

#include <REGX52.H>

void nix(int i,int j){

char a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
P0=a[j];

switch(i){
	case 1:P2_4=1;P2_3=1;P2_2=1;break;
	case 2:P2_4=1;P2_3=1;P2_2=0;break;
	case 3:P2_4=1;P2_3=0;P2_2=1;break;
	case 4:P2_4=1;P2_3=0;P2_2=0;break;
	case 5:P2_4=0;P2_3=1;P2_2=1;break;
	case 6:P2_4=0;P2_3=1;P2_2=0;break;
	case 7:P2_4=0;P2_3=0;P2_2=1;break;
	case 8:P2_4=0;P2_3=0;P2_2=0;break;
 }
}

void main()
{ 
	nix(7,2);
	while(1){
	};
}


7.一定要在主函数中加while(1),不然会出现多个显示并且数码管不够亮;

8.数码管显示数数组:

char a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

P12.动态显示

1.重影产生的原因:调用函数时上一次的段选和下一次的卫选串味了;

 

2.消隐:

在段选后先延时保证显示,再清零:

 

4.数码管的驱动:

 

5.代码如下:

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned char x)	
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
while(x--){
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);
  }
}
void nix(int i,int j){

char a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

switch(i){
	case 1:P2_4=1;P2_3=1;P2_2=1;break;
	case 2:P2_4=1;P2_3=1;P2_2=0;break;
	case 3:P2_4=1;P2_3=0;P2_2=1;break;
	case 4:P2_4=1;P2_3=0;P2_2=0;break;
	case 5:P2_4=0;P2_3=1;P2_2=1;break;
	case 6:P2_4=0;P2_3=1;P2_2=0;break;
	case 7:P2_4=0;P2_3=0;P2_2=1;break;
	case 8:P2_4=0;P2_3=0;P2_2=0;break;
 }
 P0=a[j];
 Delay(1);
 P0=0x00;
}

void main()
{ 

	while(1){
		nix(1,1);
		nix(2,2);
		nix(3,3);	
	};
}


网站公告

今日签到

点亮在社区的每一天
去签到