单片机基础03

单片机基础(03)

3.1 单片机C51编程环境的建立

单片机C51编程环境的建立

Keil μ \mu μ Vision IDE界面
04301656oOWA6S
如何建立一个可运行的语言程序框架
  1. 安装编译软件(keil)
  2. 建立一个空项目(Project)
  3. 建立一个源文件模板(XX.c或 XX.asm),无可执行代码,但可顺利编译。
  4. 写入具体的可执行程序,调试运行。

当项目编译、连接成功后,就可以进入调试模式,仿真运行来观察结果,运行调试过程如下。

(1)先用Debug菜单下的Start/Stop Debug Session命令(快捷键Ctrl+F5) 进入调试模式,结果如图所示。

04301656oOWA6S

一个简单的例子,while(1)是单片机特有的结尾。

#include<reg51.h>
void main(){
  unsigned char i = 0;
  ACC=i + 1;
  while(1){
    P1 = ACC;
  }
}

3.2 单片机C51中新增变量类型

用c语言编写单片机应用程序与标准的c语言程序也有相应的区别:C语言编写单片机应用程序时,需根据单片机存储结构及内部资源定义相应的数据类型和变量,而标准的C语言程序一般不需要考虑这些问题。

C51包含的数据类型、变量存储模式、输入输出处理、函数等方面与标准的c语言有一定的区别。其它的语法规则、程序结构及程序设计方法等与标准的C语言程序设计相同。

C51与标准C语言的区别

C51程序与标准的C程序在以下几个方面不一样:

  1. C51中增加了几种针对MCS-51单片机特有的数据类型;
  2. C51中变量的存储模式与51单片机的存储器紧密相关,定义变量时需要明确指定存储器属性;
  3. 在函数的使用方面,C51中有专门的中断函数,并定义了专门的关键字和语法规则。

C51新增加的变量类型

1. 特殊功能寄存器型(sfrsfr16)

51单片机片内有许多特殊功能寄存器,通过这些特殊功能寄存器可以控制单片机的定时器、计数器、串口、I/O及其它功能部件,每一个特殊功能寄存器在片内RAM中都对应于单元。

在C51中,允许用户对这些特殊功能寄存器进行访问,访问时须通过sfr或sf16类型说明符进行定义,定义时须指明它们所对应的片內RAM单元的地址。格式如下:sfr或sfr16 特殊功能寄存器名=地址:

特殊功能寄存器的定义

sfr PSW=0xd0;
sfr P1=0x90;
sfr16 DPTR=0x82:

为了方便用户,C51编译器把S1单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“regsl。h”或 “regs2。b”的头文件中,用户使用时,只须用预处理命令#include <reg52.h>把这个头文件包含到程序中即可。

2. 位变量

在c51中,允许用户通过位类型符定义位变量。位类型符有两个:bitsbit,它们在内存中都只占一个二进制位。

bit位类型符用于定义一般的可位处理位变量。它的格式如下:bit 位变量名;

sbit型变量的定义举例

sbit OV=0xd2;
sbit CY=oxd7:
sfr P1=0x90;
sbit P1_0=P1^0:

C51变量定义时的存储模式设置

在C51中,变量在定义时需指出变量的数据类型和存储器类型。定义的格式如下:

数据类型说明符 [存储器类型] 变量名1 [=初值];

存储器类型描述
data直接寻址的片内RAM低128B,访问速度快
bdata片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问
idata间接寻址访问的片内RAM,允许访问全部片内RAM
pdata用Ri间接访问的片外RAM的低256B
xdata用DPTR间接访问的片外RAM,允许访问全部64k片外RAM
code程序存储器ROM64k空间

C51中变量的定义举例

char data varl; //在片内RAM低128B定义用直接寻址方式访问的字符型变量var1
int idata var2; //在片内RAM256B定义用间接寻址方式访问的整型变量var2
int code var5;1 //在ROM空间定义整型变量var5
unsigned char bdata var6;//在片内RAM位寻址区20H~2FH单元定义可字节处理和位处理的无符号字符型变量var6

3.3 单片机C51中断函数定义

函数的定义

函数是c语言的基本模块,C51与标准C语言类似,支撑关于C语言的基本语法。同时也针对单片机特有的属性,增加了一些与函数相关的关键字和语法,并对一些库函数的处理做了调整。

  1. 增加了中断函数的语法
  2. 对stdio.h中标准输入输出库函数进行了调整
中断函数的定义

中断函数是单片机的一个重要特性,要使用C51语言开发单片机程序,必须支持中断函数的定义。

  1. interrupt m修饰符
    interrupt m 是C51中定义某个函数为中断响应西数的修饰符,当函数定义时定义后面用了interrupt m,系统编译时把该西数转化为某个中断员的响应函数,并函数地址存放在程序存储器中的中断对应的位置。interrupt m修饰符中,m的取值为0~5,对应的中断情况如下:

    1. 0-外部中断0
    2. 1-定时/计数器TO
    3. 2-外部中断1
    4. 3-定时/计数器T1
    5. 4-串行口中断
    6. 5-定时/计数器T2
    中断源入口地址
    外部中断00003H
    定时/计数器0000BH
    外部中断10013H
    定时/计数器1001BH
    串行口0023H
    定时/计数器2(仅52子系列有)002BH
#include "regsl.h"
void main(){
  ......
}

void Int0_isr() interrupt 0{
  
}
编写MCS-51中断函数注意如下:
  1. 中断函数不能进行参数传递,不能有返回值。
  2. 中断函数不能被其他西数直接调用。因为中断函数的返回是由RETI指令完成的,而普通西数的返回指令是RET。
  3. 如果在中断西数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值