单片机编程结合实例培训.ppt
单片机编程结合实例培训,MCS-51单片机的基础知识C51的基础知识PIC单片机的基础知识单片机软件编程设计的基本流程 单片机软件编程内部约定 MCS-51单片机编程实例 PIC单片机编程实例,MCS-51单片机的基础知识-主要性能特点,8位CPU 片内程序存储器和片内数据存储器 32根I/O线 外部存储器寻址范围均为64K 可编程堆栈位置,堆栈深度可达128个字节2个16位定时器/计数器 利用2根I/O线的4种工作方式的全双工串行口 5个中断源,2个中断优先级 布尔处理机,MCS-51单片机的基础知识-引脚描述,P0:访问外部储存器时的分时多路转换的地址(低8位)和数据总线、双向I/O口。P1:双向I/O口。P2:访问外部储存器时的高8位地址总线、双向I/O口。P3:双向I/O口、用于专门功能。EA:程序存储器访问选择。接高电平访问内部和外部程序存储器,接低电平只访问外部存储器。ALE:用于锁存低位地址。,MCS-51单片机的基础知识-基本时序周期,振荡周期:指振荡源周期。时钟周期:为振荡周期的两倍。机器周期:为6个时钟周期。指令周期:指令的执行时间,为14个机器周期。若选用6M晶振,则振荡周期为1/6微秒,时钟周期为1/3微秒,机器周期为2微秒。指令周期为28微秒。,MCS-51单片机的基础知识-存储器配置,含有片内外统一的64KB程序存储器地址空间、片内256B数据存储器地址空间、片外64KB数据存储器地址空间。复位后的PC地址为0000H。各种中断服务子程序的入口地址为:0003H、000BH、0013H、001BH、0023H、002BH,MCS-51单片机的基础知识-8051的I/O口,P0P3均可以作为I/O口使用。由于负载能力,P0须外接上拉电阻才能作为I/O口。,MCS-51单片机的基础知识-定时/计数器,内部有两个16位可编程定时/计数器,最大定时/计数值为2的16次方1。它们的工作方式可通过修改定时器方式控制寄存器TMOD来实现。它们都可以使用中断。定时器控制寄存器TCON用来负责定时器的启动、停止以及中断管理。定时方式时,时钟由单片机内部提供。计数时,时钟脉冲由外部(P3.4、P3.5)输入。,MCS-51单片机的基础知识-TMOD寄存器,MCS-51单片机的基础知识-TCON寄存器,MCS-51单片机的基础知识-串行口,MCS-51单片机的基础知识-串行口,波特率的计算:使用定时器1,并且为模式2。SOMD位为波特率倍增位,在寄存器PCON里。,MCS-51单片机的基础知识-中断系统,8051的中断系统允许接收5个独立的中断源:两个外部中断、两个定时/计时器中断以及一个串行口中断。外部中断申请由外部中断引脚(外部中断0为P3.2,外部中断1为P3.3)输入,输入方式可以是电平触发(低电平有效),也可以是边沿触发(下降沿有效),由TCON寄存器的ITx决定。两个定时器中断请求是当定时器溢出(全1转为全0)时提出的。串行口中断请求是串行口发送或接收完一个数据时提出的。,MCS-51单片机的基础知识-IP寄存器,8051可以设置高或低两个中断优先级,由中断优先控制寄存器IP控制。,MCS-51单片机的基础知识-IE寄存器,各类中断的使能,是有寄存器IE控制的,MCS-51单片机的基础知识-指令系统,寻址方式有:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、变址寻址、相对寻址、位寻址。指令按功能可以分为:数据传送类、算术操作类、逻辑操作类、控制程序转移类、布尔变量操作类。,C51的基础知识 数据类型,C51的基础知识 特殊寄存器,C51的基础知识 存贮类型,C51的基础知识 存贮类型,C51的基础知识 存贮类型,C51的基础知识 存贮类型,C51的基础知识 存贮类型,C51的基础知识 存贮类型,C51的基础知识 存贮类型,C51的基础知识 存贮模式,C51的基础知识 再入函数,C51的基础知识 中断处理函数,C51的基础知识 其它定义变量的方法,/定义unsigned char数组ClosetTme4,存放在xdata存储区,起始地址为0 x7000unsigned char xdata ClosetTme4 _at_ 0 x7000;/定义unsigned char变量SECALARM,存放在xdata存储区,地址为0 x7004#define SECALARM XBYTE0 x7004/定义位变量bClosebit bClose;/定义位变量bPowerPin为P3.1引脚sbit bPowerPin=P31;,PIC单片机的基础知识-性能特点,高性能RISC CPU:只需学习30多条指令、中断能力、8级硬件堆栈。性能特性:低功耗上电复位(POR)、欠压检测(BOD)、带独立振荡器的看门狗定时器(WDT)、引脚电平变化可触发中断。外设特性:独立方向控制功能的I/O引脚、I/O口高拉/灌电流能力,可直接驱动LED、带8位可编程预分频器的8位定时/计数器TIMER0、16位带预分频器的16位定时/计数器,PIC单片机的基础知识-引脚描述,VDD、VSS:电源脚 OSC1、OSC2:晶振脚 MCLR:复位脚 RA、RC:I/O脚,PIC单片机的基础知识-基本时序周期,指令周期为振荡源周期的4倍。若选用4M晶振,则振荡周期为1/4微秒,指令周期为1微秒。,PIC单片机的基础知识-程序存储区,程序存储区通常有一个13 位的程序计数器(其中低8 位字节来自PCL 寄存器。高5 位字节(PC)来自PCLATH),最大可寻址8K的程序存储空间。不同型号的CPU,其能物理实现的寻址范围不一样。复位矢量地址为0000h,中断矢量地址为0004h。每4K为1页,在页之间跳转时,必须修改PCLATH寄存器的3、4位,以切换到正确的程序页。数据存储区 数据存储区分区为两个存储区,存储区包含有通用寄存器和特殊功能寄存器。特殊功能寄存器位于每个存储区的最初32个存储单元内。其它地址单元则为通用寄存器。通用寄存器全部采用静态 RAM实现,并且映射到不同的存储体中。所有其它未使用RAM 地址单元,对它们进行读操作将返回0。RP1 位(STATUS)和RP0 位(STATUS)是存储区选择位。RP1=0、RP0=0时,则选择存储区0;RP1=0、RP0=1时,则选择存储区1;RP1=1、RP0=0时,则选择存储区2;RP1=1、RP0=1时,则选择存储区3。,PIC单片机的基础知识-I/O口,独立方向控制 由TRISA、TRISB等寄存器控制方向,置位表示作为输入,清零表示作为输出。高拉/灌电流能力,可直接驱动LED,PIC单片机的基础知识-定时/计数器,一个8位定时/计数器TIMER0、一个16位定时/计数器TIMER1。它们均可以申请中断。,PIC单片机的基础知识-定时器0,可通过上述寄存器定时器0设置,例如设置时钟源、分频、定时器0中断使能等。,PIC单片机的基础知识-定时器1,可通过上述寄存器定时器1设置,例如设置时钟源、分频、定时器1中断使能等。,PIC单片机的基础知识-中断系统,通常有外部中断、定时器0中断、定时器1中断等等,它们共同使用一个中断入口。,单片机软件编程设计的基本流程,需求分析和问题定义:详细分析用户提出的需求,定义软件实现的功能。确定信息流程图,规划好数据和数据流。选择CPU及外围器件,并规划它们之间的物理接口关系。划分模块,确定模块功能、模块间关系以及接口数据。,单片机软件编程设计的基本流程,编写流程图。代码编写。代码调试。测试。程序发布。程序维护。,单片机软件编程内部约定,为了使用程序具有良好的编程风格,提高可读性,以达到提高软件质量的目的,就应该有编程内部约定。也可能有人觉得,各类的编程都有自己的约定,何必再多加限制呢?这就好比法律一样,国家已经有法律,各地方又何必制订一些地方性的法规呢?无非是想法律更好的服务于人民。我们的软件编程内部约定也一样,无非是想让我们编写出更高质量的程序。我们的可以采用一些简单的编程约定来提高程序质量。比如程序要采用统一的缩进、一条语句占用一行、函数的入口出口参数以及功能该怎样注释、不同数据类型的变量该如何命名等等。,单片机软件编程内部约定,一些有关于编程约定的例子:sbit bPowerPin=P10;bit bOpen;unsigned char ucLoopNum;unsigned int uiRecordNum;main()bPowerPin=1;ucLoopNum=0;,MCS-51单片机编程实例,假设我们的客户有这样的需求:需要一种火警探测器,能区分探测器正常、故障、火警,有声光提示。火警后需要人工复位才能恢复到正常。从这个需求中,我们可以得出软件的功能:监测1路火警输入,控制1路光指示,控制1路声音输出。火警后自锁,须人工复位后重新监测。接着,来考虑一些信息流程。输入信息有:火警、复位。输出信息有声、光。为了满足需求,我们对输出信息进行以下定义:正常时,指示灯以1:1秒的频率闪烁,声音关闭;火警时,指示灯常亮,声音打开。,MCS-51单片机编程实例,再接着,分析一下数据:数据可能会有火警数据、复位数据以及定时计数器。然后,我们可以划分程序的模块,确定模块间接口,画出流程图,编写代码。,MCS-51单片机编程实例,MCS-51单片机编程实例,/*文件名称及版本号*/文件名:FireDetect.c/版本号:V001/应用状态:Debug/版本记录:/V001:正式发布版本/作者:,MCS-51单片机编程实例,/*程序描述*/程序名:火警探测器主程序/功能:监测1路火警输入,控制1路光指示,控制1路声音输出。/火警后自锁,须人工复位后重新监测。/输入:/火警输入:高电平为正常,低电平为火警。/复位输入:低电平为正常,高电平为复位。/输出:/光指示:正常时1秒开,1秒关;火警时常亮/声音:正常时关闭,火警时打开。/晶振:6M/存储区分配:,MCS-51单片机编程实例,#pragma small#include#include/-I/O口声明-sbit bLedPin=P10;/指示灯控制sbit bSounderPin=P11;/声音控制sbit bFirePin=P12;/火警输入sbit bDogPin=P13;/看门狗控制sbit bResetPin=P14;/复位输入,MCS-51单片机编程实例,/-变量声明-unsigned char ucTimeTick;/时间计数器bit bAlarm;/火警标志位bit bT1S;/1秒标志位/-函数声明-void Init();/初始化函数void InitTimer();/初始化定时器函数bit FireDetect();/火警监测函数void ResetDetect();/复位监测函数,MCS-51单片机编程实例,/=初始化函数=void Init()bLedPin=0;bSounderPin=0;bFirePin=1;ucTimeTick=0;bAlarm=0;bT1S=0;InitTimer();,MCS-51单片机编程实例,/=初始化定时器函数=void InitTimer()ET0=1;TMOD=0 x21;/工作方式:定时、模式1、25毫秒TH0=0 xcf;TL0=0 x2b;TR0=1;,MCS-51单片机编程实例,/-定时器0中断服务程序-void Timer0InterruptService()interrupt 1 using 0TH0=0 xcf;TL0=0 x2b;TR0=1;ucTimeTick+;if(ucTimeTick%40=0)/1秒定时到 bT1S=bT1S;ucTimeTick=0;,MCS-51单片机编程实例,/-火警监测函数-/功能:监测火警输入/输入:火警输入引脚/输出:无/返回:0正常;1火警。bit FireDetect()if(bFirePin)return 0;return 1;,MCS-51单片机编程实例,/-复位监测函数-/功能:监测复位输入/输入:复位输入引脚/输出:bAlarm:0复位/返回:无void ResetDetect()if(bResetPin)bAlarm=0;,/-主函数-main()Init();dobDogPin=bDogPin;if(!bAlarm)/火警监测模块bAlarm=FireDetect();if(!bAlarm)/声光控制模块/正常bLedPin=bT1S;bSounderPin=0;else/火警发生bLedPin=1;bSounderPin=1;ResetDetect();/复位监测模块while(1);,PIC单片机编程实例,;/*文件名称及版本号*;/文件名:FireDetect.asm;/版本号:V001;/应用状态:Debug;/V001:正式调试版本;/作者:,PIC单片机编程实例,;/*程序描述*;/程序名:火警探测器主程序;/功能:监测1路火警输入,控制1路光指示,控制1路声音输出。;/火警后自锁,须人工复位后重新监测。;/输入:;/火警输入:高电平为正常,低电平为火警。;/复位输入:低电平为正常,高电平为复位。;/输出:;/光指示:正常时1秒开,1秒关;火警时常亮;/声音:正常时关闭,火警时打开。;/晶振:2M;/存储区分配:,PIC单片机编程实例,;/-选择单片机类型-list p=16f676#include p16f676.inc;/-Configuration Bits设置-_CONFIG _XT_OSC&_WDT_ON&_PWRTE_ON&_MCLRE_OFF&_BODEN&_CP_OFF&_CPD_OFF,PIC单片机编程实例,;/-I/O口声明-#define LedRegPORTC;#define bLedPin0;#define SounderRegPORTC;#define bSounderPin1;#define FireRegPORTC;#define bFirePin2;#define ResetRegPORTC;#define bResetPin3;,PIC单片机编程实例,;/-变量声明-ApiF1equ 20;/位定义使用bAlarmequ0;/火警标志bT1Sequ1;/1秒标志WTempequ21;/用于W寄存器的现场保护STempequ22;/用于S寄存器的现场保护,PIC单片机编程实例,org0000hgotoStart;/主程序入口org0004hInterruptService:;/中断程序入口movwfWTemp;/中断现场保护swapfSTATUS,W;bcfSTATUS,RP0;movwfSTemp;,PIC单片机编程实例,btfssPIR1,TMR1IF;gotoInterruptRestore;movlw0 xdb;movwfTMR1L;movlw0 x0b;movwfTMR1H;bcfPIR1,TMR1IF;movlw0 x02;xorwfApiF1,F;,PIC单片机编程实例,InterruptRestore:;swapfSTemp,W;movwfSTATUS;swapfWTemp,F;swapfWTemp,W;retfie;,PIC单片机编程实例,;/*;/初始化函数;/*Init:;bcfSTATUS,RP0;clrfPORTC;clrfPORTA;movlw0 x07;movwfCMCON;clrfADCON0;bsfSTATUS,RP0;movlw0 xcf;/预分频给看门狗,分频倍率为1:128;movwfOPTION_REG;,PIC单片机编程实例,movlw0 x0c;/RC2(火警检测)、RC3(复位监测)为输入,其余为输出movwfTRISC;movlw0 x00;movwfTRISA;clrfANSEL;clrfPIE1;clrfVRCON;clrfADCON1;bcfSTATUS,RP0;bcfApiF1,bAlarm;bcfApiF1,bT1S;callInitTimer1;return;,PIC单片机编程实例,;/=初始化定时器1函数=InitTimer1:;bcfSTATUS,RP0;movlw0 xdb;movwfTMR1L;movlw0 x0b;movwfTMR1H;bcfPIR1,TMR1IF;movlw0 x31;/内部时钟、8分频movwfT1CON;bsfINTCON,GIE;bsfINTCON,PEIE;bsfSTATUS,RP0;bsfPIE1,TMR1IE;bcfSTATUS,RP0;return;,PIC单片机编程实例,;/-火警监测函数-;/功能:监测火警输入;/输入:火警输入引脚;/输出:;/bAlarm:0正常;1火警。FireDetect:;bcfApiF1,bAlarm;btfssFireReg,bFirePin;return;bsfApiF1,bAlarm;return;,PIC单片机编程实例,;/-复位监测函数-;/功能:监测复位输入;/输入:复位输入引脚;/输出:;/bAlarm:0复位ResetDetect:btfscResetReg,bResetPin;return;bcfApiF1,bAlarm;return;,PIC单片机编程实例,;/-主程序-Start:;callInit;MainLoop:;/主循环clrwdt;btfssApiF1,bAlarm;callFireDetect;,PIC单片机编程实例,DoOutput:;btfscApiF1,bAlarm;gotoAlarmExist;bcfSounderReg,bSounderPin;btfssApiF1,bT1S;bcfLedReg,bLedPin;btfscApiF1,bT1S;bsfLedReg,bLedPin;gotoDoOutputEnd;AlarmExist:;bsfSounderReg,bSounderPin;bsfLedReg,bLedPin;DoOutputEnd:;,PIC单片机编程实例,callResetDetect;gotoMainLoop;org0 x03fe;goto$;end,