单片机第8章单片机C语言应用程序设计_第1页
单片机第8章单片机C语言应用程序设计_第2页
单片机第8章单片机C语言应用程序设计_第3页
单片机第8章单片机C语言应用程序设计_第4页
单片机第8章单片机C语言应用程序设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

第8章单片机的C语言应用程序设计8.1C语言与MCS-518.3C51数据类型及在MCS-51中的存储方式

8.4MCS-51内部资源使用的C语言编程8.5MCS-51片外扩展的C语言编程下页8.1C语言与MCS–51C语言编写单片机应用程序特点:1)只需初步了解单片机存储结构及内部资源;2)C语言能管理内部寄存器分配、不同存储器寻址和数据类型等细节问题;在小程序中代码量大,在较大程序中效率高;2)定义的数据类型和变量、语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同,具有C语言程序设计的特点。上页下页回目录

用C语言编写应用程序步骤: 编辑源程序,编译生成单片机可执行的代码,调试,写入单片机。

MCS–51系列单片机的C语言编译器: 主要有KEILC51编译器、FranklinC51编译器。上页下页回目录8.3C51数据类型及在MCS-51中的存储方式8.3.1C51的数据类型●C51编译器支持C语言所有标准的数据类型:char,unsignedchar,int,unsignedint,long,unsignedlong,float等。●加入了专门访问8051单片机硬件的数据类型:

◆bit:声明位变量,其值为1或0;

sbit:声明可寻址的位变量或SFR中的某个位变量,其值为1或0;

sfr:声明特殊功能寄存器,地址范围0~255

sfr16:声明特殊功能寄存器,地址范围0~65535上页下页回目录如:sfrSCON=0x98;//声明SCON为串口控制器,地址98HsfrP0=0x80;sfrPSW=0xD0;●sfr之后的寄存器名必须大写,定义之后可以直接对这些寄存器赋值。如P0=0X11;sbitCY=PSW^7;sbitCY=0xD0^7;sbitCY=0xD7;●右边的表达式定义特殊位在寄存器中的位置,值必须在0~7.8.3.2C51变量的存储类型C51每个变量可以使用下表所列的存储器类型明确分配到指定的存储空间。存储类型与存储空间的对应关系data直接寻址片内数据存储区,访问速度快(128字节)bdata可位寻址片内数据存储区,允许位与字节混合访问(16字节)idata间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)pdata分页寻址片外数据存储区(256字节)由MOV@Ri访问(i=0,1)xdata片外数据存储区(64KB)由MOVX@DPTR访问code程序存储器64KB空间,由MOVC@DPTR访问上页下页回目录带存储类型的变量的定义举例:unsignedchardatavar1;//声明一个内部直接寻址的无符号字节变量bitbdataflags;//在可位寻址片内数据存储区定义一个位变量charxdatavar2;//在外部数据存储区定义一个字符变量unsignedcharcode[]=“WelcometoBeijing”;//在程序存储区定义字符串上页下页回目录8.3.3存储模式确定用于函数自变量、自动变量和无明确存储类型的变量的默认存储器类型存储模式说明SMALL默认的存储类型是data,参数及局部变量放入可直接寻址片内RAM的用户区中(最大128字节)。另外所有对象(包括堆栈),都必须嵌入片内RAM。存取速度快,尽量使用此模式。COMPACT默认的存储类型是pdata,参数及局部变量放入分页的外部数据存储区,通过@R0或@R1间接访问,栈空间位于片内数据存储区中LARGE默认的存储类型是xdata,参数及局部变量直接放入片外数据存储区,使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度上页下页回目录对于片外扩展I/O口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用#define语句进行定义。例如#include<absacc.h>#definePORTAXBYTE[0xFFC0]absacc.h是C51中绝对地址访问函数的头文件,将PORTA定义为外部I/O口,地址为FFC0H,长度为8位。上页下页回目录FranklinC51编译器提供的MCS51常用的头文件:reg51.h:MCS-51系列内部特殊功能寄存器stdio.h:标准输入输出函数的说明absacc.h:绝对地址访问上页下页回目录8.4MCS-51内部资源的C语言编程8.4MCS-51内部资源的C语言编程8.4.1中断应用的C语言编程C51编译器支持在C源程序中直接开发中断程序。中断服务程序的函数定义的语法格式如下:

返回值函数名([参数])interruptm[usingn]{}上页下页回目录中断编号:m=0:外部中断0m=1:定时器/计数器0m=2:外部中断1m=3:定时器/计数器1m=4:串行口中断用于实现工作寄存器组的切换。n:是中断服务子程序中选用的工作寄存器组号(0~3)。定时器/计数器(T/C)应用的C语言编程例

设单片机的fosc=12MHz晶振,要求在P1.0脚上输出周期为2ms的方波。周期为2ms的方波要求定时时间隔1ms,每次时间到P1.0取反。机器周期=12/fosc=1μs需计数次数=1000/(12/fosc)=1000/1=1000由于计数器是加1计数,为得到1000个计数之后的定时器溢出,必须给定时器置初值为-1000(即1000的补数)。上页下页回目录(1)用定时器0的方式1编程,采用查询方式,程序如下:

#include<reg51.h>sbitP1_0=P1^0;voidmain(void){TMOD=0x01;/*设置定时器1为非门控制方式1*/TR0=1;/*启动T/C0*/for(;;){TH0=-(1000/256);/*装载计数器初值*/TL0=-(1000%256);do{}while(!TF0);/*查询等待TF0置位*/P1_0=!P1_0;/*定时时间到P1.0反相*/TF0=0;/*软件清TF0*/}}上页下页回目录/*FranklinC51编译器提供定义特定MCS-51系列成员的寄存器头文件。MCS-51头文件为reg51.h*/(2)用定时器0的方式1编程,采用中断方式。程序如下:#include<reg51.h>sbitP1_0=P1^0;voidtime(void)interrupt1using1/*T/C0中断服务程序入口*/{P1_0=!P1_0;/*P1.0取反*/TH0=-(1000/256);/*重新装载计数初值*/

TL0=-(1000%256);}voidmain(void){TMOD=0x01;/*T/C0工作在定时器非门控制方式1*/P1_0=0;TH0=-(1000/256);/*预置计数初值*/TL0=-(1000%256);EA=1;/*CPU中断开放*/ET0=1;/*T/C0中断开放*/TR0=1;/*启动T/C0开始定时*/do{}while(1);/*等待中断*/}上页下页回目录例8.8ADC0809与8031接口的数据采集程序举例。上页下页回目录8.5MCS-51片外扩展的C语言编程程序如下:#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint

//设置AD0809的通道7地址#definead_in7XBYTE[0x7fff]

//设置AD0809的通道7地址#defineresDBYTE[0x7f]#defineNUM8//采样次数=8bitad_over;//即EOC状态//采样中断voidint0_service()interrupt0using1{ad_over=1;}上页下页回目录voidmain(void){inti;uintsum;uchardataa[num];ad_over=0;EX0=1;IT0=1;EA=1;L1:i=0;sum=0;ad_in7=0;//启动A/D转换while(i<NUM);{if(ad_over)//等待转换结束 {ad_over=0; a[i]=ad_in7; sum=sum+a[i]; i=i+1; ad_in7=i;//启动A/D转换}}res=(uchar)sum/NUM;gotoL1;}8.5.2MCS-51输出控制的C语言编程例118031与DAC0832双缓冲接口的数据转换程序举例。图4.10DAC0832的双缓冲接口电路上页下页回目录将data1和data2数据同时转换为模拟量的C51程序如下:#include<absacc.h>#include<reg51.h>#defineINPUTR1XBYTE[0x8fff]#defineINPUTR2XBYTE[0xa7ff]#defineDACRXBYTE[0x2fff]#defineucharunsignedcharvoiddac2b(data1,data2)uchardata1,data2;{INPUTR1=data1; /*送数据到一片0832*/INPUTR2=data2; /*送数据到另一片0832*/DACR=0; /*启动两路D/A同时转换*/}上页下页回目录例128031与DAC0832单缓冲区接口的数据转换举例。图4.11DAC0832与8031的单缓冲接口上页下页回目录按片选线确定FFFEH为DAC0832的端口地址。使运行输出端输出一个锯齿波电压信号的C51程序如下:#include<absacc.h>#include<reg51.h>#defineDA0832XBYTE[0xfffe]#defineucharunsignedchar#defineuintunsignedintvoidstair(void){uchari;while(1){for(i=0;i<=255;i=I++) /*形成锯齿波输出值,最大值为255*/{DA0832=i; /*D/A转换输出*/}}}上页下页回目录8.5.3频率量测量的C语言编程1.计数法测量频率法的最简单的接口电路,可将频率脉冲直接连接到MCS-51的T1端,将8031的T/C0用作定时器,T/C1用作计数器。在T/C0定时时间里,对频率脉冲进行计数。T/C1的计数值便是单位定时时间里的脉冲个数。上页下页回目录定时输入脉冲<T图4.13测量频率中的脉冲丢失上页下页回目录图4.16频率与周期波上页下页回目录2.测量周期法图4.228031与行列式键盘的接口上页下页回目录8.5.4键盘和数码显示人机交互的C语言编程行扫描输出口P1.0~P1.3列回扫输入口P1.4~P1.7扫描函数的返回值为键特征码,若无键按下,返回值为0。程序如下:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintvoiddlms(void)voidkbscan(void);voidmain(void){ucharkey;while(1){key

温馨提示

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

评论

0/150

提交评论