MCS51单片机C语言程序设计基础_第1页
MCS51单片机C语言程序设计基础_第2页
MCS51单片机C语言程序设计基础_第3页
MCS51单片机C语言程序设计基础_第4页
MCS51单片机C语言程序设计基础_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章MCS51单片机C语言程序设计

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

;入口

:R3,R4,R6,R7

NADD

:MOV

A,R4

ADD

A,R7

MOV

R4,A

MOV

A,R3

ADDC

A,R6

MOV

R3,A

RETunsignedintval_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;i<4;i++){j=j+tab[i];}}9:for(i=0;i<4;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语言编程方法#include<reg51.h>sbitDIPCK=P2^6;unsignedcharDIP_state;voidmain(){unsignedchartemp;

P0=0xff;

DIPCK=0;/*打开273*/

temp=P0;/*读取DIP开关状态*/DIPCK=1;/*关闭273*/}2.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)#include<reg51.h>sbitDIPCK=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{/*中断服务程序*/}二、外部中断的服务程序编写方法#include<reg51.h>sbitP1_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。#include<reg52.h>sbitp10=p1^0;voidclock_initial(){ TR0=0; TF0=0; TH0=0xF8; TL0=0x30; TR0=1;}voidmain(){ TMOD=0x01; for(;;) { clock_initial(); do{} while(!TF0); p10=!p10; }}二、定时器中断的服务程序编写方法#include<reg52.h>voidmain(){TMOD=0x01;P1^0=0;TF0=0;TR0=0;/*关闭定时器0*/TH0=0xF8;/*装载级数初值*/TL0=0x30;TR0=1;/*启动定时器1*/ET0=1;/*允许定时器中断*/EA=1;for(;;){}}

voidclk_int(void)interrupt1using0{TR0=0;/*关闭定时器0*/TH0=0xF8;/*装载级数初值*/TL0=0x30;TR0=1;/*启动定时器1*/P10=!P10;}编写定时器中断服务程序,使P1.0引脚上输出周期为4ms,占空比为1:1的方波。晶振12MHz。2.551单片机串行口C语言编程一、串行口查询方式程序编写方法设串行口数据传送的波特率为4800,晶振11.0592MHz。采用查询方式,接收到数据后,立即发送。#include<reg51.h>voidinit_serialcomm(void){SCON=0x50;//8N1TMOD|=0x20;//定时器设置PCON|=0x80;//SMOD=1;//Baud:4800fosc=11.0592MHzTH1=0xF4;IE|=0x90;//使能外部中断

TR1=1;//timer1run}voidmain(){ init_serialcomm(); while(1) { while(RI==0); a=SBUF; SBUF=a; while(TI==0); TI=0; }}四、串行口中断的服务程序编写方法设串行口数据传送的波特率为4800,编写串口接收中断服务程序。串口接收到数据后,立即通过串口发送出去。#include<reg51.h>voidinit_serialcomm(void){SCON=0x50;//8N1TMOD|=0x20;//定时器设置PCON|=0x80;//SMOD=1;//Baud:4800fosc=11.0592MHzTH1=0xF4;IE|=0x90;//使能外部中断

TR1=1;//timer1run}voidmain(void){init_serialcomm();for(;;){}}voidserial_server()interrupt4using3{unsignedch;RI=0;ch=SBUF;SBUF=ch;While(TI==0);TI=0;}2.651单片机外部扩展的C语言编程方法xdata片外数据存储区(64KB)由MOVX@DPTR访问,值域0~65535charxdatacom;com=0x01;charxdatacom;com=0x01;MOVDPTR,#0x0000MOVA,#0x01MOVX@DPTR,AC语言程序汇编程序如何确定DPTR值?一、C51指针类型1、基于存储器的指针指针所指向的地址在编译时确定。charxdatacom;com=0x01;2、通用指针三字节组成。第一个字节为:指针类型第二和第三字节为:16位地址高8位和低8位。通用指针的形式为:#defineXBYTE((char*)0x20000L)指向xdata,偏移量为0的通用指针指针类型:1为idata,2为xdata,3为pdata,4为data,5为code二、通用指针例:将常数0x41写入地址为0x8057的外部数据存储器#defineXBYTE((char*)0x20000L)XBYTE[0x8057]=0x41;10:XBYTE[0x8057]=0x41;MOVDPTR,#0x8057MOVA,#0x41MOVX@DPTR,A偏移量三、absacc.h#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatiledata*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsignedintvolatilecode*)0)#defineDWORD((unsignedintvolatiledata*)0)#definePWORD((unsignedintvolatilepdata*)0)#defineXWORD((unsignedintvolatilexdata*)0)#defineXBYTE((char*)0x20000L)XBYTE[0x8057]=0x41;#include<reg51.h>#include<absacc.h>voidmain(void){

XBYTE[0x8057]=0x41;}#include<reg51.h>#include<absacc.h>#defineCOMXBYTE[0x8057]voidmain(void){

COM=0x41;}2.5几类重要的库函数C51提供了丰富的库函数资源,包括大量的关于I/O操作、内存分配、字符串操作、据类型转换、数学计算等函数库。它们是以执行代码的形式出现,供用户在连接定位时用。在用预处理器命令#include包含相应的头文件后,就可以在程序中使用这些函数。一、硬件地址定义头文件reg5x.h定义了特殊功能寄存器的地址。在文件开头首先要包含该文件。/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;这个库中提供的是一些用汇编语言编写的函数。用汇编语言编写非常直接简单且目代码很短,而用C51编写则代码很长。这些函数主要有:_crol_/_cror_无符号字符型变量左/右移位函数_irol_/_iror_无符号整型变量左/右移位函数_lrol_/_lror_无符号长整型变量左/右移位函数_nop_空操作函数_testbit_位测试函数一、内部函数库intrins.h#inclucle<intrins.h>voidmain(){ unsignedinty;

y=0x00ff;

y=_irol_(y,4);}举例:运行后,y=0x0ff0。一、内部函数库intrins.h二、绝对地址访问函数absacc.h用预处理器伪指令#defi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论