版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机C51编程,一、C51与标准C的差异,1、库函数不同,2、头文件不同,3、数据类型有一定区别,4、增加了存储模式,5、增加了中断函数,6、输入、输出不同,C51通过串口进行。,二、C语言与汇编语言,单片机C语言编程与汇编语言编程的差异:,1、用汇编语言编写单片机程序必须要考虑其存储器结构,资 源分配是汇编语言编程中的一大负担。而且不同的存储器操作 对象寻址方式不同,访问的指令也不同。,3、汇编语言编程,子程序调用要考虑现场的保护与恢复,要考虑工作寄存器的分组使用,避免资源冲突。C语言编译系统自动完成这些工作。,如MOV, MOVC,MOVX访问的空间不同。,2、汇编语言中的指令繁多,功能
2、单一。如单片机中大量的转移 类指令在C语言中均由分支程序实现。,4、汇编语言编写中的循环程序是通过转移指令重复执行来现实的,C语言则通过循环语句来实现。,6、用C语言编写的单片机应用程序: (1)所有操作对象都可以看成变量或常量,没有寻址方式(数据传送由赋值语句实现,所有运算都通过表达式实现)。 (2)不用像汇编语言那样须具体组织、分配存储器资源和处理端口数据. (3)子程序调用时,C语言程序的编译系统自动进行现场的保护。 (5)C语言语法简单,语句紧凑,容易理解和掌握。 (4)在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。,5、汇编语言
3、编程中使用大量的算术逻辑运算指令在单片机C语言编程中全部由相应的运算表达式实现。,三、 C51的数据类型,1、特殊功能寄存器类型: 在C51中对特殊功能寄存器的访问必须先用sfr或sfr16 进行声明。,sfr P0= 0 x80; /*P0口的寄存器地址为0 x80*/,两种使用特殊功能寄存器的方法:,1)、先定义再使用:,2)、包含51单片机的头文件:,#include ,void main(void) uchar var1; var1 = P1 . while(1); ,2、位类型 这也是C51中扩充的数据类型,用于访问MCS-51单片机中的可寻址的位单元。在C51中,支持两种位类型:b
4、it型和sbit型。它们在内存中都只占一个二进制位,其值可以是“1”或“0”。,bit flags; /* 在bdata区定义一个位变量*/ sfr P0= 0 x80; /*因P0口的寄存器是可位寻址的*/ sbit P0_0=P00; /*所以P0_0为P0中的P0.0引脚*/ 除了以上定义方式外,还可以用P0.0的地址去写,如: sbit P0_0=0 x80;,区别:用bit定义的位变量在C51编译器编译时,在不同的时 候位地址是可以变化的,而用sbit定义的位变量必须与51单 片机的一个可以寻址位单元或可位寻址的字节单元中的某一 位联系在一起,在C51编译器编译时,其对应的位地址是不
5、可 变化的。,四、新增存贮类型 变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。 在C51中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。定义的格式如下: 数据类型说明符 存储器类型 变量名1=初值,变量名2=初值;,2、六种存储器类型:,【例】变量定义存储种类和存储器类型相关情况。 char data varl; /*在片内RAM低128B定义用直接寻址方式访问的字符型变量var1*/ int idata var2; /*在片内RAM256B定义用间接寻址方式访问的整型变量var2*/ unsigned lo
6、ng data var3; /*在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3*/ float xdata var4; /*在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4*/ int code var5; /*在ROM空间定义整型变量var5*/ unsign char bdata var6;/*在片内RAM位寻址区20H2FH单元定义可字节处理和位处理的无符号字符型变量var6*/,五、 存储模式,C51编译器支持三种存储模式:SMALL模式、COMPACT模式和LARGE模式。不同的存储模式对变量默认的存储器类型不一样。 (1)SMALL模式
7、。SMALL模式称为小编译模式,在SMA-LL模式下,编译时,函数参数和变量被默认在片内RAM中,存储器类型为data。 (2)COMPACT模式。COMPACT模式称为紧凑编译模式,在COMPACT模式下,编译时,函数参数和变量被默认在片外RAM的低256字节空间,存储器类型为pdata。 (3)LARGE模式。LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64K字节空间,存储器类型为xdata。,六、 绝对地址访问,1. 使用指针 采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。例如:,#define uchar unsign
8、ed char #define uint unsigned int void test_memory(void) uchar idata ivar1; uchar xdata *xdp; /*定义一个指向xdata存储器空间的指针*/ char data *dp; /*定义一个指向data存储器空间的指针*/ uchar idata *idp; /*定义一个指向idata存储器空间的指针*/ xdp=0 x1000;/*xdata指针赋值,指向xdata存储器地址1000H处*/ *xdp=0 x5A;/*将数据5AH送到xdata的1000H单元*/ dp=0 x61; /*data指针赋值
9、,指向data存储器地址61H处*/ *dp=0 x23; /*将数据23H送到data的61H单元*/ idp= /*等价于ivar1=0 x16*/,2、使用C51运行库中预定义宏 C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:,#define CBYTE(unsigned char volatile code *) 0 ) #define DBYTE(unsigned char volatile data * ) 0 ) #define PBYTE(unsigned
10、 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 ),这些函数原型放在absacc.h文件中。使用时须用预处理
11、命令把该头文件包含到文件中,形式为:#include 。 其中:CBYTE以字节形式对code区寻址, DBYTE以字节形式对data区寻址, PBYTE以字节形式对pdata区寻址, XBYTE以字节形式对xdata区寻址, CWORD以字形式对code区寻址, DWORD以字形式对data区寻址, PWORD以字形式对pdata区寻址, XWORD以字形式对xdata区寻址。,【例】绝对地址对存储单元的访问 #include /*将绝对地址头文件包含在文件中*/ #include /*将寄存器头文件包含在文件中*/ #define uchar unsigned char /*定义符号uch
12、ar为数据类 型符unsigned char*/ #define uint unsigned int /*定义符号uint为数据类型 符unsigned int*/ void main(void) uchar var1; uint var2; var1=XBYTE0 x0002; /*访问片外RAM的0002字节单元*/ var2=XWORD0 x0004; /*访问片外RAM的00040005单元*/ . while(1); ,3、使用C51扩展关键字_at_ 使用_at_对指定的存储器空间的绝对地址进行访问,一般格式如下: 存储器类型 数据类型 标识符 _at_ 地址常数; 其中,存储器类
13、型为data、bdata、idata、pdata等如省略则按存储模式规定的默认存储器类型确定变量的存储器区域; 数据类型为C51支持的数据类型。地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内; 使用_at_定义的变量必须为全局变量。,【例】通过_at_实现绝对地址的访问。 #define uchar unsigned char /*定义符号uchar为数据类 型符unsigned char*/ #define uint unsigned int /*定义符号uint为数据类型 符unsigned int*/ data uchar x1 _at_ 0 x40; /*在data区中定
14、义字节变量 x1,它的地址为40H*/ xdata uint x2 _at_ 0 x2000; /*在xdata区中定义字变量 x2,它的地址为2000H*/ void main(void) x1=0 xff; x2=0 x1234; . while(1); ,由于标准C没有处理单片机中断的定义,由此C51增加了一个扩展关键字interrupt。使用interrupt将一个函数定义成中断服务函数。对于中断服务函数,编译时会自动添加了相应的现场保护、恢复现场等,因而用户在编程时可不必考虑这些问题,减小了编程的繁琐程度。 中断函数一般形式为:viod 函数名( ) interrupt n usin
15、g n interrupt后的 n是中断号,n取值为04,分别对应5个中断源:外中断0、T0中断、外中断1、T1中断、串行口中断。 using后的 n是中断函数中所采用的工作寄存器组号,n取值03,分别对应通用工作寄存器区:第0组、第1组、第2组、第3组。 using是选项可省略。若没有使用using,中断函数中使用原指定的工作寄存器组,但使用前将其内容保存到堆栈中,返回时复原。,4、C51的中断函数,例:使用一个“+”键和一个“-”键来进行数据的的修改,若用INT0和INT1作“+”键和“-”键的输入,P1口接一个数码管,显示加、减操作数据的变化信息。系统上电后初始显示数据0,每按一次加键,
16、加1显示,加到9后再按加键自动回0;每按一次减键,减1显示,减到0后再按减键,自动回9;画出接线电路图,编程实现。,#include #define uchar unsigned char #define uint unsigned int /段码 uchar code DSY_CODE=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d, 0 x7d,0 x07,0 x7f,0 x6f,0 x07;,/按键计数 char Key_Counts=0; sbit AddKey=P32; sbit SubKey=P33; /延时 void DelayMS(uint x) uch
17、ar i; while(x-) for(i=0;i120;i+); ,/显示函数 void Show_Counts_ON_DSY(char x) P1= DSY_CODE x; ,/主程序 void main() Show_Counts_ON_DSY(Key_Counts); while(1) if (AddKey) DelayMS(10); if (AddKey) while (AddKey); +Key_Counts; if (Key_Counts9) Key_Counts=0; else if (SubKey) DelayMS(10); if (SubKey) while (SubKey
18、) ; -Key_Counts; if (Key_Counts0) Key_Counts=9; Show_Counts_ON_DSY(Key_Counts); ,例:设计单片机与44矩阵键盘接口并驱动一数码管显示的电路,P1口接键盘,P0口接共阴数码管,按数字键(0 9),在数码管上显示相应的键号,按其它键数码管清零,编程实现。,#include ,#define uchar unsigned char #define uint unsigned int,/段码 uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82, 0 x
19、f8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x00;,sbit BEEP=P37;,/上次按键和当前按键的序号,该矩阵中序号范围015, / 16表示无按键 uchar Pre_KeyNo=16 ,KeyNo=16;,/延时 void DelayMS(uint x) uchar i; while(x-) for(i=0;i120;i+); ,/矩阵键盘击键检查,uchar CH_Key (void) uchar key_temp; P1=0 x0f; /高4 位置0,放入4 行 key_temp =P10 x0f; return (key_temp);,/矩阵键盘扫描,void Keys_Scan() uchar Tmp; P1=0 x0f; /高4 位置0,放入4列 Tmp=P10 x0f switch(Tmp) /判断按键发生于03 行的哪一行 case 1: KeyNo=0 ; break; case 2: KeyNo=4 ; break; case 4: KeyNo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宣传用品采购管理制度
- 快递公司采购管理制度
- 幼儿园采购食材票据制度
- 医院采购回款制度范本
- 加工型企业采购管理制度
- 工程采购制度
- 学校食堂采购食品制度
- 题型八 化学实验基础-高考化学二轮复习题型归纳与解题技巧
- 数字化转型下人寿保险企业审计管理信息系统的构建与创新
- 数字化转型下MS药业公司财务管理制度优化路径探析
- 2026河南豫能控股股份有限公司及所管企业招聘31人备考题库及参考答案详解(黄金题型)
- 2026年平顶山发展投资控股集团有限公司校园招聘考试备考试题及答案解析
- 鹿茸菇项目可行性研究报告
- 2026校招:山东新动能基金管理公司笔试题及答案
- GB/T 47067-2026塑料模塑件公差和验收条件
- GB/T 21558-2025建筑绝热用硬质聚氨酯泡沫塑料
- 电厂采制化安全课件
- 雨课堂学堂在线学堂云《Linux操作系统(东北)》单元测试考核答案
- 全国“红旗杯”班组长大赛知识考试题题库(含答案解析)
- 急诊科建设与管理指南(2025年版)
- 校医服务合同范本
评论
0/150
提交评论