版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 单片机的C语言应用程序设计 8.1 C语言与MCS-518.3 C51数据类型及在MCS-51中的存储方式8.4 MCS-51内部资源使用的C语言编程8.5 MCS-51片外扩展的C语言编程8.1 C语言与语言与MCS51 C C语言编写单片机应用程序特点:语言编写单片机应用程序特点:1 1)只需初步了解单片机存储结构及内部资源;)只需初步了解单片机存储结构及内部资源;2 2)C C语言能管理内部寄存器分配、不同存储器寻址和数据类型等语言能管理内部寄存器分配、不同存储器寻址和数据类型等细节问题;在小程序中代码量大,在较大程序中效率高;细节问题;在小程序中代码量大,在较大程序中效率高;2
2、 2)定义的数据类型和变量、语法规定、程序结构及程序设计方)定义的数据类型和变量、语法规定、程序结构及程序设计方法都与标准的法都与标准的C C语言程序设计相同,具有语言程序设计相同,具有C C语言程序设计的特点。语言程序设计的特点。 用用C C语言编写应用程序步骤:语言编写应用程序步骤:编辑源程序,编译生成单片机可执行的代码,调试,写入单片机。 MCS51MCS51系列单片机的系列单片机的C C语言编译器语言编译器:主要有KEIL C51编译器、Franklin C51编译器。8.3 C51数据类型及在数据类型及在MCS-51中的存储方式中的存储方式8.3.1 C51的数据类型C51编译器支持
3、C语言所有标准的数据类型:char,unsigned char,int, unsigned int,long, unsigned long,float等。加入了专门访问8051单片机硬件的数据类型: bit:声明位变量,其值为1或0; sbit:声明可寻址的位变量或SFR中的某个位变量,其值为1或0; sfr:声明特殊功能寄存器,地址范围0255 sfr16:声明特殊功能寄存器,地址范围065535如:如:sfr SCON=0 x98;/sfr SCON=0 x98;/声明声明SCONSCON为串口控制器,地址为串口控制器,地址98H98Hsfr P0=0 x80;sfr P0=0 x80;s
4、fr PSW=0 xD0;sfr PSW=0 xD0; sfrsfr之后的寄存器名必须大写,定义之后可以直接对这些之后的寄存器名必须大写,定义之后可以直接对这些寄存器赋值。如寄存器赋值。如P0=0X11;P0=0X11;sbit CY=PSW7;sbit CY=0 xD07;sbit CY=0 xD7; 右边的表达式定义特殊位在寄存器中的位置,值必须在右边的表达式定义特殊位在寄存器中的位置,值必须在07.8.3.2 C51变量的存储类型变量的存储类型C51C51每个变量可以使用下表所列的存储器类型明确分配到指每个变量可以使用下表所列的存储器类型明确分配到指定的存储空间。定的存储空间。存储类型与
5、存储空间的对应关系 data 直接寻址片内数据存储区,访问速度快(128字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问(16字节) idata 间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节) pdata 分页寻址片外数据存储区(256字节)由MOV Ri访问(i=0,1) xdata 片外数据存储区(64 KB)由MOVX DPTR访问 code 程序存储器64 KB空间,由MOVC DPTR访问带存储类型的变量的定义举例:unsigned char data var1;/声明一个内部直接寻址的无符号字节变量bit bdata flags;/在可位寻址片内
6、数据存储区定义一个位变量char xdata var2;/在外部数据存储区定义一个字符变量unsigned char code=“Welcome to Beijing”;/在程序存储区定义字符串8.3.3 8.3.3 存储模式存储模式确定用于函数自变量、自动变量和无明确存储类型的变量的确定用于函数自变量、自动变量和无明确存储类型的变量的默认存储器类型默认存储器类型存储模式说 明SMALL默认的存储类型是data,参数及局部变量放入可直接寻址片内RAM的用户区中(最大128字节)。另外所有对象(包括堆栈),都必须嵌入片内RAM。存取速度快,尽量使用此模式。COMPACT默认的存储类型是pdata
7、,参数及局部变量放入分页的外部数据存储区,通过R0或R1间接访问,栈空间位于片内数据存储区中LARGE默认的存储类型是xdata,参数及局部变量直接放入片外数据存储区,使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度 对于片外扩展I/O口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用#define语句进行定义。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中绝对地址访问函数的头文件,将PORTA定义为外部I/O口,地址为 FFC0H,长度为8
8、位。 Franklin C51编译器提供 的MCS51常用的头文件:reg51.h: MCS-51系列内部特殊功能寄存器stdio.h:标准输入输出函数的说明absacc.h:绝对地址访问8.4 MCS-51内部资源的内部资源的C语言编程语言编程8.4 MCS-51内部资源的内部资源的C语言编程语言编程8.4.1 中断应用的中断应用的C语言编程语言编程 C51编译器支持在C源程序中直接开发中断程序。 中断服务程序的函数定义的语法格式如下: 返回值 函数名(参数) interrupt m using n 中断编号:m=0:外部中断0m=1:定时器/计数器0m=2:外部中断1m=3:定时器/计数器
9、1m=4:串行口中断用于实现工作寄存器组的切换。n:是中断服务子程序中选用的工作寄存器组号(0 3)。定时器定时器/计数器计数器(T/C)应用的应用的C语言编程语言编程 例例 设单片机的设单片机的fosc=12 MHz晶振,要求在晶振,要求在P1.0脚上输出周期脚上输出周期为为2 ms的方波。的方波。 周期为2 ms的方波要求定时时间隔1 ms,每次时间到P1.0取反。 机器周期=12/fosc=1 s 需计数次数=1000/(12/fosc)=1000/1=1000 由于计数器是加1计数,为得到1000个计数之后的定时器溢出,必须给定时器置初值为-1000(即1000的补数)。(1) 用定时
10、器用定时器0的方式的方式1编程,采用查询方式,程序如下:编程,采用查询方式,程序如下: # include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; /* 设置定时器设置定时器1为非门控制方式为非门控制方式1*/ TR0=1 ; /* 启动启动 T/C0 */ for( ; ;) TH0= -(1000/256); /* 装载计数器初值装载计数器初值 */ TL0= -(1000%256) ; do while (!TF0) ;/* 查询等待查询等待TF0置位置位 */ P1_0=!P1_0;/* 定时时间到定时时间到P1.0反相反相 */ TF
11、0=0; /* 软件清软件清 TF0 */ /*Franklin C51编译器提供定义特定MCS-51系列成员的寄存器头文件。MCS-51头文件为reg51.h*/(2) 用定时器用定时器0的方式的方式1编程,采用中断方式。程序如下:编程,采用中断方式。程序如下: # include sbit P1_0=P10 ; void time (void) interrupt 1 using 1 /* T/C0中断服务程序入口 */ P1_0=!P1_0 ; /* P1.0取反 */ TH0= -(1000/256); / * 重新装载计数初值 */ TL0= -(1000%256) ; void m
12、ain( void ) TMOD=0 x01 ; /* 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.8 ADC0809与8031接口的数据采集程序举例。图8-22 8031与ADC0808/0809转换器接口电路EA/VP31X119X218RESET9RD17WR16INT012INT
13、113T014T115P 1.01P 1.12P 1.23P 1.34P 1.45P 1.56P 1.67P 1.78P 0.039P 0.138P 0.237P 0.336P 0.435P 0.534P 0.633P 0.732P 2.021P 2.122P 2.223P 2.324P 2.425P 2.526P 2.627P 2.728PSEN29ALE/P30TXD11RXD10U18031AHD03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719E1G11U2SN74LS373 GND13VCC11IN026D721D620IN
14、127D519D418IN228D38D215IN31D114D017IN42EOC7IN53A25IN64B24C23IN75ALE22VREF(-)16OE9START6VREF(+)12CLK10U3ADC0809 VR(+5V)A0A1A2 123U4A7402456U4B7402D0D1D2D3D4D5D6D7D0D1D2D3D4D5D6D7VCCD0D1D2D3D4D5D6D712U5A74LS048.5 MCS-51片外扩展的片外扩展的C语言编程语言编程程序如下: # include # include # define uchar unsigned char # define
15、uint unsigned int / 设置设置AD0809的通道的通道7地址地址 # define ad_in7 XBYTE 0 x7fff / 设置设置AD0809的通道的通道7地址地址 # define res DBYTE 0 x7f # define NUM 8 /采样次数采样次数=8 bit ad_over ; / 即即EOC状态状态 / 采样中断 void int0_service() interrupt 0 using 1 ad_over=1;void main(void) int i; uint sum; uchar data anum; ad_over=0;EX0=1;IT0
16、=1;EA=1;L1: i=0;sum=0; ad_in7=0; /启动启动A/D转换转换 while (iNUM) ; if (ad_over) /等待转换结束等待转换结束 ad_over=0; ai=ad_in7; sum=sum+ai; i=i+1; ad_in7=i; /启动启动A/D转换转换 res=(uchar)sum/NUM; goto L1; 8.5.2 MCS-51输出控制的输出控制的C语言编程语言编程例例11 8031与DAC0832双缓冲接口的数据转换程序举例。图4.10 DAC 0832的双缓冲接口电路将data1和data2数据同时转换为模拟量的C51程序如下:# i
17、nclude # include # define INPUTR1 XBYTE 0 x8fff # define INPUTR2 XBYTE 0 xa7ff# define DACR XBYTE 0 x2fff # define uchar unsigned char void dac2b (data1 ,data2 )uchar data1 , data2 ; INPUTR1 = data1 ; /* 送数据到一片0832 */ INPUTR2 = data2 ; /* 送数据到另一片0832 */ DACR= 0 ; /* 启动两路D/A 同时转换 * /例例12 8031与DAC0832
18、单缓冲区接口的数据转换举例。图4.11 DAC0832与8031 的单缓冲接口 按片选线确定FFFEH为DAC0832的端口地址。使运行输出端输出一个锯齿波电压信号的C51程序如下:# include # include # define DA0832 XBYTE 0 xfffe # define uchar unsigned char # define uint unsigned int void stair (void ) uchar i ; while ( 1 ) for ( i=0 ; i=255 ; i=I+ ) /* 形成锯齿波输出值,最大值为255 */ DA0832 = i ;
19、 /* 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.22 8031与行列式键盘的接口 8.5.4 键盘和数码显示人机交互的键盘和数码显示人机交互的C语言编程语言编程行扫描输行扫描输出口出口P1.0 P1.3列回扫输入口列回扫输入口P1.4 P1.7扫描函数的返回值为键特征码,若无键按下,返回值为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不期而遇的温暖作文600字(5篇)
- 《燕子》说课稿15篇
- 2024年度汽车机电产品批量定制与销售合同3篇
- 八年级历史上册 第七单元 人民解放战争第23课 内战爆发教学实录 新人教版
- 左耳观后感作文800字
- 九年级语文上册 第17课 智取生辰纲教学实录 (新版)新人教版
- 2024秋二年级道德与法治上册 3.12 我们小点儿声教学实录 新人教版
- 人力资源的实习报告(集锦15篇)
- 感恩教师主题演讲稿(15篇)
- 幼儿园外出学习总结10篇
- 2020年山西省公务员录用考试《行测》真题及答案
- 语音通知营销方案
- 中国结直肠癌诊疗规范(2023版)解读
- 《汽车维修常用工具与仪器设备的使用》 课件 15.9 轮胎气压表的使用
- 降低针刺伤发生率品管圈课件
- JJF(新) 106-2023 微波消解仪温度、压力参数校准规范
- 小学期末复习班会课课件
- 新建子公司规划方案
- 文创店室内设计方案
- 装修公司安全生产规章制度
- 超声波探伤仪350 操作手册-1
评论
0/150
提交评论