版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
手把手教你学51单片机--C语言版(第3版)第一课:如何学习单片机自动化、电子电气、通信相关的一门主流技术ARM嵌入式、FPGA基础安身立命谋生的本领、毕业生找工作的敲门砖单片机学习为什么学习单片机单片机学习资深工程师讲解真正实用的技术和知识后续会在51单片机基础上录制STM32以及嵌入式操作系统的教学课程形象比喻,通俗易懂,由浅入深为什么学习金沙滩的单片机教程不断开源项目提供锻炼机会为什么先51单片机1、简单易学,上手快,容易建立学习信心。2、资料多,遇到困难解决渠道多。3、开发板便宜,学习成本低。(回馈社会,Kingst51开发板将以0利润成本价销售开发板)4、为学习其他型号打下良好的基础。如何学习单片机一个要领:在实践中成长!
四个步骤0
1鹦鹉学舌(抄)02照葫芦画瓢(仿)03它山之石可以攻玉(鉴)04理论实践结合,温故知新(思)学习条件0
1足够的信心、恒信和耐心02优秀的教程和教材03电脑和Kingst51开发板学前准备0
1编程软件Keil的安装02下载程序软件配套书籍:手把手教你学51单片机--C语言版(第3版)2-1:认识51单片机单片机内部三大资源FLASH(程序存储空间<ROM>)RAM(内存)SFR(特殊功能寄存器)51单片机和STC89C52RC什么是51单片机?兼容Intel的MCS-51体系架构的一系列单片机。STC89C52RC:8KFLASH、512字节RAM。1K=1024字节单片机最小系统特点:单片机可以运行程序,是单片机控制系统的核心。复位电路晶振电路电源电路三要素配套书籍:手把手教你学51单片机--C语言版(第3版)2-2:认识LED小灯LED小灯(发光二极管)1、LED小灯依靠电流驱动,不同颜色的LED小灯压降不同。其中红色和黄色1.8V到2.2V之间,绿色、蓝色和白色在3.0V到3.2V之间。2、红色贴片LED:电流1到20mA,在1到5mA亮度有所变化,5mA以上亮度基本无变化。LED发光二极管电路LED发光二极管以及限流电阻计算
欧姆定律:R=U/IR=3V/0.02A=150ΩR=3V/0.001A=3KΩ点亮一个LED发光二极管
关于USB供电电路的扩展小知识
Type-C口对Type-C口供电务必要接R55和R56两个电阻配套书籍:手把手教你学51单片机--C语言版(第3版)2-3:单片机的SFR与新建一个Keil工程单片机C语言SFR声明:
sfrP0=0x80;//SFR声明sfrTCON=0x88;sbitIT0=TCON^0;//位声明sbitLED=P0^0;一个字节是8位,一位控制一个I/O口,字节控制所有的I/O口 #include<reg52.h>1号:111111112号:111111113号:111111114号:11111111寄存器分布示意图reg52.h对于SFR的声明单片机每一个特殊功能寄存器都有独立的特殊功能提供给用户使用,以便用户控制单片机完成其强大的功能。如果将用户被比喻为将军,那么特殊功能寄存器可以理解为一个个的特种兵,用户可以调度他们完成一项项特殊任务。Keil软件建立工程和文件
配套书籍:手把手教你学51单片机--C语言版(第3版)2-4:编写点亮小灯的程序点亮一个LED发光二极管
单片机C语言的基本程序框架
#include<reg52.h>sbitLED=P0^0;voidmain(){LED=0;}1、main主函数,有且仅有一个主函数2、void为函数类型,即函数返回值类型3、函数体以{}开始和结束标志4、每条C语言语句以分号结束参考程序一:#include<reg52.h>sbitLED=P0^0;voidmain(){while(1){LED=0;}}参考程序二:#include<reg52.h>sbitLED=P0^0;voidmain(){LED=0;while(1);}
根据原理图编写点亮LED小灯的程序并且点亮小灯
配套书籍:手把手教你学51单片机--C语言版(第3版)3-1:电磁兼容(EMC)背景1、冬天的时候,空气比较干燥的城市,朋友们经常对电脑,铁柜等等放电,这就是“静电放电(ESD)”干扰。2、使用电钻这种带电机的设备的工作时,电视会有干扰或者影响,这就是“快速瞬间脉冲群(EFT)”的效果。3、雷电引起的电视或者电脑的重启死机甚至损坏,这就是“浪涌(Surge)的效果。电磁兼容(EMC):指电子设备或者系统在特定电磁环境中正常工作的能力,同时不会对其他设备或环境产生不可接受的电磁干扰。低频滤波电容低频滤波电容的作用:1、缓冲作用2、稳定作用选取要素:容值和耐压值低频滤波电容低频滤波电容,平常应用最多的是钽电容,电解电容,陶瓷电容,起到去除电源低频纹波,稳定电源的作用。高频滤波电容,IC电源附近,通常用104电容来进行去除高频干扰。100nf,0.1uf。电容名称:10x,即10*10xpf高频滤波电容
尤其工业产品,IC高频去耦电容,要尽可能短的距离将正极和负极桥连起来。多组电源的IC,每一组电源都要尽可能短的用104桥连,不走过长的线和过孔。高频滤波电容使用注意事项(工程经验)配套书籍:手把手教你学51单片机--C语言版(第3版)3-2:三极管的学习三极管按制造材料分为:锗管和硅管按结构类型分为:PNP和NPNb:基极e:射极c:集电极三极管的口诀:箭头朝内PNP,导通电压顺箭头过,电压控制导通,电流控制状态三极管三种状态:1、截止:e和b不导通2、饱和:e和b导通Ib>Iec/β3、放大:e和b导通Ib=Iec/β如果β=100,可以计算R47的最大值是143K。3ma/100=4.3/x三极管常见应用1、控制应用2、驱动应用74HC138控制LED电路图配套书籍:手把手教你学51单片机--C语言版(第3版)3-3:74HC138的学习74HC138控制LED小灯电路图74HC138应用电路74HC138真值表Kingst51开发板74HC138电路图配套书籍:手把手教你学51单片机--C语言版(第3版)3-4:闪烁LED小灯程序编写闪烁你的LED74HC138控制LED小灯电路图配套书籍:手把手教你学51单片机--C语言版(第3版)4-1:C语言变量和运算符二进制、十进制和十六进制十进制
二进制 十六进制0 0b0 0x000b0000~0b11111 0b1 0x012 0b10 0x023 0b11 0x034 0b100 0x04…… ……
……9 0b10010x0910 0b10100x0A11 0b1011
0x0B12 0b1100 0x0C13 0b1101 0x0D14 0b1110 0x0E15 0b1111 0x0F16 0b10000 0x1017 0b10001 0x11…… ……
……二进制0b00000000~0b11111111转十进制遵循8421原则例如0b1010转十进制0b11100100转十六进制0xE4进制和数字大小无关C语言的变量类型及范围C语言基本运算符加、减、乘、除和取余数+-
*/%a+b;a-b;a*b;a/b;a%b;a=3;b=2;区分=和==!=a=b;if(a==1)b=a;if(a!=1)b=a;自加和自减++--++b;b++;a=0;b=0;a=b++;a=0;b=1;C语言运算符左移<<右移>>X<<2X>>2左移,最低位填0补充;右移,最高位填0补充0xf00b11110000左移:11000000右移:00111100按位取反符号~
取反后1变成0,0变成10x0F取反后成为0xF0,即00001111->11110000配套书籍:手把手教你学51单片机--C语言版(第3版)4-2:C语言循环语句和函数的初步认识for语句的用法for语句的一般形式(用法1)for(表达式1;表达式2;表达式3){ (需要执行的语句);}1、表达式1只执行一次;2、判断表达式2是否成立,如果成立则执行循环内语句,而后执行表达式3。
......3、表达式2不成立,则直接跳出循环用法2:for(i=0;i<30000;i++);用法3:for(;;)for(i=0;i<2;i++){j++;}while语句的用法while语句的一般形式while(表达式){ 循环语句;}
while(1){LED=0;}for(i=0;i<30000;i++);LED=1;for(i=0;i<30000;i++);
i=0;while(i<3000){
i++;}do...while语句的用法do...while语句的一般形式
do{循环语句;}while(表达式);函数的简单介绍函数定义的一般形式:函数值类型函数名(形式参数列表){函数体}1、函数值类型2、函数名3、形式参数列表4、函数体5、main函数(必须有且唯一)6、语句注释//voidmain()//void即函数类型{//以下为声明语句部分unsignedinti=0;//定义一个无符号整型变量 i,并赋初值0
//以下为执行语句部分ENLED=0;//U3、U4两片74HC138总使能ADDR3=1;//使能U3使之正常输出ADDR2=1;//经U3的Y6输出开启三极管Q16ADDR1=1;ADDR0=0;while(1){LED=0;//点亮小灯for(i=0;i<30000;i++);//延时一段时间LED=1;//熄灭小灯for(i=0;i<30000;i++);//延时一段时间}}配套书籍:手把手教你学51单片机--C语言版(第3版)4-3:51单片机常用延时办法51单片机延时常用办法使用Keil仿真程序执行时间配套书籍:手把手教你学51单片机--C语言版(第3版)4-4:流水灯程序编写流水灯实验8个LED发光二极管,分别对应单片机IO口的P0.0到P0.7口,8个单片机IO口组成一个字节,在程序编写过程中,可以直接用P0来进行操作。C语言的8位二进制数代表了8个IO口P0=0xfe;0b111111100xFD0b111111010xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F.P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0
11111
1
1
00x010b000000010b111111100x020b000000100b111111010x040b000001000b11111011流水灯程序编写配套书籍:手把手教你学51单片机--C语言版(第3版)5-1:逻辑运算和逻辑电路阅读数据手册手册下载推荐:立创商城9012数据手册74CH138数据手册STC89C52RC数据手册逻辑运算&&:逻辑与,F=A&&B都为真则是真||:逻辑或,F=A||B任意一个为真则为真!:逻辑非,F=!A0b110011000b11110000&:按位与F=A&B0b11000000|:按位或F=A|B0b11111100~:按位取反F=~A0b00110011^:按位异或F=A^B0b00111100相异为1配套书籍:手把手教你学51单片机--C语言版(第3版)5-2:定时器和计数器定时器和计数器时钟周期:单片机时序中的最小单位,具体计算的方法就是时钟源分之一。机器周期:我们的单片机完成一个操作的最短时间。定时器:打开定时器后,定时器"存储寄存器"的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。定时器存储寄存器名称描述SFR地址复位值TH0定时器0x8C0x00TL0定时器0x8A0x00TH1定时器0x8D0x00TL1定时器0x8B0x00TCON—定时器控制寄存器的位分配(地址0x88、可位寻址)位76543210符号TF1TR1TF0TR0IE1IT1IE0IT0复位值00000000TCON——定时器控制寄存器的位描述位符号描述7TF1定时器1溢出标志。一旦定时器1发生溢出时硬件置1。清零有两种方式:软件清零,或者进入定时器中断时硬件清零。6TR1定时器1运行控制位。软件置位/清零来进行启动/停止定时器。5TF0定时器0溢出标志。一旦定时器0发生溢出时硬件置1。清零有两种方式:软件清零,或者进入定时器中断时硬件清零。4TR0定时器0运行控制位。软件置位/清零来进行启动/停止定时器。3IE1
外部中断部分,与定时器无关,暂且不看。2IT11IE00IT0TMOD—定时器模式寄存器的位分配(地址0x89、不可位寻址)位76543210符号GATE(T1)C/T(T1)M1(T1)M0(T1)GATE(T0)C/T(T0)M1(T0)M0(T0)复位值00000000TMOD——定时器模式寄存器的位描述符号描述T1/T0标T1的表示控制定时器1的位,标T0的表示控制定时器0的位。GATE该位被置1时为门控位。仅当‘INT0’脚为高并且TR0控制位被置1时使能定时器0,定时器开始计时,当该位被清0时,只要TR0位被置1,定时器0就使能开始计时,不受到单片机引脚INT0外部信号的干扰,常用来测量外部信号脉冲宽度。这是定时器一个额外功能,本节课暂不介绍。C/T定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟),被置1用作计数器功能。TMOD——定时器模式寄存器M1/M0工作模式M1M0工作模式描述000兼容8048单片机的13位定时器,THn的8位和TLn的5位组成一个13位定时器。011THn和TLn组成一个16位的定时器。1028位自动重装模式,定时器溢出后THn重装到TLn中。113禁用定时器1,定时器0变成2个8位定时器。T1:TH1高8位,TL1低8位TH1=0x05;TL1=0x05;T0:TH0高8位,TL0低8位TH1=0x05;TL1=0x05;使用定时器的步骤第一:设置特殊功能寄存器TMOD,配置好工作模式。第二:设置计数寄存器TH0和TL0的初值。第三:设置TCON,通过TR0置1来让定时器开始计数。第四:判断TCON寄存器的TF0位,监测定时器溢出情况。配套书籍:手把手教你学51单片机--C语言版(第3版)5-3:用定时器实现LED小灯闪烁使用定时器的方法第一:设置特殊功能寄存器TMOD,配置好工作模式。第二:设置计数寄存器TH0和TL0的初值。12/11059200第三:设置TCON,通过TR0置1来让定时器开始计数。第四:判断TCON寄存器的TF0位,监测定时器溢出情况。0.5HZ小灯闪烁程序配套书籍:手把手教你学51单片机--C语言版(第3版)5-4:认识数码管数码管原理和结构图KST-51开发板数码管图数码管显示0的程序编写数码管真值表字符01234567数值0xC00xF90xA40xB00x990x920x820xF8字符89ABCDEF数值0x800x900x880x830xC60xA10x860x8E配套书籍:手把手教你学51单片机--C语言版(第3版)5-5:数码管静态显示数码管真值表字符01234567数值0xC00xF90xA40xB00x990x920x820xF8字符89ABCDEF数值0x800x900x880x830xC60xA10x860x8E使用定时器的步骤第一:设置特殊功能寄存器TMOD,配置好工作模式。第二:设置计数寄存器TH0和TL0的初值。第三:设置TCON,通过TR0置1来让定时器开始计数。第四:判断TCON寄存器的TF0位,监测定时器溢出情况。数码管秒表程序配套书籍:手把手教你学51单片机--C语言版(第3版)6-1:数组的概念及应用数组的声明数组是一组变量,这组变量需要满足三个条件:1、具有相同的数据类型2、具有相同的名字3、在存储器中是被连续存放的数组的基本概念数组类型数组名[数组长度]数组类型数组名[数组长度]={初值列表};1、具备相同的数据类型。2、数组名需要符合规范,只能由字母、数字和下划线组成,第一个字符必须是字母或者下划线。3、方括号内的数组长度是一个常量或者常量表达式,并且必须是正整数。数组的使用和赋值1、初值列表里的数据之间要用逗号隔开。2、列表内初值数量等于或小于数组长度。3、若给数组元素的所有元素都赋值,可以省略数组长度。4、系统为数组分配连续的存储单元,数组元素的次序由下标决定。数组的初始化1、区分数组下标和数组元素个数的概念2、数组元素下标可以常量或变量或表达式,初始化必须常量3、数组整体赋值只能在初始化进行,程序只能单个元素赋值配套书籍:手把手教你学51单片机--C语言版(第3版)6-2:if和switch语句if语句的用法if语句的默认形式:if(条件表达式){语句1;}if...else语句if(条件表达式){语句1;}else{语句2;}sec++if(sec>=16){sec=0;}if(sec>=15){sec=0;}else{sec++;}if...elseif语句if(表达式1)
{语句1;}elseif(表达式2){语句2;}elseif(表达式3){语句3;}............else{语句n;}switch语句的用法switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;......case常量表达式n:语句n;default:语句n+1;}switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;......case常量表达式n:语句n;break;default:语句n+1;break;}配套书籍:手把手教你学51单片机--C语言版(第3版)6-3:数码管动态显示KST-51开发板数码管图动态显示的基本原理动态显示:多个数码管显示数字的时候,实际上是轮流点亮数码管(一个时刻只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余晖效应)。12数码管动态显示秒表流程图配套书籍:手把手教你学51单片机--C语言版(第3版)6-4:数码管显示消隐数码管残影产生原理产生背景:数码管位选切换过渡阶段造成的段选的瞬态显示。假设此刻最高位数码管显示0:case5:ADDR2=1;ADDR1=0;ADDR0=1;P0=0xC0;
ADDR2=0;ADDR1=0;ADDR0=1;P0=0xC0;case0:ADDR2=0;ADDR1=0;ADDR0=0;P0=0xF9;中间状态:ADDR2=0;ADDR1=0;ADDR0=1(case1)数码管消隐方法解决方法:切换之前关闭位选或者段选,切换后一次性打开。关闭段:switch语句执行前加:P0=0xFF;关闭位:switch语句执行前加:ENLED=1;在case语句中P0赋值完成后再打开显示ENLED=0。配套书籍:手把手教你学51单片机--C语言版(第3版)6-5:中断系统的学习中断的介绍比如说我正在厨房用煤气烧一壶水,这样就只能守在厨房里,苦苦等着水开——如果水溢出来浇灭了煤气,有可能就要发生一场灾难了。门外忽然又传来了铿锵有力的歌声,我最喜欢的电视剧要开演了,听着水壶发出“咕嘟咕嘟”的声音,我清楚:除非等到水开,否则没有我享受人生的时候。这个场景跟中断有什么关系呢?
在这个场景中,我是唯一具有处理能力的主体,不管是烧水、还是看电视,同一个时间点上我只能干一件事情。但是,在我专心致志干一件事情时,总有许多或紧迫或不紧迫的事情突然出现在面前,都需要去关注,有些还需要
我停下手头的工作马上去处理。只有在处理完之后,方能回头完成先前的任务。
中断机制不仅赋予了我处理意外情况的能力,如果我能充分发挥这个机制的妙用,就可以“同时”完成多个任务了。
事实上烧水需要10分钟完成,但是提下水壶和关煤气我只要几秒钟就可以完成。为了这几秒,我需要在厨房等候10分钟。如果使用闹钟定时10分钟,10分钟一到,闹钟就会提醒我该去关煤气了,那么我就可以去安心看电视了。
实际上就是用了闹钟这样一个中断信号来提示我完成提水壶和关煤气的任务。IE—中断使能寄存器的位分配(地址0xA8、可位寻址)位76543210符号EA--ET2ESET1EX1ET0EX0复位值0--000000IE—中断使能寄存器的位描述位符号描述7EA总中断使能位,相当于总开关6----5ET2定时器2中断使能4ES串口中断使能3ET1定时器1中断使能2EX1外部中断1使能1ET0定时器0中断使能0EX0外部中断0使能中断查询序列中断函数编号中断名称中断标志位中断使能位中断向量地址默认优先级0外部中断IE0EX00x00031(最高)1T0TF0ET00x000B22外部中断IE1EX10x001333T1TF1ET10x001B44UARTTI/RIES0x002355T2TF2/EXF2ET20x002B6配套书籍:手把手教你学51单片机--C语言版(第3版)6-6:中断优先级中断优先级抢占优先级和固有优先级IP—中断优先级寄存器的位分配(地址0xB8、可位寻址)位76543210符号----PT2PSPT1PX1PT0PX0复位值----000000
IP—中断优先级寄存器的位描述位符号描述7--保留6--保留5PT2定时器2中断优先级控制位4PS串口中断优先级控制位3PT1定时器1中断优先级控制位2PX1外部中断1中断优先级控制位1PT0定时器0中断优先级控制位0PX0外部中断0中断优先级控制位中断固有优先级中断函数编号中断名称中断标志位中断使能位中断向量地址默认优先级0外部中断IE0EX00x00031(最高)1T0TF0ET00x000B22外部中断IE1EX10x001333T1TF1ET10x001B44UARTTI/RIES0x002355T2TF2/EXF2ET20x002B6中断抢占优先级的说明当人为配置了抢占中断优先级
配置“水开”为高优先级,则当“水开”事件发生时,直接处理“水开”,在处理“水开”的过程中,即使“接电话”发生了,也不会去理会。当“接电话”发生了,正在接电话时,这个时候,“水开”事件又发生了,那么停下接电话,先去处理“水开”,处理好了后,再回头电话旁,处理“接电话”事件。
中断固有优先级的说明当设置为默认固有中断优先级时:假设“水开”默认优先级高于“接电话”优先级,当先听到“水开”则先处理“水开”这件事,当先听到“接电话”则先处理“接电话”这件事。只有当两件事同时发生时,则会先去处理“水开”,再处理“接电话”。
中断优先级的处理机制当设置为默认中断固有优先级时:当几个中断同时发生时,则先处理中断优先级高的中断程序,在处理任意中断期间发生中断,都不会响应。当配置了中断优先级,即抢占优先级同时发生中断,优先级高的先响应,在处理任意中断时,发生同级别或低级的中断,则不响应,发生优先级更高的中断时,则先处理高优先级中断,处理完毕,再回来处理当前中断。固有优先级的意义--仲裁由于某种特殊原因,暂时关闭了总中断EA,即EA=0;执行一段代码后重新使能了总中断,即EA=1;这段时间内很可能有多个中断发生了,因为刚刚总中断是关闭的,所以发生的多个中断都没有被响应,当总中断被打开后,同时请求响应,采用的就是固有优先级的先后顺序。配套书籍:手把手教你学51单片机--C语言版(第3版)7-1:变量的作用域和存储类别变量的作用域1、局部变量函数内部声明的变量,只在本函数内有效,在本函数以外是不能使用的,叫做局部变量。2、全局变量
在函数外部声明的变量就是全局变量。一个源程序文件可以包含一个或者多个函数,全局变量的作用范围是从它开始声明的位置一直到程序结束。全局变量的负作用1、降低函数的独立性,对任何一个函数的修改都可能影响到其他函数。2、降低函数的通用性,不利于函数的重复调用。3、降低程序的清晰度,每个函数执行都有可能改变全局变量值,无法清楚判断每个时刻的全局变量的值。4、全局变量永久占据内存单元。原则:能用局部变量就不用全局变量全局变量和局部变量同名,在局部变量作用域范围内,局部变量有效。变量的存储类别1、自动变量(auto)函数中的局部变量,如果不加static关键字修饰,都属于自动变量,也叫做动态变量。2、静态变量
所有的全局变量都属于静态变量,局部变量如果加了static关键字修饰的话,也是静态变量。配套书籍:手把手教你学51单片机--C语言版(第3版)7-2:认识LED点阵点阵LED实物图点阵LED原理Kingst51开发板点阵LED原理图配套书籍:手把手教你学51单片机--C语言版(第3版)7-3:点阵的图形显示点阵的图形显示(一)点阵的图形显示(二)点阵的图形显示(三)点阵的图形显示(四)点阵的图形显示(五)点阵的图形显示(六)点阵的图形显示(七)配套书籍:手把手教你学51单片机--C语言版(第3版)7-4:点阵的动画显示点阵的纵向动画显示配套书籍:手把手教你学51单片机--C语言版(第3版)7-5:点阵的横向动画显示关注各大直播平台:金沙滩电子课堂,直播授课答疑点阵的横向动画显示(一)二维数组数组类型数组名[数组长度1][数组长度2];例如unsignedchara[2][3];定义一个2行3列的无符号字符型二维数组
unsignedchara[2][3]={{1,2,3},{4,5,6}};unsignedchara[2][3]={1,2,3,4,5,6};unsignedchara[2][3]={{1,2},{3,4}};unsignedchara[2][3]={1,2,0,3,4,0};unsignedchara[2][3]={1,2,3,4};unsignedchara[2][3]={{1,2,3},{4,0,0}};点阵的横向动画显示(二)unsignedcharcodeimage[30][8]={{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//动画帧1{0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F},//动画帧2{0xFF,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F},//动画帧3{0xFF,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F},//动画帧4{0xFF,0x0F,0x9F,0x9F,0x9F,0x9F,0x9F,0x0F},//动画帧5{0xFF,0x87,0xCF,0xCF,0xCF,0xCF,0xCF,0x87},//动画帧6{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3},//动画帧7{0xFF,0xE1,0x73,0x73,0x73,0xF3,0xF3,0xE1},//动画帧8{0xFF,0x70,0x39,0x39,0x39,0x79,0xF9,0xF0},//动画帧9{0xFF,0x38,0x1C,0x1C,0x1C,0x3C,0x7C,0xF8},//动画帧10{0xFF,0x9C,0x0E,0x0E,0x0E,0x1E,0x3E,0x7C},//动画帧11{0xFF,0xCE,0x07,0x07,0x07,0x0F,0x1F,0x3E},//动画帧12{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F},//动画帧13{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF},//动画帧14{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},//动画帧15{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3},//动画帧16{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9},//动画帧17{0xFF,0x73,0x60,0x60,0x60,0x70,0x78,0xFC},//动画帧18{0xFF,0x39,0x30,0x30,0x30,0x38,0x3C,0x7E},//动画帧19{0xFF,0x9C,0x98,0x98,0x98,0x9C,0x1E,0x3F},//动画帧20{0xFF,0xCE,0xCC,0xCC,0xCC,0xCE,0x0F,0x1F},//动画帧21{0xFF,0x67,0x66,0x66,0x66,0x67,0x07,0x0F},//动画帧22{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87},//动画帧23{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3},//动画帧24{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},//动画帧25{0xFF,0xE6,0xE6,0xE6,0xE6,0xE6,0xE0,0xF0},//动画帧26{0xFF,0xF3,0xF3,0xF3,0xF3,0xF3,0xF0,0xF8},//动画帧27{0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF8,0xFC},//动画帧28{0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE},//动画帧29{0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF}//动画帧30};配套书籍:手把手教你学51单片机--C语言版(第3版)8-1:单片机最小系统详解单片机最小系统解析1、电源常用单片机的电源系统有5V系统和3.3V系统这两种。
常用的数字电路系统的类别有24V、12V、5V、3.3V、2.5V、1.8V、1.5V、1.2V等。单片机最小系统解析2、晶振
单片机最小系统解析3、复位
配套书籍:手把手教你学51单片机--C语言版(第3版)8-2:函数的调用函数的调用函数调用的一般形式:函数名(实参列表);函数调用注意事项:1、函数调用的时候不需要加函数类型。2、函数调用之前必须进行定义或者声明。3、函数声明的时候必须加函数类型、函数的形参,最后加上一个分号表示结束。函数的形式参数和实际参数实参:在调用一个有参数的函数时,函数名后边括号中的参数。形参:在被调用的函数进行定义时,括号内的参数叫做形式参数。1、函数定义中指定的形参,在未发生调用时不占用内存,函数调用时分配内存单元,调用结束释放内存。2、实参可以是常量,也可以是简单或者复杂的表达式,但是要求必须有确定的值,在调用时传递给形参。c=add(1,a+b);3、形参必须指定数据类型,和变量定义一样。4、形参和实参的数据类型应该相同或者赋值兼容。5、主调函数在调用函数之前,应对被调函数做原型声明。6、实参向形参的数据传递是单向传递,不能有形参再回传给实参。
unsignedcharadd(unsignedcharx,unsignedchary);
//函数声明
voidmain()
{
unsignedchara=1;
unsignedcharb=2;
unsignedcharc=0;
c=add(a,b);
//调用时,a和b就是实参,把函数的返回值赋给c
//执行完后,c的值就是3
while(1);
}
unsignedcharadd(unsignedcharx,unsignedchary)//函数定义
{
//这里括号中的x和y就是形参
unsignedcharz=0;
z=x+y;
returnz;
//返回值z的类型就是函数add的类型
}配套书籍:手把手教你学51单片机--C语言版(第3版)8-3:按键的基本原理独立按键原理矩阵按键原理矩阵按键变独立按键独立按键的扫描配套书籍:手把手教你学51单片机--C语言版(第3版)8-4:按键的扫描和抖动按键的检测方式过程监测VS状态扫描按键状态扫描和动作判断将每次的扫描按键保存来,当一次按键状态扫描进来后,与前一次的状态作比较,如果发现两次按键状态不一致,就说明按键产生动作。确定按下:上次弹起状态‘1’;当前按下状态‘0’。确定弹起:上次按下状态‘0’;当前弹起状态‘1’。按键抖动和简易消抖按键延时消抖步骤1、定义一个变量暂存按键值;2、当发现按键状态变化,延时10ms;3、再次确认按键是否真实发生改变;4、如果前次是0,即可判断按键弹起动作发生。配套书籍:手把手教你学51单片机--C语言版(第3版)8-5:实用按键消抖算法实用消抖算法12345678;23456789;3456789a;456789ab;56789abc;6789abcd;789abcde独立按键扫描消抖程序1、keybuff//存储按键连续8次扫描状态缓冲区2、KeySta//通过keybuf8次扫描后确定的按键状态3、backup//用于保存上一次按键状态,备份KeySta,
用于和KeySta比较判断当前是按下还是弹起配套书籍:手把手教你学51单片机--C语言版(第3版)8-6:矩阵按键扫描矩阵按键原理图独立按键扫描程序1、keybuff//存储按键连续8次扫描状态缓冲区2、KeySta//通过keybuf8次扫描后确定的按键状态3、backup//用于保存上一次按键状态,备份KeySta,
用于和KeySta比较判断当前是按下还是弹起矩阵按键扫描程序1、消抖时间:1*4*4=16ms2、keybuff[4][4]//存储按键连续4次扫描缓冲区3、KeySta[4][4]//通过keybuf4次扫描后确定的按键状态4、backup[4][4]//用于保存上一次按键状态,备份KeySta,
用于和KeySta比较判断当前是按下还是弹起配套书籍:手把手教你学51单片机--C语言版(第3版)8-7:简易加法计算器简易加法计算器1、程序逻辑:首先采用数字按键输入数字,同时在数码管上显示出来,然后采用‘↑’代替加号,按下加号后再输入一串数字并且显示出来,按下回车键计算加法结果,并同时显示到数码管。(能够实现连加)2、按键扫描部分和按键执行部分分离。3、采用按键映射的方式将程序的应用层和底层驱动进行分离,可实现应用层和底层相互独立,做出标准化接口。windows虚拟键码表矩阵按键映射表1、KeyCodeMap[4][4]//矩阵按键编号到标准键盘键码映射表2、ShowNumber()//将一个无符号长整形的数字显示到数码管3、KeyAction()//按键动作函数,根据键码执行相应动作4、KeyDriver()//按键驱动函数,检测按键动作,调度动作函数5、KeyScan()//按键扫描函数,间隔1ms放到定时器中断内6、LedScan()//数码管动态扫描刷新函数配套书籍:手把手教你学51单片机--C语言版(第3版)9-1:单片机IO口结构和上下拉电阻单片机IO口的结构上下拉电阻上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻起到一个限流的作用,下拉就是下拉到低电平。1、OC门要输出高电平,外部必须加上拉电阻。2、加大普通IO口的驱动能力。3、起到限流的作用。4、抵抗电磁干扰。
上下拉电阻的选取原则1、从降低功耗方面考虑应该足够大,因为电阻越大,电流越小。2、从确保足够的引脚驱动能力考虑应该足够小,电阻越小,电流才能越大。3、开漏输出时,过大的上拉电阻会导致信号上升沿变缓。
配套书籍:手把手教你学51单片机--C语言版(第3版)9-2:蜂鸣器的学习蜂鸣器按结构分类:压电式蜂鸣器(高频,报警器)和电磁式蜂鸣器(低频,提示器)按驱动方式:有源蜂鸣器和无源蜂鸣器配套书籍:手把手教你学51单片机--C语言版(第3版)9-3:继电器的学习继电器1、通常用于弱电(低电压、小电流)控制强电(高电压、大电流)2、其本质是一个电控机械开关,由两部分组成:(1)控制端(弱电)(2)被控端(强电)控制端:3.3V、5V、12V、24V。被控端:220V。板上继电器参数:5V,250V,10A。续流二极管的用法常开和常闭常开:继电器线圈在未通电的状态下,触点处于断开状态。应用于特定条件下启动某个电器设备的场景:声控灯、电动门禁。常闭:继电器线圈在未通电的状态下,触点处于闭合状态。应用于特定条件下断开连接的场合:燃气安全检测系统。配套书籍:手把手教你学51单片机--C语言版(第3版)9-4:编程实用技巧案例不同数据类型之间的相互转换unsignedchara;unsignedintb;unsignedlongc;c=a*b;a=100;b=700;c=
?44641、自动类型转换2、强制类型转换c=(unsignedlong)a*b;和c=(unsignedlong)(a*b)
3、不同类型变量的赋值b=a;a=b;b=?a=?700%256=1884、bit型强制类型转换bita=0;unsignedcharb;a=(bit)b;a=?
定时器定时时间调整
单片机进出中断都需要响应时间,并且需要进行压栈。
方法一:使用debug观察时间,进行补偿。
方法二:长时间运行累计误差进行调整字节操作修改位TMOD&=0xF0;TMOD|=0x01TMOD=0x01;
对于一个字节的任何一位来说,不管原来这一位是0还是1
它跟0进行与运算,结果就是0跟1进行与运算,保持原来的值
它跟1进行或运算,结果就是1跟0进行或运算,保持原来的值TMOD=TMOD&0xF0;
数码管扫描函数算法改进switch(i){case0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];break;case1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];break;case2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];break;case3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];break;case4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];break;case5:ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];break;default:break;}P1=(P1&0xF8)|i;P0=LedBuff[i];if(i<5)i++;elsei=0;配套书籍:手把手教你学51单片机--C语言版(第3版)9-5:实用秒表例程秒表程序1、程序涵盖定时器、数码管、中断、按键等多个知识点。2、补偿误差,足够精确。3、显示精准,保留小数点后两位有效数字,精确到10ms。4、真正的、实用的秒表程序,贴近实际开发,做大项目的基础。
重要函数分析1、voidConfigTimer0(unsignedintms)//配置并启动定时器02、voidStopwatchDisplay()//秒表计数显示函数3、voidStopwatchAction()//秒表启停函数4、voidStopwatchReset()//秒表复位函数5、voidStopwatchCount()//秒表计数函数,每隔10ms调用一次进行秒表计数累加6、voidKeyDriver()、voidKeyScan()、voidLedScan()配套书籍:手把手教你学51单片机--C语言版(第3版)9-6:PWM的初步认识PWM知识与实例PWM:PulseWidthModulation脉冲宽度调制,使用数字信号达到模拟信号的效果
占空比:高电平的时间整个周期的比例PWM调整小灯亮度原理1、占空比10%,小灯最亮;占空比40%,亮度次之;占空比90%,小灯最暗。
PWM调整小灯亮度程序1、voidConfigPWM(unsignedintfr,unsignedchardc)/*配置并启动PWM,fr-频率,dc-占空比*/2、voidClosePWM()/*关闭PWM*/3、定时器中断:PWM的高电平定时和低电平定时的切换配套书籍:手把手教你学51单片机--C语言版(第3版)9-7:PWM实现呼吸灯效果呼吸灯功能
让多个亮度等级连续起来,会产生一个小灯渐变的效果,与呼吸有点类似,习惯称之为呼吸灯。常用于灯光秀、KTV等舞台效果呼吸灯函数说明1、voidConfigTimer1(unsignedintms)/*配置并启动T1,ms-定时时间,用来定时动态调整占空比*/2、voidConfigPWM(unsignedintfr,unsignedchardc)/*用定时器T0配置并启动PWM,fr-频率,dc-占空比*/3、voidAdjustDutyCycle(unsignedchardc)/*占空比调整函数,频率不变只调整占空比*/4、T0中断用于产生PWM,T1中断用于调整占空比配套书籍:手把手教你学51单片机--C语言版(第3版)9-8:长短按键的应用长按键的执行逻辑长短按键检测:检测到一个按键动作,马上执行一次相应的动作,同时在程序中记录按键按下的持续时间。当按下的时间大于1秒后,每经过200ms执行一次按键动作。
模拟定时炸弹程序1、voidKeyDriver()/*按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用*/2、voidKeyAction(unsignedcharkeycode)/*按键动作函数,根据键码执行相应操作,keycode-按键键码*/
3、voidConfigTimer0(unsignedintms)voidShowNumber(unsignedlongnum)voidKeyScan()voidLedScan()voidInterruptTimer0()
配套书籍:手把手教你学51单片机--C语言版(第3版)10-1:(UART)串口通信的初步认识串行通信的初步认识1、并行通信:通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高:P0,P1,P2,P3。P0=0xFE,即并行总线数据输出。2、串行通信,一次只能发送一位,要发送8次才能发送一个字节。0b11111110一位一位输出,速度为波特率。
RS232接口和USB转串口三种基本通信类型单工通信:只允许一方向另外一方传送信息,另一方不能回传信息,比如电视遥控器、收音机广播等。半双工通信:数据可以在双方之间传播,同一时刻只能其中一方发给另外一方,比如对讲机就是典型半双工。全双工通信:发送数据的同时也能够接收数据,两者同步进行,比如我们的电话通信。
UART通信模块SCON——串行控制寄存器的位分配(地址0x98、可位寻址)位76543210符号SM0SM1SM2RENTB8RB8TIRI复位值00000000SCON——串行控制寄存器的位描述位符号描述7SM0这两位共同决定了串口通信的模式。我们最常用的就是模式16SM15SM2多机通信控制位(极少用),模式4REN使能串行接收。由软件置位使能接收,软件清零则禁止接收。3TB8模式22RB8模式21TI发送中断标志位,当发送电路发送到停止位的中间位置时,TI0RI接收中断标志位,当接收电路接收到停止位的中间位置时,RI波特率发生器
SBUF:两个名字相同,地址相同的缓冲器。
计算:TH1=TL1=256-晶振值/12/2/16/波特率
如果写:PCON|=0x80;那么计算公式为
TH1=TL1=256-晶振值/12/16/波特率
配套书籍:手把手教你学51单片机--C语言版(第3版)10-2:串口通信实例串口通信程序的基本步骤1、配置串口为模式1。2、配置定时器T1为模式2,即自动重装模式。
3、根据波特率计算TH1和TL1的初值,如果有需要可以使用PCON进行波特率加倍。4、打开定时器控制寄存器TR1,让定时器跑起来。
串口通信实例1、voidConfigUART(unsignedintbaud)/*串口配置函数,baud-通信波特率*/2、voidInterruptUART()}/*UART中断服务函数*/
3、voidConfigTimer0(unsignedintms)voidLedScan()voidInterruptTimer0()//用于数码管扫描
串口助手显示ASCII码表ASCII码(AmericanStandardCodeforInformationInterchange,即美国信息互换标准代码)
配套书籍:手把手教你学51单片机--C语言版(第3版)10-3:使用逻辑分析仪分析串口通信电子工程师常用工具1、万用表:测量电压、电流、电阻、电容、电感、线路导通等参数。2、逻辑分析仪:测量数字信号时序图,主要用于解析协议数据。3、示波器:测量电压信号随时间变化的波形。可以显示电压值,周期,频率,上升沿下降沿时间等。主要测量模拟量和信号质量等。
逻辑分析仪测量信号的原理Kingst品牌逻辑分析仪LA1010:100M最高采样率,16个通道,精度10nsLA2016:200M最高采样率,16个通道,精度5nsLA5016:500M最高采样率,16个通道,精度2nsLA5032:500M最高采样率,32个通道,精度2ns逻辑分析仪测量信号接线图逻辑分析仪的GND接待测板子的GND。逻辑分析仪的16个通道,任选通道接到待测信号引脚。逻辑分析仪抓取波形和数据分析配套书籍:手把手教你学51单片机--C语言版(第3版)10-4:指针的初步学习指针的应用优点:C语言的灵魂,是C语言的重要特征。利用指针可以直接快速的处理内存中的各种数据结构的数据,特别是数组、字符串和内存的动态分配。它为函数间各类数据的传递提供了简捷便利的方法。指针使C语言简洁、紧凑、高效。缺点:指针使用上的灵活性容易导致指针滥用而可能使程序失控。变量的地址unsignedchara=0x01;unsignedcharb=0x02;unsingedintc=0x0003;unsignedlongd=0x00000004;变量取地址:&a,&b,&c,&d内存地址存储的数据…………0x07d0x06d0x05d0x04d0x03c0x02c0x01b0x00a指针变量的声明和初始化普通变量a可以是1,可以是2,可以是n指针变量p可以是a的地址,可以是b的地址,可以是x的地址特别区分:1、在C语言中,一种说法是地址等同于指针,变量的地址就是变量的指针。2、指针变量简称指针,通常所说的指针都是指针变量。区分方法:&a一律称之为取地址。只要说指针,就是指指针变量。p=&a通常的说法是指针指向了a这个变量。*和&互为逆运算,x=*p;方法1:unsignedchara;unsignedchar*p=&a;方法2:unsignedchara;unsignedchar*p;p=&a;指针变量重要区分1、普通变量VS指针变量unsignedchara;a=1;......a=2;unsignedchar*p;p=&a;......p=&b;是说明p指向的变量是unsignedchar类型。
2、定义指针变量*pVS取值运算*punsignedchar*p;仅仅是说明p是个指针变量,*不具备任何其他的运算功能。unsignedchara=1;unsignedcharb=2;unsignedchar*p;p=&a;b=*p;计算完毕,b的值是1。
指针的简单实例配套书籍:手把手教你学51单片机--C语言版(第3版)11-1:指向数组元素的指针指向数组元素的指针unsignedcharnumber[10]={0,1,2,3,4,5,6,7,8,9};unsignedchar*p;unsignedchar*q;p=&number[0];q=&number[9];1、比较运算2、指针和整数之间的加减运算3、两个指针变量在一定条件下的减法运算特别注意:数组名字代表了数组元素的首地址。p=&number[0];等价于p=number;p[i]等价于*(p+i)二维数组:p=&number[0][0]number[1]等价于&number[1][0]指向数组元素指针实例sizeof()关键字:虽然写作函数形式,但是sizeof()整体在程序代码中相当于一个常量。sizeof(a);sizeof(d);sizeof(number);串口发送技巧:软件TI=1可以让程序直接进入中断,启动发送。逻辑分析仪抓取波形和数据分析配套书籍:手把手教你学51单片机--C语言版(第3版)11-2:字符数组和字符指针常量的类型整型常量:1、2、3、100浮点型常量:3.14、0.56、-4.8字符型常量:'a'、'b'、'1'字符串常量:"a"、"abc"、"1234"、"1234abcd"直接常量与符号常量constunsignedintBAUD=9600;unsignedcharcodeLedChar[]={......};#definePI
3.14字符常量和字符串常量普通字符:'a''A'unsignedcharx='a';转义字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省济宁市任城区2025-2026学年三年级上学期期末语文试题(文字版含答案)
- 2026年烟草基建内勤综合统筹专员烟草公司招聘考试笔试试题(含答案)
- 2026年烟草工会文体干事烟草公司招聘考试笔试试题(含答案)
- 常用财务分析指标标准值
- 2026 年多发伤急诊急救护理个案分享
- 2026年秋季开学第一课:劳动教育砺心志
- 小区绿化病虫害防治与夏季养护服务合同三篇
- 地坪施工质量保证协议
- 2026年陕西省安全员C2证题库(附答案)
- 2026年手术部位感染理论试题及答案
- 工艺纪律检查方案
- 江苏盐城东台市2026年专职网格员招聘考试试卷-含答案解析
- 2026年消化系统内镜报告规范解读手册
- 2026年CCAA国家注册审核员考试(有机产品认证基础)复习题及答案
- 汽车维修管理制度大全
- 2026年初级注册安全工程师《安全生产专业实务(其他安全)》真题试卷(附答案解析)
- 药剂师招聘笔试题试题集详解
- 胆南星临床应用现状
- 原材料采购价格监督制度
- 方言词汇调查条目表
- 疼痛管理与康复医学
评论
0/150
提交评论