之前课程设计做的 误差很小 分享给大家 里面有程序和仿真 也做过实物 可以按键切换量程10倍和1倍
单片机源程序如下:
- #include <reg52.h >
- #include <intrins.h >
- #define uint unsigned int
- #define uchar unsigned char
- sbit k1=P3^0;
- sbit k2=P2^0;
- sbit LED=P2^1;
- unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管
- unsigned char code dispcode[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//显示0-9 /修改 新增0x00
- unsigned char count [8]={0, 0, 0, 0, 0, 0, 0, 0};//定义数组存放显示数据的各位
- unsigned int T0count =0;
- unsigned char time1tick =0;
- unsigned char i =0,a=0,j=0,y=0;
- unsigned int x ;//int最大是65536
- void pulse_init (void)
- {
- TMOD =0x16;//T0工作在方式2,计数器模式,T1工作方式为方式1,定时器模式
- TH0=0x00;
- TL0=0x00;
- TH1=(65536-50000)/256;//50ms中断一次,中断20次完成1秒定时,计算初值
- TL1=(65536-50000)%256;
- ET0=1;
- ET1=1;
- //EX0=1;
- //EX1=1;
- EA=1;
- }
- void delay (uint ms)
- {
- unsigned char i,j;
- for(i =0; i<ms; i ++)
- for(j =0; j<250;j ++)
- {
- _nop_();
- _nop_();
- _nop_();
- }
- }
- static void time0_int (void) interrupt 1 using 0
- {
- T0count ++;
- }
- void t1(void) interrupt 3 using 0
- {
- time1tick++;
- TH1=(65536-50000)/256;//50ms中断一次,中断50次完成1秒定时,计算初值
- TL1=(65536-50000)%256;
- if (time1tick==10*a)
- {
- time1tick=0;
- TR0=0;
- TR1=0;
- ET0=0;
- ET1=0;
- }
- }
- void display (void)
- {
- x=256*T0count+TL0;//转换成10进制
- i=7; //数码管的显示高位为数据的低位
- while(x)//赋值
- {
- count[i]=x%10;
- x=x/10;
- i--;
- }
- while(i--)
- {
- count[i]=10;//修改
- }
- for(i=0;i<8;i++)
- {
- if(i==7&&j==1)
- {
- P1=0x80;
- delay(1);
- }
- P0=dispbit[i];
- P1=dispcode[count[i]];
- delay(1);
- }
- }
- //void int0_int(void) interrupt 0
- //{
- // j=1;
- //}
- //void int1_int(void) interrupt 3
- //{
- // j=0;
- //}
- void main()
- {
- if(!k2)
- {delay(5);
- if(!k2)
- j=0;
- else
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
频率计.zip
(81.66 KB, 下载次数: 144)
|