单片机源程序如下:
- /*等精度plj*/
- #include<at89x52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define duan P0 //段驱动
- #define wei P2 //位扫描
- #define shuju P1 //外部取数据
- sbit clear=P3^7; //清除外部数据
- sbit on=P3^6; //闸门信号
- uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0,1,2,3,4,5,6,7,8,9字型码
- uchar weixuan[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c};
- int output[8]; //待显示的输出BCD码
- uchar shuju2; //外部计数器接收缓存
- ulong jz; //基准
- ulong js; //计数
- ulong huancun; //缓存
- bit cs; //允许数据更新标志位
- int i;
- //短延时
- void delay(uchar time)
- {
- for(;time!=0;time--);
- }
- //长延时
- void ldelay()
- {
- uint dd=1100;
- while(dd--);
- }
- //八位扫描显示子程序
- void display(ulong p)
- {
- output[7]=smgduan[p%100000000/10000000];
- output[6]=smgduan[p%10000000/1000000];
- output[5]=smgduan[p%1000000/100000];
- output[4]=smgduan[p%100000/10000];
- output[3]=smgduan[p%10000/1000];
- output[2]=smgduan[p%1000/100];
- output[1]=smgduan[p%100/10];
- output[0]=smgduan[p%10];
- for(i=0;i<8;i++)
- {
- wei=0xff;
- wei=weixuan[i];
- duan=output[i];
- delay(100);
- wei=0xff;
- }
- }
- void main()
- {
- on=0; //闸门关闭
- clear=1; //计数器清零
- clear=0; //清零关闭
- TMOD=0x55;
-
- EA=1;
- EX1=1;
- IT1=1;
- ET0=1;
- ET1=1;
-
- TR1=1;
- TR0=1;
- on=1; //闸门开启
- while(1)
- {
- display(huancun);
- if(cs) //闸门关闭时处理数据
- {
- cs=0;
- shuju2=shuju;
- huancun=TH0;
- huancun<<=8;
- huancun+=TL0;
- huancun<<=4;
- huancun+=(shuju2&0x0f);
- js+=huancun;
- huancun=TH1;
- huancun<<=8;
- huancun+=TL1;
- huancun<<=4;
- huancun+=(shuju2>>4);
- jz+=huancun;
- huancun=(float)js/(float)jz*24000000;
- display(huancun);
- jz=0;
- js=0;
- TH0=0;
- TL0=0;
- TH1=0;
- TL1=0;
- clear=1;
- clear=0;
- on=1;
- }
- else
- {
- ldelay(); //处理数据时间补偿 防止闪烁
- }
- }
- }
- //定时器0
- void jsq0() interrupt 1 using 2
- {
- js+=0x000001;
- if(js>=0xc00000)
- {
- on=0; //关闭闸门
- }
- }
- //等精度计数结束,允许处理数据
- void end() interrupt 2 using 1 //外部中断1
- {
- cs=1;
- }
- //定时器1
- void jsq1() interrupt 3 using 3
- {
- jz+=0x000001;
- if(jz>=0xc00000)
- {
- on=0; //关闭闸门
- }
- }
复制代码
所有资料51hei提供下载:
频率计.zip
(157.89 KB, 下载次数: 50)
|