首页 > 其他分享 >51单片机笔记[1]-基础实验

51单片机笔记[1]-基础实验

时间:2022-08-29 00:26:40浏览次数:86  
标签:P1 51 低电平 笔记 键盘 单片机 按键 sbit include

实验目的

  1. 掌握使用KEIL,Proteus软件
  2. 掌握程序下载方法

实验内容

点亮发光二极管

按下K1按键(P2.0),点亮发光二极管(P1.0)LED1
按下K2按键(P2.1),LED1~LED8(P1口)双向流水灯
P1.0口连接的发光二极管,编写子程序,实现闪烁5次后,常亮

矩阵键盘按键显示

按下矩阵键盘(4*4),通过数码管静态显示按键键码值0-F

数码管显示

P2口连接的7段共阳极数码管,编写子程序实现循环显示1-F
P1口连接的7段共阳极数码管,编写子程序实现循环显示9-1

实验原理

io口的4种模式

  • 推挽输出
  • 高阻输入(上拉输入)
  • 开漏输出
  • 准双向I/O

51单片机操作io口

sbit:定义特殊功能寄存器的位变量.
P4^0:P4组io的第一个管脚

4x4键盘读取

常见的按键扫描方式有:

  • io口直接与按键一一对应,适用于io口较多的情况
  • 矩阵式,通过行扫描和列扫描最终确定按键,但是这样会造成键位冲突
  • 使用逻辑芯片扩展,如74HC595D并入串出芯片
  • 电阻采样扩展,设置不同的按键电阻,按下键时单片机AD采样到不同的电压

矩阵键盘的按键扫描方式

对于矩阵键盘,我们只能逐行扫描,然后读取列的状态信号。如果R3行输出低电平,那么黄色按键如果有按下动作的话,那读取C2列信号也应该为低电平,而该行上其他没有按下动作的按键的列信号则为高电平。因此,我们可以得到矩阵键盘的基本扫描步骤:

  1. R1输出低电平,R2、R3、R4输出高电平,逐个读取C1、C2、C3、C4判断列信号,如果都为高电平则R1行上没有按键按下。
  2. R2输出低电平,R1、R3、R4输出高电平,逐个读取C1、C2、C3、C4判断列信号。
  3. R3输出低电平,R1、R2、R4输出高电平,发现C2列信号为低电平,那么可以判断得R3行的C2列的按键有按下动作。
  4. R4输出低电平,R1、R3、R4输出高电平,逐个读取C1、C2、C3、C4判断列信号。

如此循环往复,扫描的按键的我们知道有按键按下动作,那么又怎么知道是哪一个按键按下呢?这时,我们最好定义一个键值全局变量,给矩阵行列上的每一个的按键编一个唯一的号码。当扫描的某一行某一列的按键动作后,把对应的编号复制给键值变量,这样我们判断这个键值,就知道是哪个按键有触发动作了。

注意事项:R行引脚全部设置为开漏,C列引脚全部设为上拉输入

实验过程

仿真图

LED流水灯 矩阵键盘按键

流程图

画的可能不太标准,还请见谅

发光二极管 双向流水灯 LED闪烁 数码管显示 矩阵键盘扫描

程序

1.c

#include <reg52.h>
#include <stdio.h>
sbit LED0=P1^0;
sbit BUTTON1=P2^0;
sbit BUTTON2=P2^1;
void delay()//延时函数
{
  unsigned char a,b;
	for(a=0;a<200;a++)
	for(b=0;b<200;b++);;
}
void key()
{
	if(BUTTON1==0)
	{
		delay();
		if(BUTTON1==0)
		{
			LED0=~LED0;
		}
		while(!BUTTON1);
		          
	}
}
void main(void){
while(1){
	LED0=1;
	key();
}
}

2.c

//流水灯

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>//循环移位
#define LED(NUM) LED##i
sbit BUTTON=P2^1;
	//灯
	sbit LED1=P1^0;
	sbit LED2=P1^1;
	sbit LED3=P1^2;
	sbit LED4=P1^3;
	sbit LED5=P1^4;
	sbit LED6=P1^5;
	sbit LED7=P1^6;
	sbit LED8=P1^7;
	unsigned char LED[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//延时函数
void delay(){
	int a,b;
	for(a=0;a<200;a++) for(b=0;b<200;b++);;
}
int main(void){
	while(1){
		BUTTON=1;
		if(BUTTON==0){
			int i;
			for(i=1;i<8;i++){
				//LED(NUM)=1;
				P1=LED[i];
				delay();
			}
			for (i=8;i>0;i--){
				P1=LED[i];
				delay();
				
			}
		}
	}
}

3.c:面向百度编程

标签:P1,51,低电平,笔记,键盘,单片机,按键,sbit,include
From: https://www.cnblogs.com/qsbye/p/16634393.html

相关文章

  • HCIA学习笔记二十五:三层交换机实现VLAN间路由
    一、三层交换机功能模型二、三层交换机配置三、三层交换机实现VLAN间路由实验 1)分别在交换机中拖出1台S5700、终端中拖出2台PC机,然后选择设备连线,点击Copper进行设备......
  • 22年8月份redis、docker笔记
    redis docker基础   ......
  • vue3项目-小兔鲜儿笔记-03-首页模块02
    1.骨架效果目的:为了在加载过程中等待效果更好,封装骨架屏组件实现步骤:骨架屏组件需暴露的属性:高、宽、背景颜色,是否启用动画使用插件的方式进行全局注册<templa......
  • Spring学习笔记(三)——Spring依赖注入
    1.SpringBean属性注入的几种方式1.1构造函数注入使用构造函数实现属性注入大致步骤如下:在Bean中添加一个有参构造函数,构造函数内的每一个参数代表一个需要注入的属......
  • Linux学习笔记3——vi和vim编辑器
    Linux学习笔记3——vi和vim编辑器一、vi和vim编辑器:vi和vim是Linux中的文本编辑器,用来在Linux中创建、查看或编辑文本文件,就好像window系统的记事本一样,但是不能查看图片......
  • Linux学习笔记2——目录结构
    Linux学习笔记2——目录结构一、Linux的目录结构:Linux只有一个根目录:/层级式的目录结构:1)root:该目录为系统管理员目录,root是具有超级权限的用户。2)bin->usr/bin:存放系......
  • HCIA学习笔记二十四:单臂路由实现VLAN间路由
    一、VLAN的缺点• VLAN隔离了二层广播域,也就严格地隔离了各个VLAN之间的任何流量,分属于不同VLAN的用户不能互相通信。二、使用VLANTrunking• 二层交换机和路由器之......
  • Mysql的视图使用场景笔记
    mysql的视图本质上就是一条预定义的联表查询sql语句当设计一个数据库模型的时候,各个数据表模型之间的关系在一定程度上是独立的,即使两个数据模型表之间存在一对多或者多对......
  • Python学习笔记(十一)-- Django API RESTful
    1.Django restframework之序列化https://www.cnblogs.com/midworld/p/11380194.html  2.写API的三个重点(1)路由;(2)视图类(提供给用户访问相当于原来的视图函数);(3)序列化......
  • 【笔记】Oracle 窗口函数
    Oracle窗口函数简单来说,窗口函数是分析函数的一种,通常可以理解成over()函数构成:函数名①()over(partitionby分组的列名orderby排序的列名XXX)XXX是指特殊使用的......