⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frequent.c

📁 等精度频率计的设计
💻 C
字号:
#include<stdio.h>
#include<reg52.h>
#include<absacc.h>
#include <intrins.h>
#define DA_0 XBYTE [0x8140]
#define DA_1 XBYTE [0x8180]
#define DACR XBYTE[0x81c0]
#define COM8279  XBYTE[0x8041]
#define DATA8279 XBYTE[0x8040]
#define uchar unsigned char
#define uint unsigned int
sbit StatusBit= ACC^7; 

sbit SPI_DATA= P1^0;
sbit SPI_CLK= P1^1;
sbit CS =P1^2;

sbit INC=P1^3;
sbit UP_DOWN=P1^4;
sbit CS9313=P1^5;

sbit c0=P1^0;
sbit c1=P1^1;
sbit c2=P1^2;
sbit c3=P1^3;
sbit c4=P1^4;
sbit c5=P1^5;
sbit c6=P1^6;
sbit c7=P1^7;

sbit b1=P3^4;    //清零口
sbit b0=P3^5;    //启动口
                                           
int k=0; 
int k2=0;         //DA转换值
int value=0;   //置数
uchar place=4;  //数码管地址标示,高四位
int differ=0;//频率与置数的差值
int da;
int N;
int tim;
char tim2;


uchar code tab[23]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,                    // 0 1 2 3 4 5  //
                         0x7d,0x07,0x7f,0x6f,0x77,0x7c,              // 6 7 8 9 A b  //
					     0x39,0x5e,0x79,0x71,0x40,0x76,             // c d e f - h  //
					     0x38,0x3e,0x73,0x67,0xff};  
//***************************子函数声明*****************
void disp(long num,uchar index);
uchar getkey(void);
void delay(uchar time);
//****************主程序***************************
void main(void)
{

  tim=0;
  tim2=0;
  COM8279=0x00;
  COM8279=0x5c;
  COM8279=0x2a;
  COM8279=0x94;
  COM8279=0xd1;
  b0=0;
  b1=0;
  N=20;
  TMOD=0x01;          //定时器0初始化                                                                                                  
  TR0=1;
  ET0=1;
  IT0=1;                       
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EX1=1;
  EA=1;
  while(1)
  {

  }
}
//*******************************************

//*****************显示子函数定义**************
void disp(long num,uchar index)
{
 uchar i;
 //COM8279=0xd1;   //初始化8279  110 10001全部清零
	do{
	   	ACC=COM8279;//读回状态信息
	    }	
	while(ACC==1);//等待
     
	//COM8279=0X00;//键盘/显示工作方式
	 //COM8279=0X2a;   //时钟编程 001 01010(10分频)
	 COM8279=0x90+index;//写显示RAM	100 1(自动加一)0000(指向第零个存储单元) 
	for(i=0;num>0;i++)
	{
 		DATA8279=tab[num%10];
		num=num/10;
	}
}
/*void disp(long num,uchar index)             
{
  COM8279=144+index;
  COM8279=0xd1;
  do                     
	{                     
		ACC=COM8279;        
	}while(StatusBit==1);
  while(num>0)
    {
      DATA8279=tab[num%10];
	  num=num/10;
	}
}
*/
////////////////////////获取键值/////////////////////////
uchar getkey(void)             
{
 uchar m;
 switch(DATA8279)
 {
               case 0xc3:m=13; break;  //K13键
               case 0xc2:m=9; break;  //K9键
               case 0xca:m=10; break;  //K10键
               case 0xd2:m=11; break;  //K11键
               case 0xc1:m=5; break;   //K5键  
               case 0xc9:m=6; break;  //K6键
               case 0xd1:m=7; break;  //K7键
               case 0xc0:m=1; break;   //K1键
               case 0xc8:m=2; break;  //K2键
               case 0xd0:m=3; break;  //K3键            
			   case 0xcb:m=14;break; //K14键
 			   case 0xd3:m=15; break; //K15键 
 			   case 0xd8:m=4; break; //K4键
 			   case 0xd9:m=8; break; //K8键
               default: m=16; break;
	}
   return m;
}
/////////////////////////////////////////////////////


//********************按键中断程序**********************
void int_1(void) interrupt 2           //外部中断1
{

 uchar key;
 EA=0;
 key=getkey();
 switch(key)
 {
  case 1:N=20;  
         disp(1,7);break;
  case 2:N=40;
		 disp(2,7);break;
  case 3:N=60;
		 disp(3,7);break;
  case 4:N=80;
		 disp(4,7);break;
  case 5:N=100;
		 disp(5,7);break;
  case 6:N=120;
		 disp(6,7);break;
  case 7:N=140;
		 disp(7,7);break;
  case 8:N=160;
		 disp(8,7);break;
  case 9:N=180;
		 disp(9,7);break;
  case 10:N=200;
		 disp(0,7);break;
  case 11:disp(0,0);break;
  default: ;break;
  
 }
 EA=1;
}

/*********************************************
函数名称:定时器/计数器0中断服务程序
参数:
返回值:
*********************************************/
void TIMER_0(void) interrupt 1      
{
  int a1=0,a2=0,a3=0,a4=0,t1=0,t2=0,t3=0,t4=0;
  long a=1,t=100,f=0;
  TR0=0;
  //if(tim2==20)
  //{
   b0=~b0;
   if(b0==0) 
   {
   c0=1;c1=c2=c3=c4=c5=c6=c7=0;           //先读标准信号值
     a1=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c1=1;c0=c2=c3=c4=c5=c6=c7=0;
     a2=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c2=1;c1=c0=c3=c4=c5=c6=c7=0;
     a3=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c3=1;c1=c2=c0=c4=c5=c6=c7=0;
     a4=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c4=1;c1=c2=c3=c0=c5=c6=c7=0;         //再读被测信号值
     t1=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c5=1;c1=c2=c3=c4=c0=c6=c7=0;
     t2=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c6=1;c1=c2=c3=c4=c5=c0=c7=0;
     t3=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   c7=1;c1=c2=c3=c4=c5=c6=c0=0;
     t4=P0;
   c2=c1=c0=c3=c4=c5=c6=c7=0;
   b1=1;
   b1=0;
     //a=a4*256*62256+a3*62256+a2*256+a1;
     //t=t4*256*62256+t3*62256+t2*256+t1;
     //f=54656306/a*t;
     //COM8279=0xd1;   //初始化8279  110 10001全部清零     
     //disp(f,0);
     //f=0;
  }
  //tim2=0;
  //}
  //else tim2++;
  tim++;
  if(tim==N)
   {
	 tim=0;
     a=a4*256*62256+a3*62256+a2*256+a1;
     t=t4*256*62256+t3*62256+t2*256+t1;
     f=60000000/a*t;
     if(f<=1000) f=f*0.95238;
     if(f<=10000&&f>1000) f=f*0.93738;
     if(f<=100000&&f>10000) f=f*0.92249;
     if(f>100000) f=f*0.92461;
     COM8279=0xd1;   //初始化8279  110 10001全部清零     
     disp(f,0);
     f=0;
   }
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   TR0=1;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -