MCS51单片机C语言程序设计基础课件.ppt

上传人(卖家):晟晟文业 文档编号:4301107 上传时间:2022-11-27 格式:PPT 页数:35 大小:428KB
下载 相关 举报
MCS51单片机C语言程序设计基础课件.ppt_第1页
第1页 / 共35页
MCS51单片机C语言程序设计基础课件.ppt_第2页
第2页 / 共35页
MCS51单片机C语言程序设计基础课件.ppt_第3页
第3页 / 共35页
MCS51单片机C语言程序设计基础课件.ppt_第4页
第4页 / 共35页
MCS51单片机C语言程序设计基础课件.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、第二章第二章 MCS51单片机单片机C语言程序设计语言程序设计C语言具有很强的表达能力,并具有语言具有很强的表达能力,并具有较高的可移植性,提供了种类丰富的运较高的可移植性,提供了种类丰富的运算符和数据类型,可以直接实现对系统算符和数据类型,可以直接实现对系统硬件的控制。硬件的控制。相对于汇编语言,使用相对于汇编语言,使用C语言进行系语言进行系统开发可以大大缩短开发周期,明显增统开发可以大大缩短开发周期,明显增强程序的可读性,便于改进和扩充。强程序的可读性,便于改进和扩充。本章就介绍使用本章就介绍使用C语言开发语言开发8051系系列单片机程序的方法。列单片机程序的方法。;双字节无符号数加法程序

2、(R3R4+R6R7)=(R3R4);入口 :R3,R4,R6,R7NADD :MOV A,R4 ADD A,R7 MOV R4,A MOV A,R3 ADDC A,R6 MOV R3,A RETunsigned int val_1,val_2;unsigned int val_add;val_add=val_1+val_2;本章主要内容本章主要内容 C51变量声明变量声明 C51的的IO口操作口操作 C51的中断响应方法的中断响应方法 C51的定时器操作的定时器操作 C51的串行口操作的串行口操作 C51的外部总线扩展操作的外部总线扩展操作2.1 C51语言变量声明语言变量声明但在但在C语言

3、编程中,对数据类型与变量的定义必须语言编程中,对数据类型与变量的定义必须要与单片机的存储结构相关联,否则编译器就不能正要与单片机的存储结构相关联,否则编译器就不能正确的映射。确的映射。所以用所以用C语言编写单片机应用程序是要根据单片机语言编写单片机应用程序是要根据单片机的结构及内部资源定义相应的的结构及内部资源定义相应的C语言中的数据类型和语言中的数据类型和变量。变量。用用C语言编写的应用程序必须经单片机的语言编写的应用程序必须经单片机的C语言编语言编译器,将源代码转换成单片机的可执行程序。译器,将源代码转换成单片机的可执行程序。支持支持MCS-51系列单片机的编译器有很多,比较著名也是系列单

4、片机的编译器有很多,比较著名也是实际应用最多的是实际应用最多的是KEIL/Franklin编译器。这也是这门编译器。这也是这门课使用的编译器。课使用的编译器。一、一、C51数据类型数据类型数据类型数据类型长度(长度(bit)长度长度(byte)值域值域bit110,1unsigned char810,255signed char81-128,127unsigned int1620,65535signed int162-32768,32767unsigned long3240,4294967295signed long324-2147483648,2147483647float 3241.176

5、E-383.40E+38(6位有效数位有效数字)字)double6481.176E-383.40E+38(10位有效位有效数字)数字)指针指针243065535(存储空间)(存储空间)表表2.1 C51支持的数据类型支持的数据类型二、二、C51数据类型修饰符数据类型修饰符存储类型存储类型与存储空间的对应关系与存储空间的对应关系data直接寻址直接寻址片内数据存储区,访问速度快(片内数据存储区,访问速度快(128字节),值字节),值域域 0127bdata可位寻址可位寻址片内数据存储区,允许位与字节混合访问(片内数据存储区,允许位与字节混合访问(16字节,值域字节,值域0127idata间接寻址

6、片内数据存储区,可访问片内全部间接寻址片内数据存储区,可访问片内全部RAM地址空地址空间(间(256字节,值域字节,值域0255pdata分页寻址片外数据存储区,分页寻址片外数据存储区,,由由MOVX Ri访问(访问(i=0,1),),值域值域 0255xdata片外数据存储区(片外数据存储区(64KB)由)由MOVX DPTR访问,值域访问,值域065535code程序存储器程序存储器64KB空间,由空间,由MOVC DPTR访问,值域访问,值域065535表表2.2 C51存储类型修饰符存储类型修饰符二、二、C51数据修饰符数据修饰符修饰符名称修饰符名称功能功能const指示被修饰的变量或

7、者指针是常量指示被修饰的变量或者指针是常量volatile指示被修饰的变量或者指针可由多种原因被修改,指示被修饰的变量或者指针可由多种原因被修改,禁止优化。常用于修饰多个函数公用的变量。禁止优化。常用于修饰多个函数公用的变量。表2.3 其他修饰符三、三、C51变量声明举例变量声明举例C51变量声明格式:变量声明格式:存储类型+类型说明+修饰符+标示符=初值autoregisterstaticexterncharunsigned charintunsigned intlongunsigned longfloatdoublebitsfrsfr16sbitdatabdataidatapdataxda

8、tacodeconstvolatilevalue=初值unsigned char xdata val;signed char data string;bit bdata val_bit;unsigned char xdata*pval;unsigned char code*pcode;code应用举例应用举例unsigned char code tab4=0 x00,0 x01,0 x02,0 x03;void main(void)unsigned char i,j=0;for(i=0;i4;i+)j=j+tabi;9:for(i=0;i4;i+)MOV R6,A 10:j=j+tabi;MO

9、V A,R6MOV DPTR,#tab(0 x001E)MOVC A,A+DPTRADD A,R7MOV R7,A 11:三、三、C51存储模式存储模式存储模式存储模式说明说明SMALL参数及局部变量放入可直接寻址的片内存储区参数及局部变量放入可直接寻址的片内存储区(最大(最大128个字节),默认存储类型是个字节),默认存储类型是data,访,访问方便。所有对象都嵌入片内问方便。所有对象都嵌入片内RAM中。中。COMPACT参数及局部变量放入分页片外存储区(最大参数及局部变量放入分页片外存储区(最大256个字节),默认存储类型是个字节),默认存储类型是pdata,通过寄存器,通过寄存器R0和和

10、R1间接寻址,栈空间位于间接寻址,栈空间位于8051系统内部数系统内部数据区。据区。LARGE参数及局部变量都放入片外数据存储器(最大参数及局部变量都放入片外数据存储器(最大64K),默认存储类型为),默认存储类型为xdata,使用,使用DPTR访问。访问。访问效率较低。访问效率较低。表2.4 存储模式说明四、四、C51特殊功能寄存器特殊功能寄存器(SFR)的的C51定义定义MCS-51单片机中除了单片机中除了PC和和4组工作寄存器外,其他的所有组工作寄存器外,其他的所有寄存器均为特殊功能寄存器(寄存器均为特殊功能寄存器(SFR),分散在片内),分散在片内RAM区区的高的高128字节中,地址范

11、围为字节中,地址范围为80H0FFH。为能直接访问为能直接访问SFR,Franklin C51提供了自动定义方法,与提供了自动定义方法,与标准标准C语言不兼容,只适用于语言不兼容,只适用于MSC-51单片机进行编程。一单片机进行编程。一般将特殊功能寄存器定义放在头文件中,一般为般将特殊功能寄存器定义放在头文件中,一般为reg51.h。特殊功能寄存器的定义语法为:特殊功能寄存器的定义语法为:sfr sfr_name=int constant例如:例如:sfr SCON=0 x98;/*串行口控制寄存器地址串行口控制寄存器地址98H*/SCON=0 x01;四、四、C51特殊功能寄存器特殊功能寄存

12、器(SFR)的的C51定义定义sbit定义位寻址单元定义位寻址单元第一种定义格式:第一种定义格式:sbit bit_name=sfr_nameint constant;sbit是定义语句的关键字是定义语句的关键字bit_name为位寻址符号名为位寻址符号名sfr_name为已经定义过的特殊功能寄存器名为已经定义过的特殊功能寄存器名int constant为欲寻址的特殊功能寄存器在为欲寻址的特殊功能寄存器在sfr_name中的位号中的位号sfr PSW=0 xD0;/*定义定义PSW寄存器地址为寄存器地址为D0H*/sbit OV=PSW2;/*定义定义OV位为位为PSW.2,地址为,地址为D2

13、H*/Sbit CY=PSW7;/*定义定义CY位为位为PSW.7,地址为,地址为D7H*/四、四、C51特殊功能寄存器特殊功能寄存器(SFR)的的C51定义定义第二种定义格式:第二种定义格式:sbit bit_name=constant_1constant_2;sbit是定义语句的关键字是定义语句的关键字bit_name为位寻址符号名为位寻址符号名constant_1为特殊功能寄存器的字节地址为特殊功能寄存器的字节地址constant_2为欲寻址位在特殊功能寄存器中的位号为欲寻址位在特殊功能寄存器中的位号sbit OV=0 xD02;/*定义定义OV位为位为PSW.2,地址为,地址为D2H*

14、/Sbit CY=0 xD07;/*定义定义CY位为位为PSW.7,地址为,地址为D7H*/sbit定义位寻址单元定义位寻址单元第三种定义格式:第三种定义格式:sbit bit_name=int_constant;sbit是定义语句的关键字是定义语句的关键字bit_name为位寻址符号名为位寻址符号名int_constant为绝对位地址为绝对位地址sbit OV=0 xD2;/*定义定义OV位为位为PSW.2,地址为,地址为D2H*/Sbit CY=0 xD7;/*定义定义CY位为位为PSW.7,地址为,地址为D7H*/sbit定义位寻址单元定义位寻址单元四、四、C51特殊功能寄存器特殊功能寄

15、存器(SFR)的的C51定义定义2.2 51单片机单片机IO口操作的口操作的C语言编语言编程方法程方法#include sbit DIPCK=P26;unsigned char DIP_state;void main()unsigned char temp;P0=0 xff;DIPCK=0;/*打开打开273*/temp=P0;/*读取读取DIP开关状态开关状态*/DIPCK=1;/*关闭关闭273*/2.2 51单片机单片机IO口操作的口操作的C语言编语言编程方法程方法 6:unsigned char temp;7:P0=0 xff;MOV P0(0 x80),#0 xFF 8:DIPCK=

16、0;CLR DIPCK(0 xA0.6)9:temp=P0;MOV 0 x09,P0(0 x80)10:DIPCK=1;SETB DIPCK(0 xA0.6)#include sbit DIPCK=P26;unsigned char DIP_state;void main()unsigned char temp;P0=0 xff;DIPCK=0;/*打开打开273*/temp=P0;/*读取读取DIP开关状态开关状态*/DIPCK=1;/*关闭关闭273*/2.2 51单片机单片机IO口操作的口操作的C语言编语言编程方法程方法读读IO口:口:value=P0;写写IO口:口:P0=value;

17、读读IO端脚:端脚:value_pin=P00;写写IO端脚:端脚:P00=value_pin;C51语言操作语言操作IO端口方法:端口方法:2.3 51单片机中断的单片机中断的C语言编程方语言编程方法法C51编译器支持在编译器支持在C源程序中直接开发中断程序。中断程源程序中直接开发中断程序。中断程序是通过按照编译器规定的语法格式定义的一个函数。序是通过按照编译器规定的语法格式定义的一个函数。C51中断服务程序的函数定义的语法格式如下:中断服务程序的函数定义的语法格式如下:void 函数名函数名()interrupt m using n /*函数体函数体*/中断服务函数没有返回值也没有参数中断

18、服务函数没有返回值也没有参数m为服务的中断源编号,与中断入口对应为服务的中断源编号,与中断入口对应n为中断服务程序选用的寄存器组编号为中断服务程序选用的寄存器组编号编号编号中断源中断源入口地址入口地址0外部中断外部中断00003H1定时器定时器/计数器计数器0000BH2外部中断外部中断10013H3定时器定时器/计数器计数器1001BH4串行口中断串行口中断0023H表2.5 51单片机中断源编号一、一、C51中断系统编程中断系统编程一、一、C51中断系统编程中断系统编程汇编语言中断服务程序的汇编语言中断服务程序的般格式如下:般格式如下:CLR EA ;关中断关中断PUSH PSW;保护现场

19、保护现场PUSH ASETB EA ;开中断开中断 ;服务程序;服务程序CLR EA ;关中断关中断POP A POP A ;恢复现场;恢复现场POP PSWPOP PSWSETB EA ;开中断开中断RETI ;中断返回中断返回 C语言中断服务程序的语言中断服务程序的一般格式如下:一般格式如下:void interrupt_server()interrupt m using n /*中断服务程序*/外部中断外部中断0的的C语言中断服务语言中断服务程序:程序:void int0_interrupt_server()interrupt 0 using 0 /*中断服务程序*/二、外部中断的服务程

20、序编写方法二、外部中断的服务程序编写方法#include sbit P1_1=P11;sbit P1_0=P10;void main()IT0=1;IT1=1;IE0=1;IE1=1;EA=1;while(1)void int0_server()interrupt 0 using 0 P1_1=0;P1_0=1;void int0_server()interrupt 2 using 1 P1_1=1;P1_0=0;2.4 51单片机定时器单片机定时器C语言编程语言编程一、定时器一、定时器查询方式查询方式程序编写方法程序编写方法编写定时器中断服务程序,使编写定时器中断服务程序,使P1.0引脚上输

21、出周期为引脚上输出周期为4ms,占空比为占空比为1:1的方波。晶振的方波。晶振12MHz。#include sbit p10=p10;void clock_initial()TR0=0;TF0=0;TH0=0 xF8;TL0=0 x30;TR0=1;void main()TMOD=0 x01;for(;)clock_initial();do while(!TF0);p10=!p10;二、定时器中断的服务程序编写方法二、定时器中断的服务程序编写方法#include void main()TMOD=0 x01;P10=0;TF0=0;TR0=0;/*关闭定时器关闭定时器0*/TH0=0 xF8;/

22、*装载级数初值装载级数初值*/TL0=0 x30;TR0=1;/*启动定时器启动定时器1*/ET0=1;/*允许定时器中断允许定时器中断*/EA=1;for(;)void clk_int(void)interrupt 1 using 0 TR0=0;/*关闭定时器关闭定时器0*/TH0=0 xF8;/*装载级数初值装载级数初值*/TL0=0 x30;TR0=1;/*启动定时器启动定时器1*/P10=!P10;编写定时器中断服务程序,使编写定时器中断服务程序,使P1.0引脚上输出周期为引脚上输出周期为4ms,占空比为占空比为1:1的方波。晶振的方波。晶振12MHz。2.5 51单片机串行口单片机

23、串行口C语言编程语言编程一、串行口一、串行口查询方式查询方式程序编写方法程序编写方法设串行口数据传送的波特率为设串行口数据传送的波特率为4800,晶振,晶振11.0592MHz。采用查询方式,接收到数据后,立即发送。采用查询方式,接收到数据后,立即发送。#include void init_serialcomm(void)SCON =0 x50;/8N1 TMOD|=0 x20;/定时器设置定时器设置 PCON|=0 x80;/SMOD=1;/Baud:4800 fosc=11.0592MHz TH1=0 xF4;IE|=0 x90;/使能外部中断使能外部中断 TR1=1;/timer 1 r

24、un void main()init_serialcomm();while(1)while(RI=0);a=SBUF;SBUF=a;while(TI=0);TI=0;四、串行口中断的服务程序编写方法四、串行口中断的服务程序编写方法设串行口数据传送的波特率为设串行口数据传送的波特率为4800,编写串口接收中断服,编写串口接收中断服务程序。串口接收到数据后,立即通过串口发送出去。务程序。串口接收到数据后,立即通过串口发送出去。#include void init_serialcomm(void)SCON =0 x50;/8N1 TMOD|=0 x20;/定时器设置定时器设置 PCON|=0 x80

25、;/SMOD=1;/Baud:4800 fosc=11.0592MHz TH1=0 xF4;IE|=0 x90;/使能外部中断使能外部中断 TR1=1;/timer 1 run void main(void)init_serialcomm();for(;)void serial_server()interrupt 4 using 3unsigned ch;RI=0;ch=SBUF;SBUF=ch;While(TI=0);TI=0;2.6 51单片机外部扩展的单片机外部扩展的C语言编语言编程方法程方法xdata片外数据存储区(片外数据存储区(64KB)由)由MOVX DPTR访问,值域访问,值域

26、065535char xdata com;com=0 x01;char xdata com;com=0 x01;MOV DPTR,#0 x0000MOV A,#0 x01MOVX DPTR,AC语言程序语言程序汇编程序汇编程序如何确定如何确定DPTR值?值?一、一、C51指针类型指针类型1、基于存储器的指针、基于存储器的指针指针所指向的地址在编译时确定。指针所指向的地址在编译时确定。char xdata com;com=0 x01;2、通用指针、通用指针三字节组成。三字节组成。第一个字节为:指针类型第一个字节为:指针类型第二和第三字节为:第二和第三字节为:16位地址高位地址高8位和低位和低8位

27、。位。通用指针的形式为:通用指针的形式为:#define XBYTE(char*)0 x20000L)指向指向xdata,偏移量为,偏移量为0的通用指针的通用指针指针类型:指针类型:1为为idata,2为为xdata,3为为pdata,4为为data,5为为code二、通用指针二、通用指针例:将常数例:将常数0 x41写入地址为写入地址为0 x8057的外部数据存储器的外部数据存储器#define XBYTE(char*)0 x20000L)XBYTE0 x8057=0 x41;10:XBYTE0 x8057=0 x41;MOV DPTR,#0 x8057MOV A,#0 x41MOVX DP

28、TR,A偏移量偏移量三、三、absacc.h#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)#define CWORD(unsigned int volatile code *)0)#define DWORD(unsigned int volatile data *)0)#def

29、ine PWORD(unsigned int volatile pdata*)0)#define XWORD(unsigned int volatile xdata*)0)#define XBYTE(char*)0 x20000L)XBYTE0 x8057=0 x41;#include#include void main(void)XBYTE0 x8057=0 x41;#include#include#define COM XBYTE0 x8057void main(void)COM=0 x41;2.5几类重要的库函数几类重要的库函数C51提供了丰富的库函数资源,包括大量的关提供了丰富的库函数

30、资源,包括大量的关于于I/O操作、内存分配、字符串操作、据类型转操作、内存分配、字符串操作、据类型转换、数学计算等函数库。它们是以执行代码的换、数学计算等函数库。它们是以执行代码的形式出现,供用户在连接定位时用。在用预处形式出现,供用户在连接定位时用。在用预处理器命令理器命令include包含相应的头文件后,就可包含相应的头文件后,就可以在程序中使用这些函数。以在程序中使用这些函数。一、硬件地址定义头文件一、硬件地址定义头文件reg5x.h定义了特殊功能寄存器的地址。定义了特殊功能寄存器的地址。在文件开头首先要包含该文件。在文件开头首先要包含该文件。/*BYTE Register */sfr

31、P0 =0 x80;sfr P1 =0 x90;sfr P2 =0 xA0;sfr P3 =0 xB0;sfr PSW =0 xD0;sfr ACC =0 xE0;sfr B =0 xF0;sfr SP =0 x81;sfr DPL =0 x82;这个库中提供的是一些用汇编语言编写的函数。用汇编语言编写非常直接简单且目代码很短,而用C51编写则代码很长。这些函数主要有:_crol_/_cror_ 无符号字符型变量左/右移位函数 _irol_/_iror_ 无符号整型变量左/右移位函数 _lrol_/_lror_ 无符号长整型变量左/右移位函数 _nop_ 空操作函数 _testbit_ 位测试

32、函数 一、内部函数库一、内部函数库intrins.h#inclucle void main()()unsigned int y;y0 x00ff;y_irol_(y,4););举例:举例:运行后,y0 x0ff0。一、内部函数库一、内部函数库intrins.h二、绝对地址访问函数二、绝对地址访问函数absacc.h用预处理器伪指令用预处理器伪指令define为各空间的绝对地址定义宏数组名如下:为各空间的绝对地址定义宏数组名如下:define CBYTE(unsigned char*)0 x500000L)/*code空间空间*/define DBYTE(unsigned char*)0 x40

33、0000L)/*data空间空间*/define PBYTE(unsigned char*)0 x300000L)/*pdata空间空间*/define XBYTE(unsigned char*)0 x200000L)/*xdata空间空间*/以上存取对象是以上存取对象是char类型字节。类型字节。DBYTE0 x10 表示表示data空间绝对地址空间绝对地址16处的字节对象,处的字节对象,XWORD0 xff表示表示xdata空间绝对地址空间绝对地址255处的字对象。处的字对象。define CWORD(unsigned int*)0 x500000L)/*code空间空间*/define

34、DWORD(unsigned int*)0 x400000L)/*data空间空间*/define PWORD(unsigned int*)0 x300000L)/*pdata空间空间*/define XWORD(unsigned int*)0 x200000L)/*xdata空间空间*/以上存取对象是以上存取对象是int类型字。类型字。三、其他函数库三、其他函数库math.h数学函数图数学函数图stdio.h标准标准IO库,主要是用来操作串口的。库,主要是用来操作串口的。string.h字符串操作函数字符串操作函数stdlib.h标准库函数。包括格式转换,基本数值运算等。标准库函数。包括格式

35、转换,基本数值运算等。setjmp.h全程跳转函数,允许程序从深层函数调用中直接返回。全程跳转函数,允许程序从深层函数调用中直接返回。习题与思考 请简述与汇编语言对比,采用请简述与汇编语言对比,采用C51进行单片机程序进行单片机程序设计的优点设计的优点 设晶振频率为设晶振频率为12MHz,利用定时器,利用定时器/计数器计数器0,采用,采用查询方式设计单片机程序,使单片机在查询方式设计单片机程序,使单片机在P1.0引脚上引脚上输出周期为输出周期为4ms,占空比为,占空比为1:1的方波。的方波。设单片机需要相应设单片机需要相应8个外部中断源。请设计相应的个外部中断源。请设计相应的电路原理图和程序框架。(提示:可使用电路原理图和程序框架。(提示:可使用74LS148优先编码器对优先编码器对8个中断进行编码,个中断进行编码,74LS148的的GS引脚引脚可作为中断请求输出。)可作为中断请求输出。)请设计串口接收中断服务程序。程序按照接收的命请设计串口接收中断服务程序。程序按照接收的命令发送数据。要求接收数字令发送数据。要求接收数字1,发送字符,发送字符a,接收其,接收其他数据不响应。设晶振速度为他数据不响应。设晶振速度为11.0592MHz,波特率,波特率为为4800.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(MCS51单片机C语言程序设计基础课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|