哪位高手帮我翻译一下这个单片机的c语言程序:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit SPK=P3^7;
sbit key1=P1^0;
sbit key2=P1^1;
uchar n,a,b;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}void scan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
n++;
if(n==100)
n=0;
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
n=0;
}
}
}
void display()
{
a=n%10;//个位
b=n/10;//十位
P2=0xfe;//11111110
P0=~tab[b];
delay(5);
P2=0xfd;//11111101
P0=~tab[a];
delay(5);
}
void alarm(uchar t)
{
uchar i,j;
for(i=0;i<200;i++)
{
SPK=~SPK;
for(j=0;j<t;j++);
}
}
void main()
{
while(1)
{
scan();
display();
if((a==0)&&(b!=0))
{
alarm(30);
alarm(50);

}
}

}

第1个回答  2013-05-03
#include<reg52.h>
#包括<reg52H>。
#define uchar unsigned char
#定义使用无符号字符
#define uint unsigned int
#定义的无符号整型
uchar code tab[]={
使用代码表[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
0x3F,0x06,0x5b,0x4f,0x66,0x6d,7d,0x07,0x7f,0x6f};
sbit SPK=P3^7;
SBITSPK=P3^7;
sbit key1=P1^0;
SBITKEY1=P1^0;
sbit key2=P1^1;
SBITKEY2=P1^1;
uchar n,a,b;
使用N,A,B;
void delay(uchar z)
延时(使用Z)
{
{
uchar x,y;
使用X,Y;
for(x=z;x>0;x--)
对(X =Z;x >0;X——)
for(y=110;y>0;y--);
对于(Y =110;y >0;y——);
}void scan()
}无效scan()
{
{
if(key1==0)
如果(Key1==0)
{
{
delay(5);
延迟(5);
if(key1==0)
如果(Key1==0)
{
{
while(!key1);
什么时候。KEY1);
n++;
n+ +;
if(n==100)
如果(N==100)
n=0;
N =0;
}
}
}
}
if(key2==0)
如果(KEY2==0)
{
{
delay(5);
延迟(5);
if(key2==0)
如果(KEY2==0)
{
{
while(!key2);
什么时候。Key2);
n=0;
N =0;
}
}
}
}
}
}
void display()
无效的display()
{
{
a=n%10;//个位
=N/个位占10;
b=n/10;//十位
B=N/ 10//十位;
P2=0xfe;//11111110
P2=0XFE;// 11111110
P0=~tab[b];
P0=~选项卡[B];
delay(5);
延迟(5);
P2=0xfd;//11111101
P2=0xfd;// 11111101
P0=~tab[a];
P0=~选项卡[一];
delay(5);
延迟(5);
}
}
void alarm(uchar t)
闹钟(使用T)
{
{
uchar i,j;
使用我,J;
for(i=0;i<200;i++)
对(我=0;i <200;i++)
{
{
SPK=~SPK;
SPK=~SPK;
for(j=0;j<t;j++);
对于(J=0;j<t;j++);
}
}
}
}
void main()
无效的main()
{
{
while(1)
什么时候?1。
{
{
scan();
scan();
display();
display();
if((a==0)&&(b!=0))
如果((a=0)和(B!0。
{
{
alarm(30);
报警(30);
alarm(50);
报警(50);
第2个回答  2013-05-03
小意思,全看懂了
两个按键两个数码管, Key1按一次数码管数值加1, 到100时清零, key2清零数码管显示值
当显示值为10的倍数(除0外)时,蜂鸣器以两种频率声音响一次
不知道你哪里不懂,先这样简单回答一下, 打字也不太方便追问

while(!key1);

n++;

if(n==100)

n=0;
您能不能详细解释一下这句。还有就是为什么最后会是“
alarm(30);
alarm(50);

”,单独写一个“alarm”不行吗?谢谢了,我刚刚开始学习,还是菜鸟。

追答

按键按下后总会有抬起的时刻, 按下去时key1引脚电平为低电平, 那么“while(!KEY1);”,所产生的效果就是如果键一直按着不放,那么程序就一直在执行while(!KEY1)后面的那么分号,相当于空语句,只有当按键松开后,才会退出while造成的死循环,程序继续往下执行
下面紧接着的一句是n++; 也就是说,每次按键松开的时候都会执行这句,产生的效果就是每次按键松开时,变量n就会增加1
下面两句很容易理解,当n加到100的时候清零,n会从零开始重新计数
alarm()是一个子函数,完成的功能是产生一个频率取决于括号中数字的声音,可以简单地这么理解,第一句就是播放频率为30HZ的声音,播放完成到第二句,再播放频率为50HZ的声音
这个地方用到的是子程序调用,括号中的数据是alarm函数的调入参数,叫实参
初学单片机C语言,需要了解的就是那几个关键字,子函数使用方法

追问

"P2=0xfe"点亮的是个位还是十位。delay(5)是指延时5ms,可是为什么要延时5ms?“P0=~tab[b]”这句具体应该怎么理解?直接写这两句“
scan();
display();
”什么意思,有什么作用,为什么括号里什么也没有?

追答

看来你的基础真的挺差的,看看书吧,基础知识都在书上呢
P2和P0口控制的是一个两位一体数码管,从段码中可以看出是共阴极,拿数字1的段码来说,段码是0x06,换成二进制是0b00000110,里面有两个1,而1显示时就是有两个段发光,所以应该是共阴极,但是程序中发段码时先按位取反了,P0=~tab[a]就是将段码按位取反,那么1的段码就成了0b11111001,里面有两个0,所以可以确定所用数码管是两位一体共阳极。
共阳数码管有八根段线,接在P0口上,两个阳极公共端被P2.0和P2.1控制着,tab[b]是十位的段码,所以P2=0xfe时点亮的就是十位,当P2=0xfd时点亮的就是个位了,电路中用低电平选通某个数码管,而数码管又是共阳极,所以P2口控制的是两个PNP的三极管,当基极为低电平时,发射极有电压输出。
两位一体数码管要想正常显示,需要用动态扫描的方式,就是先让第一个数码管显示,然后再让第二个数码管显示,每个数码管都显示短暂的时间,轮流交替,由于人眼的视觉暂留,人分辨不出灯的闪烁,就会看到两个数码管同时显示的现象,延时就是提供每个数码管的显示时间。
这段程序一直在执行Scan()和Display(),scan()程序就是不停地查询有没有键按下,如果有就改变变量n, 程序一直在执行这两个程序,产生的效果就是程序可以随时响应按键事件,和显示数字,让人感觉不到等待时间和数码管的闪烁。
子程序调用一般有四种:
1. 有调入参数
alarm(30); 就是这种
2. 有返回值
3. 有调入参数也有返回值
4. 没有调入参数,也没有返回值
Display(); 就是这种类型,因为这个显示程序需要使用的数据已被定义成全局变量,就是那个n,自然也就不用再调入了
Scan(); 也是,扫描按键后修改全局变量n,也用不着返回数据和调入数据
这些东西书上都会有,真的需要多看看书。

本回答被提问者采纳
第3个回答  2013-05-05
while(!key) //按键弹起时n++;
alarm(30)
alarm(50) //这个传不同的参数数 频率不一样,声音有区别
相似回答