求STC89C52单片机运算及共阴4位八段数码管显示运算结果的C语言程序,一定是用C编程的,高手帮帮忙!
说明:由外部中断0【跳变沿产生】,单片机开始计时,再有外部中断1【跳变沿产生】,单片机停止计时,最终得到时间值【大约在5秒以内的时间,也可能更长】,再由固定的一个值L【可...
说明:由外部中断0【跳变沿产生】,单片机开始计时,再有外部中断1【跳变沿产生】,单片机停止计时,最终得到时间值【大约在5秒以内的时间,也可能更长】,再由固定的一个值L【可以是1米、1分米等】,L除以这个由两次外部中断得到的时间值T,即L/T得到最终的结果,也就是速度值,最终这个速度值要显示到共阴四位八段数码管上,即XXX.X,如350.1或者002.2。【小数点固定在三位和四位之间】
编程环境keil C51,发到邮箱也可以writermars@sina.com,真是急用! 希望高手能写下程序注释,最好程序是完整的!谢谢~~~ 展开
编程环境keil C51,发到邮箱也可以writermars@sina.com,真是急用! 希望高手能写下程序注释,最好程序是完整的!谢谢~~~ 展开
展开全部
/*
这个程序我编了一个上午,希望能对你有用。
运行时按下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)];//十分位显示值处理
}
这个程序我编了一个上午,希望能对你有用。
运行时按下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)];//十分位显示值处理
}
GamryRaman
2023-06-12 广告
2023-06-12 广告
N沟道耗尽型MOS管工作在恒流区时,g极与d极之间的电位有固定的大小关系。这是因为当MOS管工作在恒流区时,由于源极和漏极电压相等,G极电压(即源极电压)为0,而D极电压(即漏极电压)受栅极电压控制。由于G极电压为0,因此在恒流区时,D极电...
点击进入详情页
本回答由GamryRaman提供
展开全部
运行时按下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)];//十分位显示值处理
}
由于我只有公阳极数码管,(因为要调试)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)];//十分位显示值处理
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
运算什么?共阴4位八段数码管接哪?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询