单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版文本样式,第二级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,单击此处编辑母版标题样式,*,第三章 单片机的 C语言程序设计及调试,第三章 单片机的 C语言程序设计及调试,C语言编程,特点:编写简单、直观易读、便于维护、通用性好、可移植性强、更符合人们的思考习惯,但同学们一定会有这样的疑问,我们学过了C语言,该如何用它操作单片机呢?,C语言编程特点:编写简单、直观易读、便于维护、通用性好、可移,不要着急,接下来,让我们一起学习,单片机的C语言程序设计与调试,。,限于篇幅,本章不介绍标准C语言的语句及语法规则,只介绍C语言在IAP15W4K58S4单片机程序设计中的,特殊性问题,,包括,C51编程语言,(简称C51),与ANSI C的区别,、,单片机C语言程序的设计,等内容。,不要着急,接下来,让我们一起学习单片机的C语言程序设计与调试,关系运算符,关系运算符用于,比较两个常数或者表达式的大小,。关系运算的结果,只能是0或1,。关系运算符的值为真时,结果值为1;关系运算符的值为假时,结果值为0。,=!=,特别注意,判断两个常数或者表达式相等时,使用“,=,”,不要使用单个的“,=,”。否则,,判断两个数是否相等,就变成了,赋值语句,。,关系运算符关系运算符用于比较两个常数或者表达式的大小。关系运,逻辑运算符,逻辑运算符包括,与(,&)、或(|)、非(!),三种,用于对包含关系运算符的表达式进行合并或取非。,使用逻辑运算符的表达式,,返回,0表示“假”,返回1表示“真”,。,逻辑运算符逻辑运算符包括与(&)、或(|)、非(!)三种,位运算符,按位与(&)、按位或(|)、按位异或()、取反()、左移(),应用:,按位与,运算通常用来对某些,位清0,按位或,运算通常用来对某些,位置1,按位异或,运算通常用来对某些,位取反,位运算符按位与(&)、按位或(|)、按位异或()、取反(,预处理-宏定义(define),在语言源程序中允许用一个标识符来表示一个字符串,称为宏。,无参,宏定义的一般形式如下:,#define 标识符 字符串,带参,宏定义的一般形式如下:,#define 宏名(形参表)字符串,如要终止宏定义,可使用,#undef命令。,预处理-宏定义(define)在语言源程序中允许用一个标识,预处理-文件包含(include),文件包含的一般形式如下:,#include 文件名,你知道吗?,包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。,两者有何不同呢?,#include math.h,#include,预处理-文件包含(include)文件包含的一般形式如下:,预处理-条件编译(1),条件编译就是,按不同的条件去编译不同的程序部分,,从而产生不同的目标代码文件。,1)第一种形式,#ifdef 标识符,程序段1,#else,程序段2,#endif,预处理-条件编译(1)条件编译就是按不同的条件去编译不同的程,预处理-条件编译(2),2)第二种形式,#ifndef 标识符,程序段1,#else,程序段2,#endif,预处理-条件编译(2)2)第二种形式,预处理-条件编译(3),3)第二种形式,#if 常量表达式,程序段1,#else,程序段2,#endif,预处理-条件编译(3)3)第二种形式,Keil C51扩展关键字,C51有以下19个扩展关键字:,_at_、,sbit,、,sfr、,bit,、,sfr16、idata、bdata、,xdata,、,pdata、data、,code,、,alien、small、compact、large、using、reentrant、,interrupt,、,_task_,Keil C51扩展关键字C51有以下19个扩展关键字:,常见的关键字-内存区域的指定,1)程序存储器,code:,程序存储区。可以使用,code定义表格常数,2)内部RAM,data:,直接寻址区,内部,RAM的低128字节,地址范围为00H7FH,idata:,间接寻址区,包括整个内部,RAM区256字节,地址范围为00H0FFH,bdata:,可位寻址区,地址范围为,20H2FH,常见的关键字-内存区域的指定1)程序存储器,常见的关键字-内存区域的指定,3)外部数据存储器,xdata:,可指定多达64KB的外部直接寻址区,地址范围0000H0FFFFH,4)特殊功能寄存器(SFR),sfr:,字节寻址,sfr sfr_name=int_constant;,sfr16:,字寻址,sfr16 DPTR=0 x82;,sbit,:位寻址,sbit bitname=sfr_namebit_number;,常见的关键字-内存区域的指定3)外部数据存储器,常见的关键字-变量或数据类型,C51提供以下几种扩展数据类型:,bit:,位变量,值为0或1,sbit:,从字节中定义的位变量(0或1),sfr:,sfr字节地址(0 x800 xff),sfr16:,sfr字地址(0 x800 xff,其实是占用两个连续的地址),其余的数据类型如,char、enum、short、int、long、float,等与ANSI C相同,常见的关键字-变量或数据类型C51提供以下几种扩展数据类型:,常见的关键字-Keil C51指针,Keil C51支持一般指针(Generic Pointer)和存储器指针(Memory Specific Pointer)。一般指针的声明和使用均与标准C相同,同时还可以说明指针的存储类型。,例如:,unsigned char xdata*pt;,/pt本身依存储模式存放,unsigned char xdata*data pt;,/pt被保存在内部RAM中,unsigned char xdata*xdata pt;,/pt被保存在外部RAM中,常见的关键字-Keil C51指针Keil C51支持一般指,常见的关键字-Keil C51指针,除了和标准C语言一样使用指针外,指针还可以用来访问外部并行扩展的器件。,例如:,为了方便地访问外部存储器及I/O端口,在C51中的absacc.h头文件做了如下定义,利用这些定义可以方便地访问外部I/O端口。,#define CBYTE(unsigned char volatile code *)0),#define DBYTE(unsigned char volatile data *)0),#define PBYTE(unsigned char volatile pdata*)0),#define XBYTE(unsigned char volatile xdata*)0),常见的关键字-Keil C51指针除了和标准C语言一样使用指,Keil C51函数-中断函数声明,中断函数通过使用,interrupt,关键字和,中断号,(031)来声明。,中断号告诉编译器中断服务程序的,入口地址,。IAP15W4K58S4单片机的中断号及中断服务程序入口地址见教材58页表3-3。,中断函数具体是哪个中断的函数,,与中断号有关,而与函数名无关,。,Keil C51函数-中断函数声明中断函数通过使用inter,Keil C51函数-中断函数声明,例如:,串行口1的中断函数可以声明如下,void UART1_ISR(void)interrupt 4 using 1,/*中断服务程序的代码*/,Keil C51函数-中断函数声明例如:串行口1的中断函数可,【例3-1】,编程实现通过延时函数,由P2.0输出方波信号,并通过示波器观察程序输出波形的周期。,#include,“,stc15.h,”,sbit P20=P20;,/定义P2.0引脚,void delay(unsigned long cnt);,/延时函数声明,void main(void),P2M1=0;,P2M0=0;,/将整个P2口所有口线设置为准双向口模式,P20=1;,【例3-1】编程实现通过延时函数,由P2.0输出方波信号,【例3-1】,while(1),/主程序循环,delay(60000);,P20=P20;,void delay(unsigned long cnt),/延时函数,while(cnt0)cnt-;,【例3-1】,IAP15W4K58S4单片机C语言程序调试,编写好程序代码并编译成功,(没有错误和警告)后,可以使用集成开发环境(,IDE)对单片机程序进行,调试,。,调试的方法分为两种,一种是使用开发环境本身提供的,软件模拟仿真器,调试;另一种是使用,仿真器仿真,调试。,IAP15W4K58S4单片机C语言程序调试编写好程序代码,