求STC89C52单片机运算及共阴4位八段数码管显示运算结果的C语言程序,一定是用C编程的,高手帮帮忙!

说明:由外部中断0【跳变沿产生】,单片机开始计时,再有外部中断1【跳变沿产生】,单片机停止计时,最终得到时间值【大约在5秒以内的时间,也可能更长】,再由固定的一个值L【可以是1米、1分米等】,L除以这个由两次外部中断得到的时间值T,即L/T得到最终的结果,也就是速度值,最终这个速度值要显示到共阴四位八段数码管上,即XXX.X,如350.1或者002.2。【小数点固定在三位和四位之间】
编程环境keil C51,发到邮箱也可以[email protected],真是急用! 希望高手能写下程序注释,最好程序是完整的!谢谢~~~

/*
这个程序我编了一个上午,希望能对你有用。
运行时按下INT0开始计时,再按下INT1得到速度
由于我只有公阳极数码管,(因为要调试)P2为片选端因为我加了三极管,所以也是低电平有效,你是共阴极,片选端可以直接连P2上,
你自己把数字取反再调试看看
速度的单位是厘米每秒,定义的L是1米,由于用浮点数表示速度在显示部分会麻烦一点,所以就偷了下懒用的整数表示的,由于最终速度
显示到数码管上要加一个小数点,所以实际上程序中的V是以毫米每秒为单位,显示到数码管上缩小了10倍
*/
#include <reg52.h>

code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管 0-9 共阴极你要取反

unsigned char Dis_Baiwei=0xc0;//定义百位
unsigned char Dis_Shiwei=0xc0;//定义十位
unsigned char Dis_Gewei=0xc0; //定义个位
unsigned char Dis_ShiFwei=0xc0; //定义十分位
unsigned char second,msecond;

unsigned long L=100000; //1米,以0.01mm为单位
unsigned int v; //速度
unsigned int t; //时间以0.01秒为单位

void CLR(void);
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
EX0=1;//外部中断0设置
IT0=1;//边沿触发

EX1=1;//外部中断1设置
IT1=1;

TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
ET0=1; //打开中断
TR0=0;

EA=1;
second=0;
msecond=0;
while(1)
{
P0=Dis_Baiwei;//显示第一位
P2=0xf7;
delay(300);//短暂延时
P0=Dis_Shiwei; //显示第二位
P2=0xfb;
delay(300);
P0=Dis_Gewei;//显示第三位
P2=0xfd;
delay(300);//短暂延时
P0=Dis_ShiFwei; //显示第四位
P2=0xfe;
delay(300);
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{

TH0=0xd8;//重新赋值
TL0=0xf0;
msecond++;
if (msecond==100)
{
msecond=0;
second++;//秒加1
if(second==200)
second=0;

}
Dis_Baiwei=tab[second/10];//十位显示值处理
Dis_Shiwei=tab[second%10]&0x7f; //个位显示处理,如果是共阴极就是0X80
Dis_Gewei=tab[msecond/10];//十位显示值处理
Dis_ShiFwei=tab[msecond%10]; //个位显示处理

}
void ISR_INT0(void) interrupt 0 using 1
{
TH0=0xd8;//重新赋值
TL0=0xf0;
second=0; //利用外部中断清零
msecond=0;
Dis_Baiwei=0xc0;
Dis_Shiwei=0xc0;
Dis_Gewei=0xc0;
Dis_ShiFwei=0xc0;
TR0=1;
}
void ISR_INT1(void) interrupt 2 using 1
{
TR0=0; //利用外部中断关闭定时器0
t=second*100+msecond;//0.01秒为单位
if(t>10) //最大速度为999.9
v=L/t;
else
v=9999;
Dis_Baiwei=tab[(v/1000)];//百位显示值处理
Dis_Shiwei=tab[((v%1000)/100)];//十位显示值处理
Dis_Gewei=tab[((v%100)/10)]&0x7f; //个位及小数点显示处理如果是共阴极就是0X80
Dis_ShiFwei=tab[(v%10)];//十分位显示值处理

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-02-13
运行时按下INT0开始计时,再按下INT1得到速度
由于我只有公阳极数码管,(因为要调试)P2为片选端因为我加了三极管,所以也是低电平有效,你是共阴极,片选端可以直接连P2上,
你自己把数字取反再调试看看
速度的单位是厘米每秒,定义的L是1米,由于用浮点数表示速度在显示部分会麻烦一点,所以就偷了下懒用的整数表示的,由于最终速度
显示到数码管上要加一个小数点,所以实际上程序中的V是以毫米每秒为单位,显示到数码管上缩小了10倍
*/
#include <reg52.h>

code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管 0-9 共阴极你要取反

unsigned char Dis_Baiwei=0xc0;//定义百位
unsigned char Dis_Shiwei=0xc0;//定义十位
unsigned char Dis_Gewei=0xc0; //定义个位
unsigned char Dis_ShiFwei=0xc0; //定义十分位
unsigned char second,msecond;

unsigned long L=100000; //1米,以0.01mm为单位
unsigned int v; //速度
unsigned int t; //时间以0.01秒为单位

void CLR(void);
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
EX0=1;//外部中断0设置
IT0=1;//边沿触发

EX1=1;//外部中断1设置
IT1=1;

TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
ET0=1; //打开中断
TR0=0;

EA=1;
second=0;
msecond=0;
while(1)
{
P0=Dis_Baiwei;//显示第一位
P2=0xf7;
delay(300);//短暂延时
P0=Dis_Shiwei; //显示第二位
P2=0xfb;
delay(300);
P0=Dis_Gewei;//显示第三位
P2=0xfd;
delay(300);//短暂延时
P0=Dis_ShiFwei; //显示第四位
P2=0xfe;
delay(300);
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{

TH0=0xd8;//重新赋值
TL0=0xf0;
msecond++;
if (msecond==100)
{
msecond=0;
second++;//秒加1
if(second==200)
second=0;

}
Dis_Baiwei=tab[second/10];//十位显示值处理
Dis_Shiwei=tab[second%10]&0x7f; //个位显示处理,如果是共阴极就是0X80
Dis_Gewei=tab[msecond/10];//十位显示值处理
Dis_ShiFwei=tab[msecond%10]; //个位显示处理

}
void ISR_INT0(void) interrupt 0 using 1
{
TH0=0xd8;//重新赋值
TL0=0xf0;
second=0; //利用外部中断清零
msecond=0;
Dis_Baiwei=0xc0;
Dis_Shiwei=0xc0;
Dis_Gewei=0xc0;
Dis_ShiFwei=0xc0;
TR0=1;
}
void ISR_INT1(void) interrupt 2 using 1
{
TR0=0; //利用外部中断关闭定时器0
t=second*100+msecond;//0.01秒为单位
if(t>10) //最大速度为999.9
v=L/t;
else
v=9999;
Dis_Baiwei=tab[(v/1000)];//百位显示值处理
Dis_Shiwei=tab[((v%1000)/100)];//十位显示值处理
Dis_Gewei=tab[((v%100)/10)]&0x7f; //个位及小数点显示处理如果是共阴极就是0X80
Dis_ShiFwei=tab[(v%10)];//十分位显示值处理

}
第2个回答  2016-02-03
运算什么?共阴4位八段数码管接哪?