[51单片机] Keil C51的几个注记

[复制链接]
2644|0
 楼主| wgtwgtwgt 发表于 2024-4-18 17:52 | 显示全部楼层 |阅读模式
本帖最后由 wgtwgtwgt 于 2024-4-18 18:18 编辑

在Keil C51中,char默认是有符号类型,即char等效于signed char。如果:
  1. char c = 0xff;

那么,用“==”判断c是否与0xff相等时,例如:
  1. c == 0xff
则表达式c == 0xff的值为0,而不是1。
测试代码:

  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #define TIME 1000

  5. void delay_ms(unsigned int n)
  6. {
  7.                 unsigned int i, j;
  8.                 for(i = n; i > 0; i--)
  9.                                 for(j = 114; j > 0; j--);
  10. }

  11. void main(void)
  12. {
  13.                 char c = 0xff;
  14.                 SCON = 0x52;
  15.                 TMOD = 0x20;
  16.                 TH1  = 0xfd;
  17.                 TL1  = 0xfd;
  18.                 TR1  = 1;
  19.                
  20.                 while(1)
  21.                 {
  22.                                 printf("%bd\n", c==0xff);
  23.                                 delay_ms(TIME);
  24.                 }
  25. }


解决方法:
1.将变量c的数据类型char改为unsigned char。代码:
  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #define TIME 1000

  5. void delay_ms(unsigned int n)
  6. {
  7.                 unsigned int i, j;
  8.                 for(i = n; i > 0; i--)
  9.                                 for(j = 114; j > 0; j--);
  10. }

  11. void main(void)
  12. {
  13.                 unsigned char c = 0xff;//改动在这里
  14.                 SCON = 0x52;
  15.                 TMOD = 0x20;
  16.                 TH1  = 0xfd;
  17.                 TL1  = 0xfd;
  18.                 TR1  = 1;
  19.                
  20.                 while(1)
  21.                 {
  22.                                 printf("%bd\n", c==0xff);
  23.                                 delay_ms(TIME);
  24.                 }
  25. }
或者:
2.强制表达式c == 0xff中的0xff为char类型。
  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #define TIME 1000

  5. void delay_ms(unsigned int n)
  6. {
  7.                 unsigned int i, j;
  8.                 for(i = n; i > 0; i--)
  9.                                 for(j = 114; j > 0; j--);
  10. }

  11. void main(void)
  12. {
  13.                 char c = 0xff;
  14.                 SCON = 0x52;
  15.                 TMOD = 0x20;
  16.                 TH1  = 0xfd;
  17.                 TL1  = 0xfd;
  18.                 TR1  = 1;
  19.                
  20.                 while(1)
  21.                 {
  22.                                 printf("%bd\n", c==(char)0xff);//改动在这里
  23.                                 delay_ms(TIME);
  24.                 }
  25. }




/***********************************************************************************************/
使用Keil C51的printf函数打印变量值时,若变量是一个字节存储的,例如char,则用%bd;若变量是两个字节存储的,例如int,则用%hd;若变量是四个字节存储的,例如long,则用%ld。测试代码:
  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #define TIME 1000

  5. void delay_ms(unsigned int n)
  6. {
  7.                 unsigned int i, j;
  8.                 for(i = n; i > 0; i--)
  9.                                 for(j = 114; j > 0; j--);
  10. }

  11. void main(void)
  12. {
  13.                 char c = -3;
  14.                 int i = -5;
  15.                 long l = -9;
  16.                 SCON = 0x52;
  17.                 TMOD = 0x20;
  18.                 TH1  = 0xfd;
  19.                 TL1  = 0xfd;
  20.                 TR1  = 1;
  21.                
  22.                 while(1)
  23.                 {
  24.                                 printf("%bd\n", c);
  25.                                 printf("%hd\n", i);
  26.                                 printf("%ld\n", l);
  27.                                 delay_ms(TIME);
  28.                 }
  29. }


/***********************************************************************************************/

Keil C51要求局部变量定义在函数的顶部,也就是在一个函数内,局部变量前面不能出现任何语句。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

191

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部