单片机C51源程序。谁能看懂的吗?帮我分析一下,明天就要交报告啦。谢谢!

void display() //显示函数
{
u8 i;
for(i=0;i<6;i++)
{
P2=wela[i];
P0=dula[disbuff[i]];
delay(3);
}
}
void Change() //转换函数
{
disbuff[0]=FerTmp/100000;
disbuff[1]=(FerTmp%100000)/10000;
disbuff[2]=(FerTmp%10000)/1000;
disbuff[3]=(FerTmp%1000)/100;
disbuff[4]=(FerTmp%100)/10;
disbuff[5]=(FerTmp%100)%10;
}
void delay(u16 z) //延时函数,
{
u16 x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果通过6位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。

void display() //显示函数
{
u8 i;
for(i=0;i<6;i++)
{
P2=wela[i];//选择哪个数码管有效
P0=dula[disbuff[i]];//数码管显示的数字
delay(3);
}
}
void Change() //转换函数
{
disbuff[0]=FerTmp/100000;//提取fertmp的十万位的数字
disbuff[1]=(FerTmp%100000)/10000;//提取fertmp的万位的数字
disbuff[2]=(FerTmp%10000)/1000;//千位
disbuff[3]=(FerTmp%1000)/100;//百位
disbuff[4]=(FerTmp%100)/10;//十位
disbuff[5]=(FerTmp%100)%10; //个位
}
void delay(u16 z) //延时函数,
{
u16 x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}追问

延时函数的具体作用是给哪部分延时的?

追答

这里是给数码管显示时延时

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-19
就3个子函数?。。。display函数式显示,u8是unsigned char?for循环内是一次动态扫描,P0接段码,P2接位码。
Change函数中,FerTmp为频率的变量名,测的频率范围不是0-250KHZ吗?这就刚好6位,FerTmp/100000得出第十万位(即第6位)并存放在disbuff数组的个,

(FerTmp%100000)/10000中FerTmp%100000为FerTmp/100000的余数,即后5位。
(FerTmp%100000)/10000就是万位的数(即第5位)。。。以此类推。打个比方吧:假如测得频率为123456HZ,那么FerTmp=123456,FerTmp/100000=1即disbuff[0]=1。

(FerTmp%100000)/10000=2,即disbuff[1]=2。。。最后disbuff数组中的数为disbuff[]={1,2,3,4,5,6}。
第3个为delay函数用于延时,u16应该是unsigned int的宏定义吧,空执行for循环,只是为了延时,就是执行汇编中的NOP,至于对少次循环就根据变量z来决定了。
第2个回答  2013-06-19
本来想一句一句解释的,但是后来感觉没有必要。你的这段程序应该只是一部分,因为你连主函数都没有。
首先,这段程序分三部分,显示函数、转换函数、延时函数。
显示部分,每次对P0口赋段码值,对应显示的每段LED;对P2赋位码值,对应6位数码管中的一位,然后延时一段时间,显示下一个数据。

转换部分是分别取FerTmp的百万位,十万位,万位,千位,百位,个位,然后存到disbuff【】数组中,供显示部分调取。

延时部分是对y=125每次-1,以此来消耗时间,达到延时的目的。
第3个回答  2013-06-19
显示函数的话一个是段选,一个是位选,用的是动态显示吧,转换函数就是把一个的各个位提取出来,然后送到显示缓存区,延时更简单了,就是循环
相似回答