单片机基础(03)
3.1 单片机C51编程环境的建立
单片机C51编程环境的建立
Keil μ \mu μ Vision IDE界面
如何建立一个可运行的语言程序框架
- 安装编译软件(keil)
- 建立一个空项目(Project)
- 建立一个源文件模板(XX.c或 XX.asm),无可执行代码,但可顺利编译。
- 写入具体的可执行程序,调试运行。
当项目编译、连接成功后,就可以进入调试模式,仿真运行来观察结果,运行调试过程如下。
(1)先用Debug菜单下的Start/Stop Debug Session命令(快捷键Ctrl+F5) 进入调试模式,结果如图所示。
一个简单的例子,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程序在以下几个方面不一样:
- C51中增加了几种针对MCS-51单片机特有的数据类型;
- C51中变量的存储模式与51单片机的存储器紧密相关,定义变量时需要明确指定存储器属性;
- 在函数的使用方面,C51中有专门的中断函数,并定义了专门的关键字和语法规则。
C51新增加的变量类型
1. 特殊功能寄存器型(sfr
,sfr16
)
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中,允许用户通过位类型符定义位变量。位类型符有两个:bit和sbit,它们在内存中都只占一个二进制位。
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语言的基本语法。同时也针对单片机特有的属性,增加了一些与函数相关的关键字和语法,并对一些库函数的处理做了调整。
- 增加了中断函数的语法
- 对stdio.h中标准输入输出库函数进行了调整
中断函数的定义
中断函数是单片机的一个重要特性,要使用C51语言开发单片机程序,必须支持中断函数的定义。
-
interrupt m修饰符
interrupt m 是C51中定义某个函数为中断响应西数的修饰符,当函数定义时定义后面用了interrupt m,系统编译时把该西数转化为某个中断员的响应函数,并函数地址存放在程序存储器中的中断对应的位置。interrupt m修饰符中,m的取值为0~5,对应的中断情况如下:- 0-外部中断0
- 1-定时/计数器TO
- 2-外部中断1
- 3-定时/计数器T1
- 4-串行口中断
- 5-定时/计数器T2
中断源 入口地址 外部中断0 0003H 定时/计数器0 000BH 外部中断1 0013H 定时/计数器1 001BH 串行口 0023H 定时/计数器2(仅52子系列有) 002BH
#include "regsl.h"
void main(){
......
}
void Int0_isr() interrupt 0{
}
编写MCS-51中断函数注意如下:
- 中断函数不能进行参数传递,不能有返回值。
- 中断函数不能被其他西数直接调用。因为中断函数的返回是由RETI指令完成的,而普通西数的返回指令是RET。
- 如果在中断西数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。