单片机编程C51疑难解析(不断更新中)

本文主要解析了C51单片机编程中的一些常见问题,包括位运算符的使用,如`|`、`&`和`&&`的区别;`while`循环条件的等价表达,以及如何正确进行宏定义以避免位操作的法律问题;此外,还解释了定时器0中断标志位TF0的使用和管理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

a|=b
a=a|b。新的等于 原来的a|b

&是一个位运算符,就是将两个二进制的数逐位相与,就是都是1才是1,只要有一个为0则为0,结果是相与之后的结果。
&&是一个逻辑运算符,就是判断两个表达式的真假性,只有两个表达式同时为真才为真,有一个为假则为假,具有短路性质。

2.

while(*p&&*p=='*')            
//等价于
while(*p!='\0'&&*p=='*')
//还等价于
while(*p=='*')
//表示当*p等于'*'时执行循环体。

3.

#define是宏定义语句
想做的是位操作,应该改将#define LED    P1^1
#define KEY_ON  P1^6
#define KEY_OFF P1^7
改为
sbit LED = P1^1;
sbit KEY_ON = P1^6;
sbit KEY_OFF = P1^7;
这样文中的“=”就不违法了

4.

TF0=0;

它的作用是:当定时器0溢出时,由硬件使TF0置1,并申请中断,进入中断服务程序后,由硬件自动清0.要注意:如果使用的是软件查询方式的话,当查询到该为置1后得用软件清0.


5. while(!TI);//while(TI==0)

    TI=0;
TI是串口的发送中断标志位,需软件清零
while(TI==0);//表示等待发送结束

TI=0;//表示软件清零

TI是单片机的串口发送数据的标志位,当单片机发送数据后将TI置1,需要软件清0

那么while(!TI)的意思也就是当单片机未发送数据所要执行的程序。

6.复合赋值运算符

a+=b------a=a+b; a%=b-------a=a%b; a<<=b--------a=a<<b等等,还有a-=b;a/=b;a*=b;a>>=b

对于初学者可能不太习惯,但是非常有利于编译处理,能够提高编译效率便产生高质量的目标代码。

7.

SDA=(bit)(input&0x80) input & 0x80 意思是取得 该字节的最高位 加一个bit  意思是 bit强类型转化  如果 最高位是1那么 sda=1 如果最高位不是1那么sda=0

8.宏定义#define FOSC 18432000L和#define BAUD 9600?

FOSC是根据IC外部实际使用的晶振来定义的,因为STC的下载版上都是使用的18.432M的晶振,所以会定义FOSC为18432000L
如果你外部挂的是11.0592M的晶振,那么就需要这样定义
#define FOSC 11059200L
BAUD的定义则是根据你与电脑串口所通讯的具体的波特率,
若使用9600的波特率,则定义为
#define BAUD 9600
 
若使用115200的波特率,则定义为
#define BAUD 115200


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值