单片机开发板的入门学习

宏定义:

  1. define eg:#define uchar unsigned char 他是预处理指令而不是语句,后面不加称号
  2. typedef eg: typedef 已有数据类型 新的数据类型 ;(这里要加分号)

函数类型:

  1. 自定义函数: 延时函数delay(毫秒级)

void delay (unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); /*该函数是用软件延时,耗费CPU资源。*/ }

(unsigned int z)是形参,到时候由用户自己输入的值,该值可以由主函数带入到该函数中来。

自定义函数可以看作为一个数学公式,里面的x,y是函数里面的定值。

给形参z赋值,如延时100毫秒:delay(100);

delay(100)就是调用延时函数,当在开始时定义好了延时函数,那么在main主函数中就可以这样直接调用。即将100赋值给z。

循环移位函数:

  1. 标准库函数(运用keil中自带函数类型则需要引用该头文件): intrins.h
  • 字符型循环左移:_crol_ *注意:只能移动字符型的,其他类型eg整形不能这样。
  • 字符型循环右移: _cror_

#include <intrins.h> viod test_crol (viod) { unsigned char a; unsigned char b; a=0xfe ; //1111 1110 b=_crol_(a,1); //b现在就是 0xfd 二进制为 1111 1101 左移之后即将第一个1移到了最后,然后之前每一位向左移动一位。 }

  • 左移运算符

它左移是将最高位直接移除,最后一位补0;与左移运算符是有区别的。

蜂鸣器:

在keil中写程序时,要在main外先sbit a=P1^2;这样是将P1^2端口用a来表示了,在main中就可以只用a了。

E(接vcc)处是接到5v电压的,当B处为0v时。电流将会从E到从C来导通,从而蜂鸣器开始工作。

当B处也为5v时,EC间将不会有电流产生,所以不会使蜂鸣器工作。


  1. temp= 0xf0; 即一次点亮四个灯,然后每次循环左移一位来制造流水灯效果。
  2. beep=~beep; ~的意思是按位取反,即如果原来beep=0;取反后得beep=1;的效果。

数码管静态显示:

  1. 七段加上右下角的小点,一共八段。
  2. 第一幅图是共阴极,即阴极接在了一块;第二幅图即为共阳极。

如何区分共阳极与共阴极:首先这是一位的数码管(即一个数字,还有两位三位等等),然后看最左边的图,一位有十个管脚与他相接,但是上下的中间那个都是公共的(可能为vcc或者gnd)(若为vcc即为共阳极,gnd为共阴极,现在就要判断他是vcc还是gnd)

用万用表黑表笔接中间,红表笔接c,如果c亮了,则说明中间就是gnd,即为共阴极。反之也可验证。

***锁存器——用以节约io接口的使用

D一端为输入端,Q为输出端。

💬 LE脚为高电平时,D端的信号可以传输到Q端,从而进行数据的传递。

LE为低电平时,D端的信号改变不会影响Q端的数据,即关闭了这个锁存器的影响,Q端的信号依然保持不变,此时打开影响其他端口的锁存器的口,再改变D端就去影响别的端口了。

打开锁存器(给LE高电平)即相当于打开这个🔒,你可以去改变里面的一系列信号了。

想要Q输出端能够输出高低电平信号时,必须让OE端口接低电平(gnd),否则Q端为高阻态(开路的状态)


查询芯片数据手册网址:alldatasheet.com


***上拉电阻

💬红色的点即为上拉电阻,蓝色的为排阻。

💬开漏状态:可以输出低电平,不能输出高电平。

准双向io可以正常输出高低电平的。

三角形的意思为非门,1信号变成0,0信号变成1。

当G处为1时,GS间有正向电压,能够将DS导通;当G为0时,GS间没有正向电压,DS不导通。

根据以上两张图可得,当寄存器处发出某一种信号时,管脚处就会接受那一种信号。所以可以正常输出高低电平!


这个状态名为漏极开路输出,当DS间不导通时,D(漏极)与左边部分分隔开相当于开路。

上图这个状态是内部没有上拉电阻的状态,所以要在外部装上上拉电阻(下图)使得变成类似上面的准双向,进而可以在输入高电平时输出高电平,输入低电平时可以输出低电平。

p0口因为时漏极开路的状态,所以必须外接上拉电阻!


***实践部分

WE1时第一个数码管的接地线

此时开始位选:

当WE1=0;时其他WE全接1,则开始段选时将某些段接高电平时才能由高到低导通,进而使得点亮。

而接地线为1时,再将某些段接高电平时不会形成电流,进而不能导通。


数码管动态显示:

💬静态显示只能控制多个数码管显示同一个数字(即位选可以多选,但是段选只能选择一个数字的)

💬动态显示即在几个位置之间跳跃显示,他利用了余晖和人眼暂留效果,进而可以在不同位置可以显示不同的数字(段选可以改变)

💬每个数字之间用一个延时函数,延时几毫秒即可,让它能够显示出来,不跳的太快,以至于让我们看见所有的全是亮的。


*思路分析:

  1. 首先要进行位选,所以我们要打开位选的锁存器(即给他那个端口高电平就 是打开)这样单片机的io口就和位选的端口相通了。
  2. 打开位选锁存器后,我们要将我们想让它亮的位置端口输入低电平,因为数码管是共阴极的,当我们将一个端口输入低电平,其余输入高电平,则在接下来的段选时输入高电平的时候电流只会从高电平流向低电平,进而点亮我们所选的那一个位置的数码管。
  3. 关闭位选锁存器(赋值该端口为低电平)打开段选锁存器(赋值该端口为高电平)此时单片机io口就和段的端口相通了,此时赋值段选的高低电平来点亮我们想要的数字。
  4. 循环这样的操作即可点亮所有的数码管,注意二进制的数字转换为十六进制(0x··)可以用程序员计算器来操作。
  5. 点亮各个位置数字之间用一个延时函数,只要延时几毫秒即可,否则我们会看见所有的数码管都会亮起来而且是错误的(这是在各个数码管之间跳动所致),所以要用个延时。

  • 当我们想要让他随时显示我们想要的数字,我们可以将它写成一个函数,那么数字显示的十六进制数我们可以将它保存在一个数组之中。
  • 当我们定义一个code类型时,这个数组就会被保存在rom中(rom内存更大且保存在里面的数据在后面程序执行过程中不会再被改变,这对于我们现在来说正是需要的);不用code类型,则会保存在ram中,(ram内存小,且在后续的过程中可以被改变)
  • 🙀其中这个数组作为形参,在定义时可以不在括号内定大小,在调用时直接将变量(装着常量的)装进中括号内来调用。

独立键盘:

💬按键通常是一种常开型开关,常态下两个触电断开,只有按下按键时才闭合。

1和2始终是连接在一起的,3和4始终连接在一起的。而1和3,2和4是断开的。

当按下按键时,1和3,2和4闭合,此时四个接口全部连在一起。


💬一开始赋值给P30高电平,当按键被按下时,线路导通接地,此时P30的高电平就会被拉低,当我们检测到P30的电压被拉低后就知道按键被按下。当断开开关后,P30又重新恢复到高电平,此时我们就知道按键没有按下处于断开状态。

🙀🙀其实一开始可以不给端口赋值1,因为内部上拉电阻的存在,所以一接电源,每个P端口都是高电平了!!!


当我们按下按键时,其实是存在抖动的,不可能是理想波形那样按下时就变成低电平,在抖动的过程中,可能多次变为低电平但又会抖动回去,所以我们需要在这里加一个延时函数后再用if来做判断是否为低电平。一般为20ms即可。


除了需要按键消抖之外,还要进行松手检测,图中的while即进行这个操作,当按下按键后,s2为0(低电平),在while中如果保持按下时 !取反后在while中就是1,也就是始终在while中循环直到松手时s2为1时,再取反后结束这个循环。

否则按一下就会加很多,因为程序循环的速度太快,按一次就会进行多次循环,这样的话就可以按一次松手后加一。


矩阵键盘:

首先来我们的目标是确定哪一行哪一列被按下了

  1. 确定列:给列的端口赋值1(高电平,高电平可以不用赋值),给行赋值低电平,然后如果某一列其中一个被按下后,其高电平的列端口会被行的低电平拉低,然后这个行列端口组成的二进制就能确定哪一列了。
  2. 确定行:给行端口赋值高电平1,列端口赋值低电平0,然后原理如上,按下后的那一行就会被拉低电平。
  3. 通过二者的叠加可知具体的哪一个按键被按下了。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值