打印
[51单片机]

Keil C51的几个注记

[复制链接]
2172|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 wgtwgtwgt 于 2024-4-18 18:18 编辑

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

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

#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define TIME 1000

void delay_ms(unsigned int n)
{
                unsigned int i, j;
                for(i = n; i > 0; i--)
                                for(j = 114; j > 0; j--);
}

void main(void)
{
                char c = 0xff;
                SCON = 0x52;
                TMOD = 0x20;
                TH1  = 0xfd;
                TL1  = 0xfd;
                TR1  = 1;
               
                while(1)
                {
                                printf("%bd\n", c==0xff);
                                delay_ms(TIME);
                }
}


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

void delay_ms(unsigned int n)
{
                unsigned int i, j;
                for(i = n; i > 0; i--)
                                for(j = 114; j > 0; j--);
}

void main(void)
{
                unsigned char c = 0xff;//改动在这里
                SCON = 0x52;
                TMOD = 0x20;
                TH1  = 0xfd;
                TL1  = 0xfd;
                TR1  = 1;
               
                while(1)
                {
                                printf("%bd\n", c==0xff);
                                delay_ms(TIME);
                }
}
或者:
2.强制表达式c == 0xff中的0xff为char类型。
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#define TIME 1000

void delay_ms(unsigned int n)
{
                unsigned int i, j;
                for(i = n; i > 0; i--)
                                for(j = 114; j > 0; j--);
}

void main(void)
{
                char c = 0xff;
                SCON = 0x52;
                TMOD = 0x20;
                TH1  = 0xfd;
                TL1  = 0xfd;
                TR1  = 1;
               
                while(1)
                {
                                printf("%bd\n", c==(char)0xff);//改动在这里
                                delay_ms(TIME);
                }
}




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

void delay_ms(unsigned int n)
{
                unsigned int i, j;
                for(i = n; i > 0; i--)
                                for(j = 114; j > 0; j--);
}

void main(void)
{
                char c = -3;
                int i = -5;
                long l = -9;
                SCON = 0x52;
                TMOD = 0x20;
                TH1  = 0xfd;
                TL1  = 0xfd;
                TR1  = 1;
               
                while(1)
                {
                                printf("%bd\n", c);
                                printf("%hd\n", i);
                                printf("%ld\n", l);
                                delay_ms(TIME);
                }
}


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

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

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

191

帖子

3

粉丝