分析一段c语言写的单片机程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; //0000 0001,0000 0011,0000 0111等等
//void delay(uint z);
void main()
{
while(1)
{
uint x;
for(x=0;x<8;x++)
P0=tab[x];
//delay(100);
}
}
请认真看以下文字:
1.本程序能通过Keil编译,并在Proteus仿真完成;
2.程序中的第一个注释是为了方便阅读程序的同志们能更快理解此程序,不难分析,此程序想要得到的结果就是八个二极管一排暗过去(就是一个接一个灭掉,采用共阳接法);
3.第二和第三个注释因为在加入其编译的时候会出现警告,所以没加进去;
4.此程序在Proteus仿真的时候出现混乱,就是不像预期想的一样,一排暗过去,而是毫无规则的亮灭挑动。

提问:
1.为什么此程序会不按规则的一排暗掉?(按原来的设计是随着十六进制数组一个接一个的暗掉的);
2.程序中的第二和第三个注释为delay延时用,为什么将此延时加入则出现警告?(而且加入后效果没变),delay这样用是错误的吗?

先不上分,因为好几个问题都被百度“吞”了,看我等级就知道我不会不给分,更不会不了了知。。。
如果有关于单片机C程序方面的资料或者设计等,都可以发送给我:ddessky@126.com

1、你的delay函数怎么没有定义啊?只是加了个声明而已啊。比如你可采用下面的延时1S函数(我这个没有实参,不过没关系):
void delay1s()
{
unsigned char i,j,k;
for(i=100;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
2、你说你想实现那样的功能,但你忽略了一点,在刚开始时所有的灯应是亮着的,对吧?所以你得先赋初值,如P0=0x00;然后延时下delay1s(); ,再紧接着for循环。
3、for循环中有个错误,应该这样:
for(x=0;x<8;x++)
{ P0=tab[x];
delay1s();
}至于为什么,这更多的是你C语言的知识了。
4、最后一点,得强调下,不是错误,但不建议这样做。以后凡是值小于256的在单片机程序中一律用uchar 型,节省ROM空间。
资料已发!祝学习愉快!追问

(省略前四行)
uchar x;
void delay1s()
{
uchar i,j,k;
for(i=100;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main()
{
P0=0x00;
delay();
while(1)
{
for(x=0;x<8;x++)
P0=tab[x];
delay1s();
}
}

按你说的写出了如上程序,结果:8个一起闪。。。就是同时灭,同时亮。。。闪一次就没了,但是如果把P0=0x00; delay();放到while下面的话,就是一直闪,八个一起闪。。

追答

要放到下面。
你还是写错了呀,那个for循环后面的两条语句要用花括号括起来,你再看看我上面的写法。
你也可尝试放在上面,但花括号一定要加

追问

感谢,程序是调试出来了,就是有两个小问题:
1.我试着把void delay1s()下的i,j,k改成a,b,c,却不能用了,麻烦说一下是什么原因呢?
2.100*20*248=496000,这样算时间应该是错的,但是我想知道三个嵌套的for合成1S的时间是怎么得到的?是如何算出来的?

追答

1、不会吧?你确定没写错?
2、以后你记住,每一个for语句占两个机器周期,在单片机振荡频率选为12MHZ时,每个机器周期为1us.在delay1s延时中,循环次数为a=100*20*248,则时间为a*2/1000000,约等于1S

追问

1.应该没有写错,但你这么说,我可以确定是可以用任何变量了。
2-1.牢牢记住了,谢谢您。
2-2.100*20*248=496000;496000*2=992000,就是0.992S;我要问的是,为什么不用100*20*250,这样得到的是500,000,乘以2就刚好是1S。

追答

1、是的,只要起的名字不要和头文件中定义的名字一样就行了。而且 尽量做到“见名知义”,这是一种好的编程习惯
2、这个可以这样理解:上面所说的两个机器周期、1us也是大概数,或许是两个多一点点周期呢,那此时用248就更接近实际的1S了。以后,想改变延时时间也很简单,只需改某一循环的次数就行了,基本上成比例
3、不用那么尊敬,我都不习惯了,我猜我俩年龄也差不多

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-30
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; //0000 0001,0000 0011,0000 0111等等
void delay(uint z)
{
while(z--);
}
void main()
{
while(1)
{
uint x;
for(x=0;x<8;x++)
P0=tab[x];
delay(65535);
}
}
试试
第2个回答  2011-05-29
8个灯一起闪,估计是延时太短的原因吧 试试把延时时间改长一点
相似回答
大家正在搜