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

📄 freqtestpro.c

📁 80C52参考频率计程序
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include <ctype.h>
#include <intrins.h>

/***************************************************************
* Local Variables
****************************************************************/
sbit led1Ctl = P3^7;
sbit led2Ctl = P3^6;
sbit led3Ctl = P3^5;

#define LED_ON   1
#define LED_OFF  0

#define LED_N1   1
#define LED_N2   2
#define LED_N3   3

/***************************************************************
* Time Delay Functions
****************************************************************/
/* delay time is (2*n+1)*Ts(1us)+2Ts */ 
static void udelay(unsigned int i)              
{
    while(--i);             // 0: delay 3Ts 1: delay 5Ts 2: delay 7Ts
}

#ifdef SYS_NOP
/* Delay 20Ts */
static void nop(void) 
{
    _nop_();_nop_();_nop_();_nop_();
	  _nop_();_nop_();_nop_();_nop_();
	  _nop_();_nop_();_nop_();_nop_();
	  _nop_();_nop_();_nop_();_nop_();
	  _nop_();_nop_();_nop_();_nop_();
}
#endif /* SYS_NOP */

/***************************************************************
* Led Contorl Function
****************************************************************/
void Led_Ctl_Api(unsigned int lednum, unsigned int ledctl)
{
   switch(lednum)
   {
       case LED_N1:
           if(ledctl == LED_ON)
           {
               P3 = P3|(1<<7);
           }
           else
           {
           	  P3 = P3&(~(1<<7));
           }
       	break;
       case LED_N2:
           if(ledctl == LED_ON)
           {
               P3 = P3|(1<<6);
           }
           else
           {
           	   P3 = P3&(~(1<<6));
           }
       	break;
       case LED_N3:
           if(ledctl == LED_ON)
           {
               P3 = P3|(1<<5);
           }
           else
           {
           	  P3 = P3&(~(1<<5));
           }
       	break;
       default:
   	    	printf("LED_Ctl_Api Error:: lednum not in range of 1~3 \n");
   	    	break;   	    	   	    	   	    	
    }
    return;
}

/***************************************************************
* Uart Contorl Function
* --------------------------------------------------------------
* 模式1:8位串行数据传送,波特率由计时器1来控制。计时器工作
* 于模式2(自动重新载入模式),此时使用的计数器为TL1,而TH1
* 则用做自动载入及时制计时值的设定。波特率的计算关系如下:
* TH1=256-(2@SMOD*(工作频率))/(384*波特率)
* SCON:  B7   B6   B5   B4   B3   B2   B1   B0
*       SM0  SM1  SM2  REN  TB8  RB8   TI   RI
* --------------------------------------------------------------
* TOMD:  B7   B6   B5   B4   B3   B2   B1   B0
* T1&T0 GATE  C/T  M1   M0  GATE  C/T  M1   M0
* --------------------------------------------------------------
* 串口RS232初始化,传输协议 9600bps 8位 没有校验 1个停止位
* --------------------------------------------------------------
****************************************************************/
/* Uart 1 Init */
void Uart_Init_Api(void)
{
    PCON = 0x80;        //SMOD=1
    //PCO N= 0x00;      //SMOD=0
    SCON = 0x52;        //Smod1 enable REN=1
    TMOD = 0x20;        //Timer 1 Tmod2 
	  //TH1 = 0xfd;       //253  SMOD=0 9600
    TH1 = 0xf4;         //253  SMOD=1 4800
    TL1 = 0xf4;
	  TCON = TCON|0x40;   //TR1=1 启动定时/计数器1
	  
	  return;
}

/* Uart 1 Rx */
unsigned char Uart_Rx_Api(void)
{
    unsigned char tmpval;
	  
    if(RI == 1)
    {
        tmpval = SBUF&0xff;
	      udelay(2);
	      RI = 0;
    }
    else
    {
        //printf("Uart_Rx_Api Error:: no data be received \n");
        return(0);
    }
    
    return(tmpval);
}

/* Uart 1 Tx */
void Uart_Tx_Api(unsigned char sendval)
{
	  unsigned int iloop = 0;
	  
    SBUF = sendval;
    
    udelay(2);
    
    for(iloop=0; iloop<32; iloop++)
    {
        if(TI == 1)
        {
            break;	
        }
    }
	  
    TI = 0;
	  
    return;
}

/*  Uart 1 Int Process */
unsigned char getdata[32];
unsigned int loopHi = 0;
unsigned int loopLi = 0;
void Uart_Rx_ints(void)     //interrupt 4  using 2
{
	  EA = 0;      // Int Lock
    
    if(RI == 0)
    {
        return;
    }
    getdata[loopHi] = SBUF;
    loopHi++;
    loopHi = loopHi%32;
    RI = 0;
    
	  EA = 1;      // Int Unlock
    
    return;
}

#undef UART_CMD
#ifdef UART_CMD
/***************************************************************
* Uart Command Parse
****************************************************************/
void Cmd_Parse_Api(unsigned char command)
{
    unsigned char temp;
    
	  if(loopLi == loopHi)
	  {
	      return;
	  }
	  loopLi++;
    loopLi = loopLi%32;
	  temp = getdata[loopLi];
	  
	  switch (temp) 
	  {
		    case 0:
		      break;
		    case 1:	
		      break;
		    default:
		      break;
	  }
	  
	  return;
}
#endif /* UART_CMD*/

/***************************************************************
* Interrupt Process
* --------------------------------------------------------------
* interrupt 表示一个中断函数,属性参数为0到31的整常数
*   中断号         中断说明           地址
*     0           外部中断0          0003H
*     1           计时/计数器0       000BH
*     2           外部中断1          0013H
*     3           计时/计数器1       001BH
*     4           串口               0023H
* --------------------------------------------------------------
* 附::(13位)TH0=(8192-C)%32 TL0=(8192-C)/32 Time = C*Ts
* 附::(16位)TH0=(65536-C)%256 TL0=(65536-C)/256 Time = C*Ts
* --------------------------------------------------------------
****************************************************************/
unsigned int timecount = 0;
unsigned int timeflag = 0;
static void Int_T0_Process(void)  interrupt 1  using 0
{
    TL0 = 256;
	  TH0 = 256;
	  
	  timecount++;
	  
    //printf("\n Int_T0_Process timecount is %d \n", timecount);
    
	  return;
}

static void Int_E0_Process(void)  interrupt 0  using 1
{
	  if(timeflag == 0)
	  {
        timeflag = 1;
        TL0 = 256;
	      TH0 = 256;
        TR0 = 1;           // Start Timer 0
    }
    else
    {
        timeflag = 0;
        TR0 = 0;           // Close Timer 0            	
    }
	  
	  return;
}

/***************************************************************
*  TCON:  B7   B6   B5   B4   B3   B2   B1   B0
*         TF1  TR1  TF0  TR0  IE1  IT1  IE0  IT0
* --------------------------------------------------------------
*  IE:    B7   B6   B5   B4   B3   B2   B1   B0
*         EA   --  ET2   ES  ET1  EX1  ET0  EX0
* --------------------------------------------------------------
*  IP:    B7   B6   B5   B4   B3   B2   B1   B0
*         --   --  PT2   PS  PT1  PX1  PT0  PX0
****************************************************************/
void Int_Init_Api()
{
    EA = 0;
	  //SP = 0x60;     // Init Stack
    IT0 = 0;         // Low Level Trigger Int
    //IT0 = 1;       // Fall Edge Trigger Int
    TL0 = 252;
	  TH0 = 28;
    //ET0 = 0; 
	  ET0 = 1;
    //ES=1;      
	  //EX0=1;         // Enable Ex INT0
	  TR0=1;           // Start Timer 0
	  //TR1 = 1;       // Start Timer 1
    EA = 1;
}

/***************************************************************
* Data (Digital Divide) In Select
* 0: Digital Divide By 64*1*1  = 64
* 1: Digital Divide By 64*2*1  = 128
* 2: Digital Divide By 64*4*1  = 256
* 3: Digital Divide By 64*8*1  = 512
* 4: Digital Divide By 64*8*1  = 512
* 5: Digital Divide By 64*8*2  = 1024
* 6: Digital Divide By 64*8*4  = 2048
* 7: Digital Divide By 64*8*8  = 4096
****************************************************************/
void Freq_Data_Select(unsigned int sel)
{
	   P2 = P2&0xF8;
     P2 = P2|(sel&0x7); 
}

/***************************************************************
* Systenm Init
****************************************************************/
void Sys_Init_Api()          
{
	  /* Init I/O */
    P1 = 0xff;
    P1 = 0xff;
    P2 = 0xff;
    P3 = 0x1f;
   
	  /* Init Mc Control */
    P2 = P2|(1<<6);      // Divide By 64
    //P2 = P2&(~(1<<6));   // Divide By 256

	  /* Init Int */
    Int_Init_Api();
    
	  /* Init Uart */
    Uart_Init_Api();
    
	  /* Select Freq */    
    Freq_Data_Select(0);  // Digital Divide By 256
    
    timecount = 0;
    
    return;
}

#define UART_DEBUG
#ifdef UART_DEBUG
/***************************************************************
* Uart Teat
****************************************************************/
void Uart_Run_Api(void)
{
	  unsigned char tmpc;
    
    tmpc = Uart_Rx_Api();
    if(tmpc == 0)
    {
        return;
    }
    
    Uart_Tx_Api(tmpc);
    
    return;   
}        
#endif

/***************************************************************
* Led Test
****************************************************************/
void Led_Run_Api(void)
{
    Led_Ctl_Api(1, LED_ON);
    
	  udelay(20000);
	  
    Led_Ctl_Api(1, LED_OFF);
}

/***************************************************************
* main
****************************************************************/
void main()
{
    Sys_Init_Api();
    
    for(;;)
    {
      #ifdef UART_CMD
        Cmd_Parse_Api();
	  #endif
        Led_Run_Api();
        
        //udelay(200*200);
        //printf("\n XinTinG 频率计界面 \n");
        
      #ifdef UART_DEBUG
        Uart_Run_Api();
	  #endif
        udelay(100);
    }
}

⌨️ 快捷键说明

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