51单片机学习笔记
前言
这篇文章是我在学习51单片机时的笔记
学习视频链接:51单片机入门教程-2020版 程序全程纯手打 从零开始入门
祝我学习顺利
学习安排
硬件要求:
51单片机一只(淘宝很多),Windows系统电脑一台(苹果叉出去)
软件要求:
Keli5,STC-ISP
单片机和开发板简介
单片机,检测MCU,内部集成CPU、RAM、ROM、定时器等一系列电脑常用硬件
单片机的任务是信息采集、处理、硬件设备
单片机和计算机相比体积小但是性能较差,成本低结构简单
unsigned int:无符号int(16位)型数据(单片机内int是默认有单位的)
同理:unsigned short、unsigned long……
祝:非整型除了unsigned char(8位十六进制数)不能加unsigned前缀表示无符号,unsigned和后面有空格
LCD1602调试工具
使用LCD1602液晶屏作为调试窗口
使用液晶屏的时候数码管和LED模块因为引脚占用无法使用
函数 |
作用 |
参数 |
LCD_Init() |
初始化 |
无 |
LCD_ShowChar(1,1,’A’) |
显示一个字符 |
行,列,现实的字符 |
LCD_ShowString(1,3,”Hello”) |
显示字符串 |
行,起始列,字符串 |
LCD_ShowNum(1,9,123,3) |
显示十进制数字 |
行,起始列,数字,数字长度(范围1-5) |
LCD_ShowSignedNum(2,1,-66,2) |
显示有符号十进制数字 |
同上 |
LCD_ShowHexNum(2,1,0xA8,2) |
显示十六进制数字 |
同上 |
LCD_ShowBinNum(2,4,0xAA,8) |
显示二进制数字 |
行,起始列,数字(只能用十六进制数字代替),长度 |
51单片机矩阵键盘
51单片机中矩阵键盘接在STC89C52RC的10-17脚,我们可以通过逐列扫描的方法来完成对按键是否被按下进行确定,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| unsigned char Matrixkey() { unsigned char KeyNumber=0; // ???? P1=0xFF; P1_3=0; if(P1_7==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=1;} if(P1_6==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=5;} if(P1_5==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=9;} if(P1_4==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=13;} P1=0xFF; P1_2=0; if(P1_7==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=2;} if(P1_6==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=6;} if(P1_5==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=10;} if(P1_4==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=14;} P1=0xFF; P1_1=0; if(P1_7==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=3;} if(P1_6==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=7;} if(P1_5==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=11;} if(P1_4==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=15;} P1=0xFF; P1_0=0; if(P1_7==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=4;} if(P1_6==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=8;} if(P1_5==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=12;} if(P1_4==0){Delay(10);while(P1_7==0);Delay(10);KeyNumber=16;} return KeyNumber; }
|
这里我们声明了一个扫描的函数,在你按下后松开之前函数不会继续进行但是手松开之后会返回你按下按键对应的数值。
利用这个键盘我们可以完成一些简单的功能,比如说下面的代码利用矩阵键盘完成了一个简单的个位数计算器(Matrixkey()函数在Matrixkey头文件中定义了):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <REGX52.H> #include "Matrixkey.h" #include "Delay.h" #include "LCD1602.h" int Num1 = 0, Num2 = 0, Num3 = 0; int Answer = 0; unsigned char b; void main() { LCD_Init(); while (1) { LCD_ShowString(1, 1, "Input equations"); while (Num1 >= 10 || Num1 == 0) { Num1 = Matrixkey(); } LCD_ShowNum(2, 1, Num1, 1);
while (Num2 >= 14 || Num2 <= 9) { Num2 = Matrixkey(); } if (Num2 == 10) { b = '+'; LCD_ShowString(2, 2, "+"); } else if (Num2 == 11) { b = '-'; LCD_ShowString(2, 2, "-"); } else if (Num2 == 12) { b = '*'; LCD_ShowString(2, 2, "*"); } else if (Num2 == 13) { b = '/'; LCD_ShowString(2, 2, "/"); }
while (Num3 >= 10 || Num3 == 0) { Num3 = Matrixkey(); } LCD_ShowNum(2, 3, Num3, 1);
if (b == '+') { Answer = Num1 + Num3; } else if (b == '-') { Answer = Num1 - Num3; } else if (b == '*') { Answer = Num1 * Num3; } else if (b == '/') { Answer = Num1 / Num3; } LCD_ShowString(2,4,"="); if(Answer<0) { Answer=-Answer; LCD_ShowString(2,5,"-"); LCD_ShowNum(2, 6, Answer, 2); }else { LCD_ShowSignedNum(2, 5, Answer, 2); }
Num1 = Num2 = Num3 = 0; Delay(1); } }
|
蜂鸣器
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,其中的“源”指的是震荡源
有源蜂鸣器只要通电就可以发声,但是振荡频率固定
无源蜂鸣器内部不带振荡源,需要提供振荡脉冲的频率,但是发声频率可以调整
正负极看标志或者长短脚(长脚为正极)
串口
TXD = transmit exchange data
RXD = receive ~ ~
TXD和RXD要交叉连接,VCC和GND对接
只需单项数据传输时,可以只连接一根通信线
当电平标准不一致时,需要加电平转换芯片
电平标准是与数据对应关系1和0的表达方式,是传输线缆中人为规定的电压,常用的有以下三种
TTL电平:+5V表示1,0V表示0;
RS232电平:-3——-5V表示1,+3——+15V表示0
RS485电平:两线压差+2——+6V表示1,-2——-6V表示0(差分信号)’
前两者距离短,容忍电压大,常用于电脑等,后者距离远可达1km
相关术语:
· 全双工 : 通信双方可以在同一时刻相互传输数据
· 半双工 : 通信双方可以相互传输数据,但是必须分时复用一根数据线
· 单工 : 通信只能由一方发送到另一方,不能反向传输
· 异步 : 通信双方各自约定通信速率
· 同步 : 通信双方靠一根时钟线来约定通信速率
· 总线:连接各个设备的数据的传输线路
· 波特率:串口通信的速率(发送和接受各数据位ied间隔时间)
—目前已学习完毕,暂时不考虑继续更新—