您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > MCS51单片机C语言程序设计基础
第二章MCS51单片机C语言程序设计C语言具有很强的表达能力,并具有较高的可移植性,提供了种类丰富的运算符和数据类型,可以直接实现对系统硬件的控制。相对于汇编语言,使用C语言进行系统开发可以大大缩短开发周期,明显增强程序的可读性,便于改进和扩充。本章就介绍使用C语言开发8051系列单片机程序的方法。;双字节无符号数加法程序(R3R4+R6R7)=(R3R4);入口:R3,R4,R6,R7NADD:MOVA,R4ADDA,R7MOVR4,AMOVA,R3ADDCA,R6MOVR3,ARETunsignedintval_1,val_2;unsignedintval_add;val_add=val_1+val_2;本章主要内容•C51变量声明•C51的IO口操作•C51的中断响应方法•C51的定时器操作•C51的串行口操作•C51的外部总线扩展操作2.1C51语言变量声明但在C语言编程中,对数据类型与变量的定义必须要与单片机的存储结构相关联,否则编译器就不能正确的映射。所以用C语言编写单片机应用程序是要根据单片机的结构及内部资源定义相应的C语言中的数据类型和变量。用C语言编写的应用程序必须经单片机的C语言编译器,将源代码转换成单片机的可执行程序。支持MCS-51系列单片机的编译器有很多,比较著名也是实际应用最多的是KEIL/Franklin编译器。这也是这门课使用的编译器。一、C51数据类型数据类型长度(bit)长度(byte)值域bit110,1unsignedchar81[0,255]signedchar81[-128,127]unsignedint162[0,65535]signedint162[-32768,32767]unsignedlong324[0,4294967295]signedlong324[-2147483648,2147483647]float324±1.176E-38~±3.40E+38(6位有效数字)double648±1.176E-38~±3.40E+38(10位有效数字)指针2430~65535(存储空间)表2.1C51支持的数据类型二、C51数据类型修饰符存储类型与存储空间的对应关系data直接寻址片内数据存储区,访问速度快(128字节),值域0~127bdata可位寻址片内数据存储区,允许位与字节混合访问(16字节,值域0~127idata间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节,值域0~255pdata分页寻址片外数据存储区,,由MOVX@Ri访问(i=0,1),值域0~255xdata片外数据存储区(64KB)由MOVX@DPTR访问,值域0~65535code程序存储器64KB空间,由MOVC@DPTR访问,值域0~65535表2.2C51存储类型修饰符二、C51数据修饰符修饰符名称功能const指示被修饰的变量或者指针是常量volatile指示被修饰的变量或者指针可由多种原因被修改,禁止优化。常用于修饰多个函数公用的变量。表2.3其他修饰符三、C51变量声明举例C51变量声明格式:[存储类型]+[类型说明]+[修饰符]+[标示符]=[初值]autoregisterstaticexterncharunsignedcharintunsignedintlongunsignedlongfloatdoublebitsfrsfr16sbitdatabdataidatapdataxdatacodeconstvolatilevalue=初值unsignedcharxdataval;signedchardatastring;bitbdataval_bit;unsignedcharxdata*pval;unsignedcharcode*pcode;code应用举例unsignedcharcodetab[4]={0x00,0x01,0x02,0x03};voidmain(void){unsignedchari,j=0;for(i=0;i4;i++){j=j+tab[i];}}9:for(i=0;i4;i++){MOVR6,A10:j=j+tab[i];MOVA,R6MOVDPTR,#tab(0x001E)MOVCA,@A+DPTRADDA,R7MOVR7,A11:}三、C51存储模式存储模式说明SMALL参数及局部变量放入可直接寻址的片内存储区(最大128个字节),默认存储类型是data,访问方便。所有对象都嵌入片内RAM中。COMPACT参数及局部变量放入分页片外存储区(最大256个字节),默认存储类型是pdata,通过寄存器R0和R1间接寻址,栈空间位于8051系统内部数据区。LARGE参数及局部变量都放入片外数据存储器(最大64K),默认存储类型为xdata,使用DPTR访问。访问效率较低。表2.4存储模式说明四、C51特殊功能寄存器(SFR)的C51定义MCS-51单片机中除了PC和4组工作寄存器外,其他的所有寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH。为能直接访问SFR,FranklinC51提供了自动定义方法,与标准C语言不兼容,只适用于MSC-51单片机进行编程。一般将特殊功能寄存器定义放在头文件中,一般为reg51.h。特殊功能寄存器的定义语法为:sfrsfr_name=intconstant例如:sfrSCON=0x98;/*串行口控制寄存器地址98H*/SCON=0x01;四、C51特殊功能寄存器(SFR)的C51定义sbit定义位寻址单元第一种定义格式:sbitbit_name=sfr_name^intconstant;sbit是定义语句的关键字bit_name为位寻址符号名sfr_name为已经定义过的特殊功能寄存器名intconstant为欲寻址的特殊功能寄存器在sfr_name中的位号sfrPSW=0xD0;/*定义PSW寄存器地址为D0H*/sbitOV=PSW^2;/*定义OV位为PSW.2,地址为D2H*/SbitCY=PSW^7;/*定义CY位为PSW.7,地址为D7H*/四、C51特殊功能寄存器(SFR)的C51定义第二种定义格式:sbitbit_name=constant_1^constant_2;sbit是定义语句的关键字bit_name为位寻址符号名constant_1为特殊功能寄存器的字节地址constant_2为欲寻址位在特殊功能寄存器中的位号sbitOV=0xD0^2;/*定义OV位为PSW.2,地址为D2H*/SbitCY=0xD0^7;/*定义CY位为PSW.7,地址为D7H*/sbit定义位寻址单元第三种定义格式:sbitbit_name=int_constant;sbit是定义语句的关键字bit_name为位寻址符号名int_constant为绝对位地址sbitOV=0xD2;/*定义OV位为PSW.2,地址为D2H*/SbitCY=0xD7;/*定义CY位为PSW.7,地址为D7H*/sbit定义位寻址单元四、C51特殊功能寄存器(SFR)的C51定义2.251单片机IO口操作的C语言编程方法#includereg51.hsbitDIPCK=P2^6;unsignedcharDIP_state;voidmain(){unsignedchartemp;P0=0xff;DIPCK=0;/*打开273*/temp=P0;/*读取DIP开关状态*/DIPCK=1;/*关闭273*/}C50.1uY111.0592MC122PC222PS1RST+C310uVCCR110kVCCC40.1uVCCP1.0(T2)1P1.1(T2EX)2P1.23P1.34P1.45P1.56P1.67P1.78P3.3(INT1)13P3.2(INT0)12P3.4(T0)14P3.5(T1)15EA/VPP31XTAL018XTAL119RESET9P3.6(WR)16P3.7(RD)17PSEN29ALE(PROG)30(RXD)P3.010(TXD)P3.111VCC40VSS20P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.73289C52U189C52VCC/RDD0D1D2D3D4D5D6D7MR1CLK11Q512D513Q12Q25Q36Q49GND10D614Q615Q716D717D818Q819VCC20D13D24D37D48U374LS273D[0..7]/WRVCCD0D1D2D3D4D5D6D7VCC12345678161514131211109S1SW-DIP8Q1Q2Q3Q4Q5Q6Q7Q8Q1Q2Q3Q4Q5Q6Q7Q8CLK2CLK212345678161514131211109RP210KVCC2.251单片机IO口操作的C语言编程方法6:unsignedchartemp;7:P0=0xff;MOVP0(0x80),#0xFF8:DIPCK=0;CLRDIPCK(0xA0.6)9:temp=P0;MOV0x09,P0(0x80)10:DIPCK=1;SETBDIPCK(0xA0.6)#includereg51.hsbitDIPCK=P2^6;unsignedcharDIP_state;voidmain(){unsignedchartemp;P0=0xff;DIPCK=0;/*打开273*/temp=P0;/*读取DIP开关状态*/DIPCK=1;/*关闭273*/}2.251单片机IO口操作的C语言编程方法读IO口:value=P0;写IO口:P0=value;读IO端脚:value_pin=P0^0;写IO端脚:P0^0=value_pin;C51语言操作IO端口方法:2.351单片机中断的C语言编程方法C51编译器支持在C源程序中直接开发中断程序。中断程序是通过按照编译器规定的语法格式定义的一个函数。C51中断服务程序的函数定义的语法格式如下:void函数名()interruptm[usingn]{/*函数体*/}中断服务函数没有返回值也没有参数m为服务的中断源编号,与中断入口对应n为中断服务程序选用的寄存器组编号编号中断源入口地址0外部中断00003H1定时器/计数器0000BH2外部中断10013H3定时器/计数器1001BH4串行口中断0023H表2.551单片机中断源编号一、C51中断系统编程一、C51中断系统编程汇编语言中断服务程序的—般格式如下:CLREA;关中断PUSHPSW;保护现场PUSHA…SETBEA;开中断…;服务程序CLREA;关中断POPA;恢复现场POPPSW…SETBEA;开中断RETI;中断返回C语言中断服务程序的一般格式如下:voidinterrupt_server()interruptmusingn{/*中断服务程序*/}外部中断0的C语言中断服务程序:voidint0_interrupt_server()interrupt0using0{/*中断服务程序*/}二、外部中断的服务程序编写方法80515VP1.0P1.1P3.2P3.3驱动驱动灯1灯2选手1选手2#includereg51.hsbitP1_1=P1^1;sbitP1_0=P1^0;voidmain(){IT0=1;IT1=1;IE0=1;IE1=1;EA=1;while(1){}}voidint0_server()interrupt0using0{P1_1=0;P1_0=1;}voidint0_server()interrupt2using1{P1_1=1;P1_0=0;}2.451单片机定时器C语言编程一、定时器查询方式程序编写方法编写定时器中断服务程序,使P1.0引脚上输出周期为4ms,占空比为1:1的方波。晶振12MHz。#includereg52.hsbitp10=p1^
本文标题:MCS51单片机C语言程序设计基础
链接地址:https://www.777doc.com/doc-4021708 .html