c语言程序改频率,c语言编一个数字频率计 四位显示范围0-9.9khz 帮我改下

#include #defineSegment P2

#define sl P0

sbit addr0=P1^0; // 定义数据端口地址,000时16分频,100 分频

sbit addr1=P1^1;

sbit addr2=P1^2;

sbit clear=P1^3; //计数器清零

sbit ledM=P1^4; //档位led显示

sbit ledK=P1^5;

sbit ledB=P1^6;

unsigned char cnt; //定时1s计数

unsigned char d[4]; //对应数码管的各位

unsigned char level; //档位

unsigned int tN; //不同档位计时值

unsigned int fCnt; //脉冲下降沿次数

unsigned int regCnt; //脉冲次数暂存

unsigned int pCnt; //频率显示

unsigned char Num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void Delay(unsignedintDelayTime)

{

while(DelayTime--);

}

void disp()

{

if(level==0) //B位档

{

d[3]=0;

d[2]=pCnt/100;

d[1]=(pCnt%100)/10;

d[0]=pCnt%10;

sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);

sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);

sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);

sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);

}

else if(level==1)

{

d[3]=pCnt/1000;

d[2]=(pCnt%1000)/100;

d[1]=(pCnt%100)/10;

d[0]=pCnt%10;

sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);

sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);

sl=0xfb;Delay(1);Segment=Num[d[1]]+0x80;Delay(300); //带小数点

sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);

}

else if(level==2)

{

d[3]=pCnt/1000;

d[2]=(pCnt%1000)/100;

d[1]=(pCnt%100)/10;

d[0]=pCnt%10;

sl=0xfe;Delay(1);Segment=Num[d[3]]+0x80;Delay(300); //带小数点

sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);

sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);

sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);

}

else

{

d[3]=0;

d[2]=0;

d[1]=0;

d[0]=0;

}

}

void intial()

{

clear=1; //分频器初始化

addr0=0;

addr1=0;

addr2=1;

tN=20; //档位初始化为Hz档

level=0;

ledM=1; //显示Hz档

ledK=1;

ledB=0;

TMOD=0x61; //定时器0,工作方式1,计数器1,工作方式2(8位自动重装)

TH0=(65536-50000)/256; //计数50ms

TL0=(65536-50000)%256;

TH1=256-1;//计数器1计数初值

TL1=256-1;

TR0=1; //开定时器0中断

ET0=1; //定时器0允许

TR1=1; //开计数器1中断

ET1=1; //允许计数器1中断

EA=1; //总中断允许

}

void main()

{

intial();

while(1)

{

disp();

}

}

void timer0() interrupt 1

{

cnt++;

if(cnt==tN)

{

ET1=0; //计时1s时,暂停外部计数1

TR1=0;

cnt=0;

regCnt=fCnt; //更新显示

fCnt=0; //频率计数清零

clear=0; //硬件分频器清零

clear=1;

if(level==0) //档位切换

{

pCnt=regCnt;

if(regCnt>999)

{

pCnt=0; //显示清零

level=1;

tN=1; // 定时50ms

addr2=0;//进行分频处理

TH1=0xfb; //50分频 256-5

TL1=0xfb;

}

}

else if(level==1)

{

if(regCnt<1)

{

level=0;

tN=20; //定时1s

addr2=1; //不分频

th1="0xff;" // 256-1

tl1="0xff;" // 256-1

ledm="1;" //显示HZ档

ledk="1;

" ledb="0;

}

else" if(regCnt<1000)//KHz档

{

level=1;

tN=1; //定时50ms

addr2=0; //硬件分频处理

TH1=0xfb; //50分频 256-5

TL1=0xfb; //256-5

pCnt=regCnt*10; //换算成相应的显示:f=regCnt*100

ledM=1; //显示KHz档

ledK=0;

ledB=1;

}

else

{

level=2;

tn="1;" //定时50ms

addr2=0; //分频

TH1=0xf6; // 100分频 256-10

TL1=0xf6; //256-10

pCnt=0; //换算成相应的显示:f=regCnt*100

ledM=0; //显示MHz档

ledK=1;

ledB=1;

}

}

else if(level==2)

{

if(regCnt<500) //KHz档

{

level=1;

tN=1; //定时50ms

addr2=0; //分频

th1="0xfb;" // 50分频 256-5

TL1=0xfb; //256-5

pCnt=0; //换算成相应的显示

ledM=1; //显示KHz档

ledK=0;

ledB=1;

}

else if(regCnt<5000)

{

level=2;

tN=1; //定时50ms

addr2=0; //分频

TH1=0xf6; //100分频 256-10

TL1=0xf6; //256-10

pcnt="regCnt*2;" //换算成相应的显示:f=regCnt*100

ledM=0; //显示MHz档

ledK=1;

ledB=1;

}

else

{

level=3; //超出范围

ledM=1; //全灭

ledK=1;

ledB=1;

}

}

ET1=1; //恢复外部计数1

TR1=1;

}

TH0=0x3c; //(65536-50000)/256;

TL0=0xb0; //(65536-50000)%256;

}

void enterFre() interrupt 3 //外部频率输入

{

fCnt++;

}

这个程序 0-999hz是对的 但是1000-9999hz 只能显示千位的数字啊

附件里面有程序啊

[此贴子已经被作者于2013-4-28 18:06:02编辑过]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值