单片机学习笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第一课开发板单片机内部资源的三大指标:1.FLASH(程序存储空间ROM)相当于电脑的硬盘,掉电不消失读写次数很多,大约为10万次,不用担心用坏了2.RAM(内存)内存理论上无限次擦写,读取速度快3.SFR(特殊功能寄存器)specialfunctionregister单片机的选择:STC89C52:8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源。P89V51RD+:64KFLASH、1024字节RAM、32个IO口、3个定时器、1个UART、8个中断源、1个SPI、PWM、并且支持与KEIL连机进行在线仿真。(单步调试)单片机最小系统三要素:电源电路、复位电路、晶振电路。特点:单片机可以运行程序,是单片机控制系统的核心。电源电路VCC为+GND为-电压为5V晶振电路是单片机的心脏,步调一次振动11.0592MHZ复位电路当掉电卡死时可以跳到第一行代码执行短路时保险丝自动断开不是玻璃管的保险丝,老师用的是自恢复保险丝,F1是保险丝,C16是电容,LED1是发光二极管,R34是电阻发光二极管(LED):通常红色贴片LED:电压1.6V~2.4V,电流2到20mA,在2到5mA亮度有所变化,5mA以上亮度基本无变化。电流2ma以下小灯不工作,电流20ma以上会烧坏LED两端电压为2V则求RES2的电阻范围(5-2)/r=2ma(5-2)/R=20ma150-1.5KLED和RES2两端电压一定,RES2的电阻越大,则支路中电流越小,故命名此电阻为限流电阻单片机(MCU),最小控制单元。首先,我们用单片机来控制一个灯的亮灭。P0.0是单片机的一个IO口,如果P0.0端输出5V,VCC也是5V,中间没有电流通过,故LED是灭的,如果P0.0端输出0V,则与GND端是一样的,这时LED亮下面通过软件来编程STC89C52:是国产芯片但我们使用的软件是国外开发的,我们在下面选择一款来代替这种P89V51RD+:以上两种单片机都是51的内核提示是否加入标准8051代码到我们的工程当中,这里点否,现在先不用理解,是个初始化的过程。要写程序必须先建立一个文件,写程序的地方新建以后马上保存,软件自动提示输入名称由于是*.*的文件,所以后缀要我们自己去打,有*.h*.c如果是汇编语言则是*.asm现在我们可以写代码了,但代码的这个文件还不属于这个工程,所以我们下一步右击把该文件加入工程当中。单片机C语言SFR声明:sfrP0=0x80;sfrTCON=0x88;一个字节是8位,一位控制一个I/O口,字节控制所有的I/O口单片机内部有SFR(特殊功能寄存器)这样的资源,这种模块都是写在单片机内部的,每个模块都占用一个地址,相当于一个房间,在编写程序的时候,如果要用到某个模块,就要在之前声明一下之所以选择STC89C52:这种单片机,是因为它的中文手册很强大32个IO口,每个P口都有8位P0放在什么位置单片机中有这么多的特殊功能寄存器,如果我们每次写程序都要加入他们的话,那就太麻烦了,实际上我们软件开发的时候#includereg51.h或者#includereg52.h把这些库文件加入进来,我们就不需要对这些寄存器声明了还有一些51核没有的,我们就需要单独声明了如下面这个SFRCMOD=OXD9;完整的程序框架#includereg51.hSFRCMOD=OXD9;//51核之外的东西要单独声明main(){}一个P0口有8位进行位声明sbitIT0=TCON^0;sbitLED=P0^0;其实有些位在reg51.h里面有部分声明加WHILE的意思是不允许我们的程序运行到不可知的区域,如果我编写了100行代码,那么程序只能在这100行运行单片机编程是硬件编程,是根据电路图来编程的里面有8个小灯上面有一个三极管,这里起到一个总开关的作用,如果这里三极管不打开的话,下面的灯都不可能亮#includereg52.hSbitLED=P0^0;sbitENLED=P1^4;SbitADDR0=P1^0;SbitADDR1=P1^1;SbitADDR2=P1^2;SbitADDR3=P1^3;main(){ENLED=0;ADDR0=0;ADDR1=1;ADDR2=1;ADDR3=1;While(1){LED=0;//小灯的亮灭控制0为低电压,小灯亮;1为高电压,小灯灭}}写完代码后编绎一下再次编绎不同的单片机厂商提供的他们的下载软件都不一样步骤一步骤二步骤三步骤四参数不用改步骤五单片机机是先点下载,然后再上电,单片机在上电的一瞬间会检测是否有程序在下载,如果有程序下载,它就会下载程序,如要没有程序下载,它就会运行自己原来的程序,因此我们点“下载”之后,就要看一下板子改为1是高电压,则小灯灭第二课电磁干扰1、冬天的时候,空气比较干燥的城市,朋友们经常对电脑,铁柜等等放电,这就是“静电放电(ESD)”干扰。2、使用电钻的时候听收音机,看电视有杂音,这就是“快速瞬间脉冲群(EFT)”的效果。3、电脑性能不好,热插拔优盘等外围设备会出现蓝屏重启电脑等现象,这就是热插拔“浪涌(Surge)的效果。去耦电容的使用钽电容有深色线的一侧为正极另一端为负极接GND,体积很小,可以做贴片电容,很贵图上标107的意思是10*10的7次方皮法等于100微发1法拉(F)=1000毫法(mF)=1000000微法(μF)1微法(μF)=1000纳法(nF)=1000000皮法(pF)。电解电容它个头很大,容值也可以做得很大,占空间小,特性比不上坦电容,但便宜陶瓷电容个头小,容值小,但是质量最好的电容所起的作用一是稳定电压(水缸的作用)二是电压突变的时候(蓄水池的作用)低频滤波电容指标:耐压值(2倍以上的耐压值是非常安全的情况,也可以1.5倍,这样电容不致于做得很大)、容值(完全根据电路设计来决定的,耗电量大,容值就要大,要提供的电流给后继,像电路板的耗电是很低的,所以用100μF)低频滤波电容,平常应用最多的是钽电容,电解电容,陶瓷电容,起到去除电源低频纹波,稳定电源的作用。高频滤波电容,电源附近,通常用104电容来进行去除高频干扰。104是10乘以10的4次方pF0.1μF应用的很多,所有器件都需要这个器件电容对于高频信号相当于短路,(通高频,阻低频,根据大量前辈们的经验和实验来选取去除高频干扰,如“静电放电(ESD)”干扰和“快速瞬间脉冲群(EFT)”)三极管是我们的日常应用电路中经常会用到的一个器件。分为PNP和NPN型。三极管常用功能:1、开关控制2、信号放大用在模拟电路中,不属于数字电路的内容3、电平转换此处的三极管起到一个总开关的作用硅管和锗管,只介绍硅管半导体三极管又称“晶体三极管”或“晶体管”。在半导体锗或硅的单晶上制备两个能相互影响的PN结,组成一个PNP(或NPN)结构。中间的N区(或P区)叫基区,两边的区域叫发射区和集电区,这三部分各有一条电极引线,分别叫基极B、发射极E和集电极C,是能起放大、振荡或开关等作用的半导体电子器件。电压导通(导通电路靠电压)对于PNPe极比b极的电压高0.7v,则就有电流通过对于NPNb极比e极的电压高0.7v,则就有电流通过电流控制(如何让它工作在饱和状态靠电流)三极管起放大作用的时,有一种倍数关系,起一个开关作用,就是处于饱和状态,放大作用先不讲数字电路就只有两种状态,一种是截止,一种是饱和先讲开拿左边的PNP三极管来说我们只要保证b极电流100倍大于e极和c极之间的电流电流的流向e极和b极是e极向b极流e极和c极的电流上下都有可能,这个是不一定的LED本身是2V,三极管的电压很小,可以忽略不计(5-2)/330=0.01A1条支路的电流为0.01A8条支路为0.08A要进入饱和状态,b基极的电流要为0.08A的1/100即0.0008A即0.0008为最小电流(保证b极电流100倍大于e极和c极之间的电流)只有LEDS6为低电频才能电流通过,否则没有电流通过(5-0.7)/r=0.0008r=5375欧这里r算的是最大的电阻故R47只需要小于5375欧即可,上面选取了1000欧=1K欧的电阻三极管的电平转换常用的电压标准1.8V3V5V12V24V等等,通常不同的电压标准是不能连接,可能烧坏气件如何进行不同电压的通信?最简单的办法就是使用三极管了如果IO口是5V,如果是高电频,电路就导通了,中间横线支路就输出的是低电频,IO口就输出高电频如果IO口是低电频,电路不导通,中间横线支路就输出高电频也就是说用一个5V的系统控制了一个12V的系统,用三极管做了一个电平转换,这是一个典型特例三八译码器:在上面中一共有5个输入,分别为G1G2CBAG2上划线是包含两个的,与右边的4线与5线合成一线是一个意思我们把4线5线看成一个引脚,ENLED和ADDR3合起来称为使能引脚,也就是控制三八译码器到底是工作还是不工作如果这两个引脚,任何一个引脚达不到要求的话,不管你的输入A0A1A2怎么输入,Y0-Y1输出的都是高电平(数据手册上要求G1输入高电平,G2输入低电平)如上面图中,如果使能端不满足条件,无论CBA怎么输入,Y0-Y7都是高电平,我们加了5个输出口,实际上控制了三八译码器,用3个IO口扩展成8个,输入3个表现出8种状态结合程序来看,ENLED=0(4、5线合起来)表示该口为低电平,ADDR3=1表示该口为高电平使能端口的条件得到满足,故可以三种输入控制8种输出,三八译码器就可以工作了如果这样写程序,更容易看出实质所在第一行为使能条件第二行为3种不同条件的输入可以查表看到结果C对应A2B对应A1A对应A0作业第4课硬件底层驱动,不是纯软件流水灯既然可以点亮灯,可以熄灭灯,那么就可以使其闪烁常用延时办法非精确延时1、for(i=0;i100;i++);2、i=100;while(i--);把时间给浪费掉精确延时办法1、利用库函数_nop_();(需要includeintrins.h)2、利用定时器进行定时(后边的课程进行介绍)变量类型下面为小灯闪烁的程序#includereg52.hTypedefunsignedcharuint8;//注意这里并不是只能存字符Typedefunsignedintuint16;sbitLED=P0^0;sbitENLED=P1^4;sbitADDR0=P1^0;sbitADDR1=P1^1;sbitADDR2=P1^2;sbitADDR3=P1^3;main(){Uint8i;ENLED=0;ADDR3=1;ADDR0=0;ADDR1=1;ADDR2=1;while(1){LED=0;For(i=0;i100;i++);LED=1;For(i=0;i100;i++);}}实际却没有达到效果,而是小灯一直亮着For(i=0;i100;i++);因为我们并不知道这段时间是多长时间,少于10ms,人的肉眼根本无法察觉出来灭,是个长亮的过程Keil软件的仿真方框里为晶振大小,这里我们用的是11.0592Mhz,点确定,之后可以在软件仿真Debug选项里用默认用软件仿真,点确定这就进入了一个仿真环境,左侧会出现寄存器里的值,右边会出现单步运行,我们复位一下,黄色箭头就没有了,左侧的sec表示,程序运行到某一个需要的时间,我们在17行的前面双击一下,就会出现红点叫作断点,也就是程序运行到此处就会停止,左边为复位键,右边为全速运行键,是我们最常用的键,一全速运行就会运行到第一个断点也就是一个FOR语句才用了0.3个msUint8i;For(i=0;i10000;i++);我们可以改一下i10000可是我们别忘记了i的取值范围,应该uint16I;才对现在是54ms了54-0.4即为一个for循环的延时长时间的延时For(j=0;j100;j++){For(j=0;j10000;j++);}我们规定LED是P0.0口我们可以直接写成(11111110)与上面两句是一个效果,由于头文件中有对P0口的定义P0=0XFE;是让第一

1 / 50
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功