单片机续集第3,4章(图文+课后答案) C51语言编程基础 与汇编语言相比, C51语言具有_可读性好,可移植性好,模块化开发与资源共享,生成的代码效率高等优点 一.1. C51的程序结构
① 程序由函数组成(一个主函数,或一个主函数和若干自定义函数); ② 利用预处理命令对变量或函数进行集中定义或说明; ③ 函数和变量都需遵循先定义后使用的基本原则; ④ 主函数中的所有语句执行完毕,则程序结束。 例如:
C51的变量 在程序执行过程中,数值可以发生改变的量称为变量。
数据类型:有符号数类型可以忽略signed标识符
C51扩充数据类型:bit、sfr或sfr16、sbit用bit 定义一个位变量,语法规则如下:bit bit_name [= 常数0~1]; 例如:bit door = 0 ; //定义一个叫door的变量且初值为0 注意:利用bit可以定义一个位变量或位函数,但不能定义位指针,也不能定义位数组。 例如:bit gate=0; (2)sfr定义特殊功能寄存器SFR,语法规则如下: sfr 或 sfr16 sfr_name = 字节地址常数; 例如,sfr P0 = 0x80; //定义P0口地址80H sfr PCON = 0x87; //定义PCON地址87H sfr16 DPTR=0x82; //定义DPTR的低端地址82H
(3)sbit型 将SFR范围内的位地址(0x80~0xFF)定义为位变量 sbit bit_name = 位地址常数; 将位于SFR字节地址内的绝对位地址定义为位变量名。 sbit bit_name = sfr_name ^ 位位置; 将已有定义的SFR的0~7位定义为位变量名。 例如: sfr PSW = 0xD0; sbit CY = PSW^7;
sbit CY = 0xD0^7;
(4)C51存储器类型与存储空间的对应关系:
unsigned char bdata status_byte; //定义status_byte为无符号字符型自动变量,该变量位于bdata区 unsigned int code unit_id[2]={0x1234, 0x89ab}; //定义unit_id[2]为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0x1234和0x89ab。 static char m, n; //定义m和n为2个位于data区中的有符号字符型静态变量 C51语言访问绝对地址 1. 绝对宏 C51编译器提供了一组宏定义来对code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#include<absacc.h>”来对absacc.h中声明的宏来访问绝对地址,包括CBYTE、CWORD、DBYTE、DWORD、XBYTE、XWORD、PBYTE、PWORD,其中:、库函数中访问存储器宏的原型 C51编译器提供了两组用指针定义的绝对存储器访问的宏,其原型如下。 1)按字节访问存储器的宏: #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) #define PWORD ((unsigned int volatile pdata*)0) #define XWORD ((unsigned int volatile xdata*)0) 无idata型,不能访问片内RAM高128字节区域(0x80~0xff),需要时可以自己定义。 这些宏定义原型放在absacc.h文件中,使用时需要用预处理命令把该头文件包含到文件中,形式为: #include <absacc.h> (2)、绝对访问存储器宏的应用 1)按字节访问存储器宏的形式 例如: DBYTE[0x30]=48; //给片内RAM送数据 XBYTE[0x0002]=0x36; //给片外RAM送数据 2)按整型数访问存储器宏的形式 DWORD[0x40]=0x1234; //给0x40、0x41送数 XWORD[0x0004]=0x5678;//给4、5单送数 通过指针定义的宏访问存储器这种方法,特别适用于访问I/O口。 【例】使用关键字_at_实现绝对地址的访问,程序如下: data unsigned char y1 _at_ 0x50; /*在data 区定义字节变量y1,它的地址为50H*/ xdata unsigned int y2 _at_ 0x4000; /*在xdata区定义字变量y2,地址为4000H*/ void main(void) { y1=0xff; y1=0x1234; …… while(1); } 【例】将片外RAM 2000H开始的连续20个字节单清0。 xdata unsigned char buffer[20] _at_ 0x2000; void main(void) { unsigned char i; for(i=0; i<20; i++) { buffer[i]=0; } } 如果把片内RAM 40H单开始的8个单内容清0,则程序如下: data unsigned char buffer[8] _at_ 0x40; void main(void) { unsigned char j ; for(j=0; j<8; j++) {buffer[j]=0;} }C语言的基本运算 算术运算符
关系运算符
逻辑运算符
位运算符
C51的分支与循环结构(for循环以及if语句等) C51的数组 一维数组的定义: 数据类型 数组名[常量表达式];
int a[5]={1,2,3,4,5}; 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; 数组必须先定义,后使用 只能逐个引用数组素,不能一次引用整个数组 引用形式: 数组名 [下标] 其中:下标从0开始到n-1,不能越界,下标可以 是变量、常量或整型表达式。
C51的指针 指针是一个特殊的变量,它里面存储的数值是存储器的一个地址。 指针变量的定义: 数据类型说明符 [存储器类型] *指针变量名;数据类型说明符说明了该指针变量所指向的变量的类型。 指针:一个变量的地址 指针变量:专门存放变量地址的变量
总结:C51的数据类型与变量的定义,都必须考虑单片机的存储结构。 作业:在Keil环境中实现如下编程 1、将片内40H为首地址的连续10个单清零 2、将片外2000H为首地址的连续10个单的内 容,读入到片内40H到49H单中。 3、编写延时10ms的子函数。 课后题答案解析: 填空 1.与汇编语言相比, C51语言具有可读性好,可移植性好,模块化开发与资源共享,生成的代码效率高等优点。 2.C51语言头文件包括的内容有8051单片机片内的外设硬件资源,以及,相应的特殊功能寄存器的说明。 3.C51提供了两种不同的数据存储类型xdata和pdata__来访问片外数据存储区。 4.C51提供了code存储类型来访问_程序存储区___。 5.对于SMALL存储模式,所有变量都默认位于8051单片机_内部的数据存储器___。 C51用“*”和“&”运算符来提取指针变量的内容____和变量的__地址__。 判断对错 1.C51语言处理单片机的中断是由专门的中断函数来处理的。(√) 2.在C51语言中,函数是一个完成一定相关功能的执行代码段,它与另外两个名词“子程序”和“过程”用来描述同样的事情。(√) 3.在C51语言编程中,编写中断服务函数时需要考虑如何进行现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段的编写。(×) 4.全局变量是在某一函数中存在的变量,它只在该函数内部有效。(错) 5.全局变量可使用static关键词进行定义,由于全局变量一直存在,占用了大量的内存单,且加大了程序的耦合性,不利于程序的移植或复用。(√) 绝对地址包含头文件absacc.h定义了几个宏,用来确定各类存储空间的绝对地址。(√) 简答题 1.C51在标准C的基础上,扩展了哪几种数据类型? 答:扩展了4种数据类型,它们是:bit、sfr、sfr16和sbit。 C51有哪几种数据存储类型?其中数据类型“idata,code,xdata,pdata”各对应AT89S51单片机的哪些存储空间 答:C51有6种数据存储类型data、bdata、idata、xdata、pdata和code。 数据存储类型idata对应片内RAM的256字节。 数据存储类型code对应程序存储区。 数据存储类型xdata对应片外64KB的RAM空间。 数据存储类型pdata对应片外RAM的256字节。 3 . bit与 sbit定义的位变量有什么区别? 答:bit是用来定义普通的位变量,它的值只能是二进制的0或1。而sbit定义的是特殊功能寄存器的可寻址位,它的值是可以进行位寻址的特殊功能寄存器的某位的绝对地址,例如PSW寄存器OV位的绝对地址0xd2。
xdate unsigned char buffer1[10] _at_ 0x2000; date unsigned char buffer2[10] _at_ 0x40; Void main(void) { Unsigned char i; For(i=0;i<10;i++) (buffer2[i]=buffer1[i]; ) } 部分图片来源于网络 参考书《单片机原理及接口技术–张毅刚》 禁止转载
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/48523.html