单片机C语言开发逻辑取反和按位取反差异


新手入门容易犯的小错误。

  • 在不同条件语句中,注意使用场合。

示例程序


/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
/*---------------------------------------------------------------------*//************* 功能说明    **************双串口全双工中断方式收发通讯程序。通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.******************************************/#define    MAIN_Fosc           11059200L   //定义主时钟
#include    "STC15Fxxxx.H"
#include "stdio.h"
#define     BaudRate1       9600L
#define     UART1_BUF_LENGTH    32
#define RX1_Lenth       32          //串口接收缓冲长度
#define Timer1_Reload   (65536UL -(MAIN_Fosc / 4 / BaudRate1))      //Timer 1 重装值, 对应300KHZu8    TX1_Cnt;    //发送计数
u8  RX1_Cnt;    //接收计数
bit B_TX1_Busy; //发送忙标志u8   idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
unsigned char *pchar;               //定义一个全局指针void  UART1_config(u8 brt);   // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void    PrintString1(u8 *puts);
//========================================================================
// 函数: void  delay_ms(unsigned int ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数,  自动适应主时钟.//========================================================================
void  delay_ms(unsigned int ms)
{unsigned int i;do{i = MAIN_Fosc / 13000;while(--i)    ;   //14T per loop}while(--ms);
}void InitSerialPort(void)
{ SCON = 0x50;         //8位数据,可变波特率AUXR |= 0x40;       //定时器时钟1T模式AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器TMOD &= 0x0F;        //设置定时器模式TH1 = (u8)(Timer1_Reload >> 8);TL1 = (u8)Timer1_Reload;ET1 = 0;       //禁止定时器%d中断TR1 = 1;        //定时器1开始计时ES=1;                //串口中断开关,采用查询法时不用打开中断      REN=1;                  //串口为工作方式1,允许接收数据SM0=0;                 //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定SM1=1;
}//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void main(void)
{unsigned int n;P0M1 = 0;  P0M0 = 0;  //设置为准双向口P1M1 = 0; P1M0 = 0;  //设置为准双向口P2M1 = 0; P2M0 = 0;  //设置为准双向口P3M1 = 0; P3M0 = 0;  //设置为准双向口P4M1 = 0; P4M0 = 0;  //设置为准双向口P5M1 = 0; P5M0 = 0;  //设置为准双向口P6M1 = 0; P6M0 = 0;  //设置为准双向口P7M1 = 0; P7M0 = 0;  //设置为准双向口InitSerialPort();//串口初始化EA = 1;   //允许总中断PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //SUART1发送一个字符串while (1){delay_ms(500);n = ~0;printf("uint = ~0:%u \r\n",n);    //SUART1发送一个字符串n = !0;printf("uint = !0:%u \r\n",n);    //SUART1发送一个字符串P10 = !P10;}
}//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: puts:  字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void PrintString1(u8 *puts) //发送一个字符串
{for (; *puts != 0;    puts++)       //遇到停止符0结束{SBUF = *puts;B_TX1_Busy = 1;while(B_TX1_Busy);}
}
//重写putchar函数,方便调用printf串口打印输出char putchar(unsigned char c)
{SBUF = c;                     //发送数据while(!TI);                   //等待发送完成TI=0;                          //清零发送标志位;return c;
}//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{if(RI){RI = 0;RX1_Buffer[RX1_Cnt] = SBUF;        //保存一个字节if(++RX1_Cnt >= RX1_Lenth)    RX1_Cnt = 0;   //避免溢出处理}if(TI){TI = 0;B_TX1_Busy = 0;        //清除发送忙标志}
}

  • 无符号整型数值0按位取反就是:65535;逻辑取反值:1

单片机逻辑取反和按位取反差异相关推荐

  1. Verilog逻辑取反与按位取反

    Verilog中逻辑取反(取非)用 !,按位取反用~. 取非 ! 表示运算结果只有0(假)与1(真)两种情况: 取反~表示二进制数按位取反. 例如对in=1101分别进行逻辑取反与按位取反: assi ...

  2. !和~的区别(逻辑取反和按位取反)

    在c语言中,!和~均表示取反,这两个的区别在于: ! :代表逻辑取反,即:把非0的数值变为0,0变为1; ~ :表示按位取反,即在数值的二进制表示方式上,将0变为1,将1变为0: 上述其实可以从jav ...

  3. python逻辑取反的实现

    说明 True和False被逻辑取反时要使用not.not是逻辑取反,而~是按位取反. True和False相对应的值为1和0,~True相当于1按位取反,结果为-2,not True的结果为Fals ...

  4. Python实现逻辑取反

    c++中的逻辑取反为! Python用 not 实现逻辑取反 while(not 1):print("进入") print("结束")#结果为: # 结束

  5. python逻辑取反运算符_python学习笔记------逻辑运算符

    条件: 条件可以是:笔记运算符 , 显示布尔值,隐式布尔值 隐式布尔值:大部分都是真,只有0,none,空(字符串,列表等)为假False 逻辑运算符 not:就是把紧跟其后的那个条件,结果取反 pr ...

  6. java实现js取反_特定位取反(js实现)

    去华为面试的时候,没有做好准备工作:面试的流程没有问清也没有查,结果一过去就让上机做题,着实有点措手不及.笔者是擅长前端的Java Web工程师啊,基本的底层编程知识早已生疏了.机试题碰到了这道位运算 ...

  7. c# 整数取反_按位取反运算符的使用

    按位取反运算符的使用 按位取反运算符是按照二进制的每一位取反,比如byte类型,~0的结果就是255. 该功能可以在mask中做一些反转操作 如下代码,a存放了2,4,8三个值.用按位取反'~'运算符 ...

  8. 取反!和按位取反~的区别

    http://blog.csdn.net/pipisorry/article/details/36517411 按位取反"~":按位取反1变0,0变1 逻辑非"!&quo ...

  9. 单片机c语言中io取反,单片机小白学步(21) IO口:基本的LED和按键操作

    原标题:单片机小白学步(21) IO口:基本的LED和按键操作 本篇我们先介绍最基础的几个IO口操作.学完本篇,大家要能自己独立完成下面几个实验. 1.点亮 2.一个按键控制LED,按下灯亮,释放灯灭 ...

最新文章

  1. Python Beautiful Soup类的基本元素
  2. matlab的基础使用
  3. QT乱码总结6.编码测试和总结一
  4. 数据库连接失败报错com.mysql.cj.jdbc.exceptions.CommunicationsException
  5. keras笔记(3)-猫狗数据集上的训练以及单张图片多张图片的测试
  6. 让 API 端点的响应速度提高 50 倍!
  7. python os path dirname_python中的os.path.dirname(__file__)的使用
  8. 并行程序调试、测试与模型检测
  9. 微信点餐系统感悟(上1-6章)
  10. Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)
  11. C# Xamarin For Android移动开发基础实战演练
  12. snmp安装及自定义mib
  13. 正确理解三极管的放大区、饱和区、截止区
  14. CSS 字体大小 font-size属性
  15. java中override快捷键_Java高级应用简笔
  16. 微信开挂怎么防止封号_越狱过的手机怎样避免外挂微信被封
  17. [UNR #6]稳健型选手
  18. 散热性能测试软件,性能测试及散热表现
  19. CSS基础(14)- 更多的样式
  20. hive server2源码地址在哪_实战搭建Thinkphp二次开发威客RW平台源码粉丝关注投票发布系统...

热门文章

  1. 关于浏览器以及各种内置浏览器造成黑屏的解决办法
  2. java验证码图片滑动验证码_图片滑动验证码的生成
  3. OPPO reno9,reno8,reno7,reno系列安装Play商店,安装服务框架谷歌Google
  4. 金仓数据库字段_技术干货 | 超实用!详解人大金仓MPP数据库并行查询技术
  5. 数据科学家之路 - 个人学习历程和入门规划
  6. java 格式化日期 注解_详解Java关于时间格式化的方法
  7. springcloud+zipkin实现链路监控搭建zipkin-server(五)
  8. android点击按钮打开wifi或者关闭wifi
  9. java 系统资源不足_atn 编译java提示资源不足
  10. 爱站和站长之家的SEO综合查询书签工具