
本文共 1725 字,大约阅读时间需要 5 分钟。
使用C语言已成为单片机应用系统开发的趋势。
包含文件
#include//包含单片机寄存器的头文件
打开Keil的安装目录,在C51文件夹下找到“INC”子文件夹,打开里面的“reg51.h”,可以看到以下定义:
/*---------------------------------------------------------------- REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright © 1988-2001 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.这个文件对单片机内部各种寄存器进行了定义。如果将“sfr P0 = 0x80; ”语句中的“P0”改为其他名字,如“Q0”,那么在编程时,使用第一行的“文件包含”处理命令后,单片机以后就不再认识“P0”,而是只认识“Q0”了(最好不要修改)。
扩充
- srf 为了能够直接访问单片机的一些内部寄存器,Keil C51编译器扩充了关键字sfr。利用这种扩充关键字可以在C语言源程序中直接对8051系列单片机的特殊功能寄存器进行定义。其方法如下: sfr 特殊功能寄存器名=地址常数 例如: sfr P0=0x80 ; /* 定义地址为“0x80”的特殊功能寄存器 名字为“P0”,对P0的操作也就是对地址为0x80的寄存器的操作*/
- sbit 在8051系列单片机应用系统中,经常需要访问特殊功能寄存器中的某些位,Keil C51编译器为此提供了另一种扩充关键字sbit,利用它可以定义位寻址对象。定义方法如下: sbit 位变量名=特殊功能寄存器名^位位置 例如: sbit LED=P1^3 ; //位定义LED为P1.3(寄存器P1的第3位)
作上述定义后,如果要点亮图4-1所示的发光二极管D1,编程时就可以直接使用以下命令: LED=0; //将P1.3引脚电平置“0”,对LED的操作就是对P1.3的操作
#define
define是一条预编译处理命令,称为宏定义命令,其功能是把该标志符定义为其后的符号常量值。
#define uint unsigned int#define uchar unsigned charuchar temp;//LED灯相关变量void delay(uint z){ uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); }
位运算符
(1)按位“与”运算符“&”
“&”运算符的功能是对两个二进制数按位进行“与”运算。根据“与”运算规则“有0为0,全1出1”。
(2)按位“或”运算符“|”
“|”运算符的功能是对两个二进制数按位进行“或”运算。根据“或”运算规则“有1为1,全0出0”。
(3)按位“异或”运算符“^”
“^”运算符的功能是对两个二进制数按位进行“异或”运算。根据“异或”运算规则“相异为1,相同出0”。
(4)按位“取反”运算符“~”
“~”运算符的功能是对二进制数按位取反。例如,要对
变量z=0x0f按位取反,将z化为二进制为0000 1111B,根据取反规则“有0出1,有1出0”。
(5)左移运算符“<<”
“<<”运算符的功能是将一个二进制数的各位全部左移若干位,移动过程中,高位丢弃,低位补0。例如w=0x3a,化为二进制即0011 1010B,若将各二进制位全部左移两位,可通过左移运算符“<<”进行,其方法是w<<2,则变量w=1110 1000B,化为十六进制,结果为0xe8。
(6)右移运算符“>>”
“>>”运算符的功能是将一个二进制数的各位全部右移若干位,正数在移动过程中,低位丢弃,高位补0;负数则高位补1。例如w=0x0f,化为二进制即0000 1111B,若将各二进制位全部右移两位,可通过左移运算符“>>”进行,其方法是w>>2,则变量w=0000 0011B,化为十六进制,结果为0x03。
发表评论
最新留言
关于作者
