为什么单片机上流水灯的编程定义用char型不用int型

如题所述

呵呵,这么简单的一个问题,回答居然五花八门……。那我也来凑凑热闹吧。
首先,并不确定你的定义是指什么定义,不过应该是指“显示寄存器”的定义吧,以后提问最好能把你的代码贴出来,这样更方便网友的解答。
现在假设你指的就是“显示寄存器”的定义。那可以明确的说,这里考虑的就是内存占用。这里一楼的说法差不多正确,不过int的占用的字节数要与你所用的单片机相关,51单片机int是占用2个字节,也就是16位,其它单片机则不一定。
我这里主要是想谈谈三楼说的那几点。单片机的“显示寄存器”的定义的确一般常用“usingned char”,但这并不代表char不能用。有无符号数主要体现在计数过程中的取值范围有所不同,而流水灯这种程序并没有涉及到这一方面。
还有int类型也是同样的道理。就以51为例,int是16位的数据照样可以传递给8位的P口!只不过高8位自动丢掉了而已!
最后,楼主可能也是单片机初学者吧。像这种简单的问题,你完全可以自己调调,把类型改改自己看看结果不是更好?学单片机不动手是不行的。现附上自己刚刚写的一段程序,你可以自己调调。“显示寄存器”就用的int类型。(当然并不推荐这么定义)

#include<reg52.h>
void delay(int x) //延时函数
{
for(;x>0;x--);
}
void main()
{
int n ; //显示寄存器(不知道你说的定义是否指这里)
char i; //循环数
while(1)
{
n = 0xfe;
for(i=8;i>0;i--)
{
P1 = n; //将显示寄存器输出到LED端口
n = (n<<1)+1; //将显示寄存器数据左移1位,并将第一位置高,即熄灭
delay(6000); //延时
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-09
先指出提问者的错误:

单片机上流水灯的编程定义用usingned char型而不是char型。前者是无符号字符型,后者是有符号的!如果你看到uchar这样的定义,那就是实现#define uchar usingned char过了,所以uchar就是 usingned char。char 和usingned char都是一个字节,是八位,跟单片机的P口一样,所以用这个。
再说一楼回答的错误:int在单片机里是两个字节而不是4个字节,(51里是这样,别的不一定)。所以用int定义的变量控制流水灯,而流水灯是P口控制的,16位的数据怎么传递给8位的P口呀!所以不是占用内存的问题,而是数据格式不对无法用。
第2个回答  2010-10-09
char 和 int 最大的区别是占用内存大小不同
char 占用一个字节 也就是8位
int 占用四个字节
如果你的程序用不到长度那么大的变量,就用占用内存小的变量,势必单片机的ram是有限的,开辟的空间越小,运行速度就越快!本回答被网友采纳
第3个回答  2010-10-09
char 和 int 最大的区别是占用内存大小不同
char 占用一个字节 也就是8位
int 占用2个字节,也就是16位(楼下说法有误)

单片机中unsigned char 和unsigned int的区别,做流水灯实验,延时函数问 ...
j的最大值只有255,所以永远不会满足j<1827的条件,当然就一直循环不结束了。

单片机C语言,想做流水灯确一个接一个亮了,看了很多遍觉得代码没错,求解...
int定义了一个16位的数据,你连的是8个灯,所以应该把a定义为unsigned char型,8位数据

单片机我想做个流水灯,这是我写的代码。为什么结果是只有P1的第一个灯...
1,char定义的变量在单片机c语言里可能被认为是带符号数据,所以你可以将char a改为 unsigned char a试试;2,_crol_(a,1);这个函数并不能改变a的值,将其改为a =_crol_(a,1);试试。拙见供参考。

...求问大神他为什么把16进制数定义成unsign char #include
你把十六进制和16bit(16位)的概念搞混了。同一个数字,可以用10进制表示、也可以用16进制表示,当然二进制、8进制等都可以,甚至你自己造个12进制都没问题。比如你给一个变量a赋值为0xfe,a=0xfe,这个效果与下面这2种完全一样,看准了,是完全完全完全一样!!对单片机来说没有任何影响:一、...

在单片机流水灯程序中一定要用u16代表unsignedint吗
在单片机流水灯程序中,使用 `u16` 来代表 `unsigned int` 是为了方便后面定义多个变量。然而,这并不是强制的。

单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)
单片机流水灯C语言程序的源代码如下:include \/\/51系列单片机定义文件 define uchar unsigned char \/\/定义无符号字符 define uint unsigned int \/\/定义无符号整数 void delay(uint); \/\/声明延时函数 void main(void){ uint i;uchar temp;while(1){ temp=0x01;for(i=0;i<8;i++) \/\/8个流水灯...

单片机流水灯?
先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动(延时0.1s)include< reg52.h> include< intrins.h>\/\/头文件 define uint unsigned int define uchar unsigned char\/\/声明用unit代替unsigned int,下个同理 void delay();void main(){ uchar temp,...

这个单片机c编程有问题吗(流水灯)
问题倒是没有,我估计就是 LZ 看到 的现象不符合他的想法,流水灯太快,甚至是 全亮了。假设 LZ 晶振是 12MHz的,那么机械周期(T)就为1us;由于不同编译器对 for 循环的汇编转换不尽相同,导致执行周期也不同,那么我们设想其中的一种,先进行一个初始化赋值,耗时 2T;再进行 n次判断(DJNZ...

怎么用单片机做出8个LED同时亮,但亮度不同的流水灯?
超过十几毫秒就不行了。然后再间隔相同的时间一次性把灯全关了,再间隔几十微秒回到上面的状态依次点亮灯。……一直这样循环。这样的话因为人的视力有一定的滞回效果,只要间隔时间不大,你就能看到八个灯不是闪的,而是同时亮,但亮度又不一样。 这是单片机设计中,PWM控制的思路。

编流水灯时如果把次数n定义成unsigned char,编译时没有显示错误和警告但...
...虽然在单片机编程方面在下也是新手,前不久才搞过这个流水灯实验。不过我的代码好像和你的有些不同,没有用到for函数...不过纯粹从c语言的角度来说,你的问题很明显。char是字符型变量,怎么可以n=0;n<7;n++呢?字符型和整型没法比较啊。

相似回答