特殊功能寄存器(SFR)定义
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
这是在C语言中用于8052微控制器的特殊功能寄存器(SFR)定义。'sfr'是英文'special function register'的缩写,意为特殊功能寄存器。
在给定的代码行 'sfr P0 = 0x80;' 中,'P0' 是寄存器的名称,'0x80' 是这个寄存器在芯片内部的地址。在8052微控制器中,P0寄存器用于外部存储器访问控制。
寄存器位定义sbit(针对-可位寻址寄存器)
/* BIT Registers */
/* SCON */
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
这是在声明一个位变量,这个变量的名字是SM0,并且它被初始化为SCON寄存器的第7位。在C语言中,'sbit'是Keil C51编译器的一种特性,用于访问特定的位。这个声明用于直接访问和控制某个特定的位,而不必关心或直接操作那个位的其余部分。这使得代码更简洁,更易于理解和维护。
这里,'SCON^7'表示SCON寄存器的第7位。'^'是按位异或运算符,但在这里它被用作位域的标记,表示我们关心的是这个位。实际上,这个表达式的结果总是等于它自身第7位。
中断函数
void timer0() interrupt 1 //定时器工作函数,中断查询次序为1
{
TH0=0x3c; //进入中断后先将定时器重新赋初值
TL0=0xb0;
aa++; //变量加1,加一次是50ms
if(aa>=20) //变量加一次是50ms,加20次是一秒
{
aa=0; //变量清零
temp++; //秒变量加
if(temp==100) //最大计时99秒
{
temp=0; //大于等于100s时清零
}
shi=temp/10; //将秒数据分成两个一位数,比如35s,35/10=3
ge=temp%10; //将秒数据分成两个一位数,比如35s,35%10=5
}
}
16进制赋值
TH0=64535/256;//252,0xFC
THL=64535%256;//23,0x17,合并就是0xFC17==64535
将十进制转换成16进制赋值给高8位和低8位
原理:类似123拆分成百位1和十位个位23分开赋值,123/100=1和123%100=23,因为在百位分开,而百位最大值为100,10*10=100;同理64535从低8位分开,低8位二进制最大为256,16*16=256
赋值技巧
在给一些不能位寻址的寄存器赋值时,由于只想操作其中某一位,或者说其他位也有对应的功能,不能随便赋值,否则会改变设置,此时就可以使用与/或法赋值,详细如下:
TMOD=0x01;//0000 0001 //定义工作方式//四种工作模式/
//选择工作模式1(16位计数器 )
/*下面两句和上面一样的功能,但更安全,不会改动高4位*/
TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位保持不变;
//按位与,1&任何数,等于任何数本身;
// 0&任何数,等于0(用于清零)
TMOD=TMOD|0x01;//把TMOD的最低位置1,其他位保持不变;
//按位或,1|任何数,等于1;(用于置1)
//0|任何数,等于任何数本身
按位运算,左移右移实现乘除法
右移一位 = 除2;右移2位 = 除4,依次类推,右移n位 = 除2的n次方;
左移一位 = 乘2;左移2位 = 乘4,依次类推,左移n位 = 乘2的n次方;
变量位置
如上图,P25如果放在①处会报错,得放在定义之后,即②位置。