单片机编程问题。实验是数码管从1~9显示完后蜂鸣器一直响。我是初学者虚心求教。

1#include<reg52.h>
2#define uc unsigned char
3#define ui unsigned int
4sbit fmq=P3^6;
5void delay500us() //500us延时函数
6{
7uc j;
8for(j=0;j<56;j++)
9{
10}

11}
12void beep() //蜂鸣器产生1Khz的声音
13{
14fmq=0;
15delay500us();
16fmq=1;
17delay500us();

18}
19uc code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
20void delay1ms(ui i) //一毫秒延时程序
21{
22uc j;
23while(i--)
24 {
25 for(j=0;j<113;j++)
26 {
27 }
28 }
29}
30void main()
31{
32uc i;
i=1;
33while(i<2)
34 {
35 P2=0x7f;
36 for(i=0;i<10;i++)
37 {
38 P0=s8[i];
39 delay1ms(500);
40 i=i++;
41 }

42 }
43while(1)
44{
45ui i;
46for(i=0;i<1000;i++)
47{
48beep();
49}
50fmq=0;
51delay1ms(1000);
52}
53}
一、我想问下每次定义变量都能管到哪里?比如第7行定义uc j;第22行还用定义一遍吗?还是第7行的uc j;仅仅在500us这个延时函数中管用,后面函数要用还得再定义一遍?
二、20行定义了ui i 32行又把i定义成了uc i;二者不矛盾吗?
三、while循环中可以再嵌套一个while循环吗?就是同名的循环可以嵌套吗?可以无限嵌套吗?
四、40行语句有错误吗?能直接写成i++;吗?
五、32行下面不写i=1;程序也能正常运行,为什么?
六、32行定义了uc i;33行和36行中的i的定义都来自32行的吗?如果是同一个i,33行>=2就跳出while了,而36行中i>=10才会结束for,这二者之间又有矛盾吗?

一二、这两个问题,其实是一个问题,建议你看下C语言书,关于C语言的变量定义作用范围和函数内变量的相关内容,树上的讲的很详细,谭浩强的那本C语言,第7行和第22行变量所在两个子函数内,不会发生冲突,每个子函数内的变量都是相对独立的,放在各自的存储区内,子函数内变量随函数创建而创建,等函数结束时自动释放占用的空间。
三、C语言中的循环可以嵌套循环,不管任何形式的,无限嵌套在语法上是没有错得,但在实际运行会出现很严重问题,会导致系统死机崩溃,程序永远死在那,出不来。
四、没错,可以写成i++,而且推荐;
五、因为i=1只是你赋的初值,没有这句默认为0,而且最主要的是i已经在下面的循环体内被赋了初值,即for(i=0;i<10;i++);
六、函数内变量只需定义一次即可,main()函数内的i都来自32行的定义,之所以出现你的现象,是因为,当i=1时,满足条件进入while(i<2)体,接着进入for(i=0;i<10;i++)体,一旦进入for循环体就要开始在这个字循环体循环,直到不满足条件i<10,才能退出该for循环体,退出for时,for已经运行了十次了,此时i=10,然后再第二次判断while(i<2)是否满足,不满足也退出,继续运行下面的程序。

你问的这几个问题书上都有介绍,这些是C语言基本的语法知识,把C语言书好好看看吧……追问

想问下如果只用到这个程序里的知识,能不能再给四位数码管编一个从0~9999现实的程序?

追答

可以,最简单的办法就是再加三个独立的数码管,分别赋值,就可以显示了,但通常都是采用动态显示的方法,减少IO口的使用,这个在硬件上要加器件

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-23
一、这里的变量定义都是局部变量,只在函数内部作用。第7行定义uc j只在5void delay500us() //500us延时函数中作用。第22行定义uc j只在20void delay1ms(ui i) //一毫秒延时程序中作用。在函数内部定义的变量,函数执行完毕后变量就释放了。
二、同第1个问题,在两个函数中。20行在20void delay1ms这个函数中,32行在main()函数中。
三、可以嵌套,就像for循环可以再嵌套一个for循环一样。
四、单考虑语句来讲应该是没问题的。但是40行语句导致每一个for循环i自加两次。实际for循环是5次。分别显示s8[0]、s8[2]、s8[4]、s8[6]、s8[8]。
五、因为如果定义变量值时不赋值的话就一般初始化变量为0,i<2程序当然可以运行了。
六、因为32行、33行、36行都在main()函数中,所以都来自32行,是同一个i,在33行时i=1,这是在32行就赋值的,所以(33行>=2)不成立,while循环可以执行。36行还在for循环中,一直没跳出来。两者不矛盾。
相似回答