在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点,是一些小细节。但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。当发现原因竟然是这么的简单和不起眼时,我想不单是我,大家都会感到痛不欲生。笔者今天又碰到了这样的问题,实在忍不住了。因为这些问题都是小的知识点,考虑到之前也遇到好多这种问题,于是决定每次遇到问题就记录下来,时刻提醒自己。
1. !和 ~ 不一样
! 是逻辑非符号,~ 是位取反符号。
对IO口某个管脚赋值时不要错用 !,如
2.<<和>>的优先级低于+、-
比如要实现c=x*2+1,没有加括号会出错
3.移位要防止溢出
其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如
4.无符号数和有符号数混合运算都会被强制转换为无符号数运算
当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的
5.局部变量要初始化
局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:
如果第一次调用fun时,a传递的值为0,那么flag = 0x01;执行if(flag&0x01)后面的代码。以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的。
如果要避免这个错误,平时要养成对局部变量初始化的习惯。
关键字:单片机 C语言 易错知识点
引用地址:
单片机C语言易错知识点
推荐阅读最新更新时间:2024-03-16 13:56
PIC单片机在ICD做lcd显示时钟演示程序
;************************************************* ;* CLKTEST.ASM * ;*-----------------------------------------------* ;*-----------------------------------------------* ;************************************************* ;* ICDDEMO教学实验板 lcd显示时钟演示程序 * ;************************************************* include p16f877.i
[单片机]
基于8031单片机和转换系统实现智能化浪涌电流测试仪的设计
引 言 随着整流二极管在电子工业特别是家电行业的广泛应用,用户对整流二极管的技术参数要求越来越严格。在国内,生产厂家对整流二极管浪涌电流的测试标准(国标)是在整流二极管的两端加一个时间常数10 ms、导通角为0°~180°的正弦半波脉冲电流。美国国家半导体公司对浪涌电流的测试标准是在整流二极管两端加上正常的正向整流电流的基础上再加一个时间常数为10 ms或8.3 ms、导通角为O°~180°的正弦半波脉冲电流;日本某电子公司要求生产厂家在整流二极管两端加连续两个时间常数为10 ms或8.3 ms、导通角为0°~180°的正弦半波脉冲电流。同时,还要把实际测量结果用打印机打印出来。显然,以前采用截取市电交流波形来产生时间常数为10
[单片机]
PICl6LF874单片机在电容测量模块中的应用
电容式传感器已广泛应用于工业、医学、军事等领城。但目前大部分电容测量方法集成化水平低、精度低,因而对电容特别是对微小电容的精确测量始终是一个很重要的内容。振荡法电路结构简单、抗干扰能力差,板间内电容影响测量结果;电桥法利用电桥平衡原理测量电容,测量结果受桥臂电容性能影响较大。本文用到美国 Micmchip公司PICl6LF874单片机,该单片机采用RISC精简指令集、哈佛总线结构、流水线指令方式,具有抗干扰能力强、功耗低、高性能、价格低等特性。 1 PICl6LF874单片机 PICl6系列单片机采用精简指令集(Reduced Instruction Set Computer,RISC)结构,突破了传统单片机对PC机在结构
[单片机]
51单片机控制的微波炉定时程序
//免责声明:这是微波炉的定时功能 纯为技术交流、学习之用。 //转载、使用者切莫用于不正当的用途,一切后果由转截/使用者自行负责 //按下独立键盘RD按键,每按一次增加60秒,按下INT1启动,按下INT0停止 //我们知道微波炉是不会自动运行的,得手动启动 #include reg52.h #define uint unsigned int #define uchar unsigned uchar sbit duan=P2^5; sbit wei=P2^6; const unsigned char table ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x88,
[单片机]
用Proteus学习51单片机之I2C(IIC)总线
在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想用多一点芯片吧,老觉得IO口不够用。学串口的时候觉得串口是个好东西,连两条线就够了,现在学到I2C,觉得这也是一个非常好的东西,也是两条线,还能给每个总线上的设备设立地址,简直就是一个小网络了。 I2C总线使用两条线,一条是时钟线,称为SCL,一条是数据线,称为SDA,各个设备就并在总线上,每一个总线上的设备都有一个自己的地址,主机在操作设备的时候,都会先发送一个地址码,告诉被操作机,接下来的命令由它接收。 接下来说一下I2C总线的数据有效性。I2C总线进行数据传送时,要求SCL为高电平时,SDA上的数据必需保持稳定,换言之,当
[单片机]
MSP430单片机各种寄存器总结(4)——WDT
参考资料: 王宏波老师的PPT MSP430F6638用户手册 王宏波老师实验教程 本章最新更新日期:2018.12.22 第四章 WDT寄存器 4.1 WDTCTL 4.2 SFRIE1 & SFRIFG1
[单片机]
基于ST72单片机的快速充电系统
传统的常规蓄电池充电方法都采用小电流的恒压或恒流充电,充电时间长达10~20个小时。为了缩短充电时间,必须对充电过程的充电电流进行控制。许多生产厂家误认为盲目提高充电电流就是快速充电,其实这不但不能提高充电效率,而且会加剧电池的极化现象,升高蓄电池温度,浪费电能,严重损坏蓄电池。根据美国科学家马斯提出的马斯三定律,脉冲充电、脉冲放电可以去除电池极化,减小蓄电池的内部压力、温度和内阻,加快充电速度,实现蓄电池快速充电需采用充-放-充的循环方式。这种模式的快充系统中一般应包括控制回路、充电回路、放电回路。根据充电过程中测得的参数,通过单片机适当调整,保证脉冲电压的(充、放)幅值及充电与放电的宽度比值恒定,可以得出充电效率的最佳结果。
[单片机]
关于嵌入式U盘读写器接口技术和系统设计
引言 随着USB技术和闪存技术的飞速发展,移动存储设备的速度和容量日新月异,但在工业控制的上位机和下位机之间,数据传输依然采用传统的串并口技术,特别对一些前端的便携式采集系统,需要采集后临时存储,再拿回来传给作为上位机的PC机进行数据处理,给人们带来很多不变,为此,本文提出了一种方法--利用U盘的便捷特性开发一种基于嵌入式的USB读写器,方便地将采集数据以文件方式写入U盘,PC机不需要任何特殊驱动便可以完成对数据的处理回放。利用本方法可以彻底解决下位机与PC机之间的数据传输难的问题。 1 硬件设计 系统采用TI公司的MSP430F149作为MCU,Cypress公司的SL811HS作为USB设备控制器,充分发挥各自
[嵌入式]