51单片机主控的数字频率计设计资料,我的毕业设计 仿真加源码
下面是实物图:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- #include <reg52.h>
- sbit led0=P2^6;//换挡灯
- sbit led1=P2^7;
- void delay_ms(int x);
- unsigned char code table[]={ //不显示小数点的数码管段值表
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char code tablewe[]={ //显示小数点的数码管段值表
- 0xbf,0x86,0xdb,0xcf,
- 0xe6,0xed,0xfd,0x87,
- 0xff,0xef};
- int count1=0;
- int time0=0;
- unsigned char a,b,c,d;
- unsigned long int f=0;
- void main()
- {
- TMOD=0x51; //定时器1工作方式为16位计数器,定时器0工作方式为16位定时器
- TH0=(65536-46080)/256;//定时50ms
- TL0=(65536-46080)%256;
- EA=1;//开总中断
- ET0=1;//开定时器0中断
- TR0=1;//启动定时器0
- ET1=1;//开定时器1中断
- IT1=1;//设置计数方式为下降沿计数
- TR1=1;//启动计数器1
- led0=1;//开始让两个灯都灭
- led1=1;
- while(1)
- {
- if(time0==20) //定时1s时间到
- {
- TR1=0; //关闭定时计数器
- TR0=0;
- f=count1*65536+TH1*256+TL1; //1s时间测得的信号下降沿个数,即频率
- if(f<1000) //如果频率小于1000Hz
- {
- led0=0;//Hz档灯亮
- led1=1;
- while(1)
- {
- a=f/100;
- P2=0x8f; //消隐
- P0=table[a]; //数码管的百位值
- P2=0x8d;
- delay_ms(1); //延时1ms
- b=(f%100)/10;
- P2=0x8f;
- P0=table[b]; //数码管的十位值
- P2=0x8b;
- delay_ms(1);
- c=f%100%10;
- P2=0x8f;
- P0=table[c]; //数码管的个位值
- P2=0x87;
- delay_ms(1);
- }
- }
- if(f>=1000&&f<10000) //从1000Hz开始,小数点的位置有所变化,采用四位数码管显示
- {
- led0=1;//KHz档灯亮
- led1=0;
- while(1)
- {
- a=f/1000;
- P2=0x6f;
- P0=tablewe[a]; //小数点的位置在第一位
- P2=0x6e;
- delay_ms(1);
- b=(f%1000)/100;
- P2=0x6f;
- P0=table[b];
- P2=0x6d;
- delay_ms(1);
- c=(f%1000%100)/10;
- P2=0x6f;
- P0=table[c];
- P2=0x6b;
- delay_ms(1);
- d=f%1000%100%10;
- P2=0x6f;
- P0=table[d];
- P2=0x67;
- delay_ms(1);
- }
- }
- if(f>=10000&&f<100000)
- {
- while(1)
- {
- a=f/10000;
- P2=0x6f;
- P0=table[a];
- P2=0x6e;
- delay_ms(1);
- b=(f%10000)/1000;
- P2=0x6f;
- P0=tablewe[b]; //小数点的位置在第二位
- P2=0x6d;
- delay_ms(1);
- c=f%10000%1000/100;
- P2=0x6f;
- P0=table[c];
- P2=0x6b;
- delay_ms(1);
- d=f%10000%1000%100/10;
- P2=0x6f;
- P0=table[d];
- P2=0x67;
- delay_ms(1);
- }
- }
- if(f>=100000&&f<1000000)
- {
- while(1)
- {
- a=f/100000;
- P2=0x6f;
- P0=table[a];
- P2=0x6e;
- delay_ms(1);
- b=(f%100000)/10000;
- P2=0x6f;
- P0=table[b];
- P2=0x6d;
- delay_ms(1);
- c=(f%100000%10000)/1000;
- P2=0x6f;
- P0=tablewe[c]; //小数点的位置在第三位
- P2=0x6b;
- delay_ms(1);
- d=(f%100000%10000%1000)/100;
- P2=0x6f;
- P0=table[d];
- P2=0x67;
- delay_ms(1);
- }
- }
- if(f>=1000000) //超出范围的显示
- {
- while(1)
- {
- P2=0xcf;
- P0=0x7f;
- P2=0xce;
- delay_ms(1);
- P2=0xcf;
- P0=0x7f;
- P2=0xcd;
- delay_ms(1);
- P2=0xcf;
- P0=0x7f;
- P2=0xcb;
- delay_ms(1);
- P2=0xcf;
- P0=0x7f;
- P2=0xc7;
- delay_ms(1);
- }
- }
- }
- }
-
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
51单片机数字频率计.rar
(3.25 MB, 下载次数: 230)
|