51单片机C语言

使用C语言已成为单片机应用系统开发的趋势。

包含文件

#include<reg51.h>   //包含单片机寄存器的头文件

打开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 char

uchar 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。

发布了240 篇原创文章 · 获赞 85 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/imxlw00/article/details/103898409