找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4177|回复: 6
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:49805 发表于 2013-4-28 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2013-4-29 09:24 | 只看该作者

没看到你的附件,帖子里的东西无法看,而且程序不全,根本不可能编译。

 

如果是求助,你就............

回复

使用道具 举报

板凳
ID:51039 发表于 2013-6-18 13:57 | 只看该作者
回复

使用道具 举报

地板
ID:51049 发表于 2013-6-18 20:31 | 只看该作者
什么东东??
回复

使用道具 举报

5#
ID:68875 发表于 2014-11-15 23:07 | 只看该作者
谢谢分享。。。
回复

使用道具 举报

6#
ID:86621 发表于 2015-8-12 08:42 | 只看该作者
做好了没啊   给个完整程序看一下吗
回复

使用道具 举报

7#
ID:189542 发表于 2017-4-19 15:03 | 只看该作者
凤飞飞的高规格
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表