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

📄 frequencytest33x.c

📁 一些C8051f330的C程序
💻 C
字号:
//
// 文件名:FrequencyTest.c
//
// 编写人:宁太阳 
//
// 编写时间:2005/1/5
//
// 目标器件: C8051F33x
//
// 编译工具: Silicon Laboratories IDE
//-----------------------------------------------------------------------------

// 程序描述:
//   这是一个频率测试程序,被测频率从P0.1输入,P0.0输出系统时钟。频率测试时需要占用一个中断和一个
//定时器,下面是在实验中测得的一组数据,供参考。测得的结果可以在名为frequencydata的数组中观察到。
//-----------------------------------------------------------------------------
//            被测频率实际值(用示波器观察得到)          测得值(此程序测得)
//                                     
//              | 426Hz                                      426Hz  |
//              | 646Hz                                      646Hz  |
//              | 853Hz                                      853Hz  |
//              | 1k                                          1k    |
//              | 2.25k                                       2.236k|
//              | 3.91k                                       3.825k|                   
//              | 4.4k                                        4.34k |
//              | 6.2k                                        5.91k |
//              | 10.1k                                       9.33k |
//              |                                                   |
//-----------------------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------------------
#include <c8051f330.h>                   

//-----------------------------------------------------------------------------
// 特殊功能寄存器
//-----------------------------------------------------------------------------
sfr   INT01CF  = 0xe4;
sfr16 TMR2RL   = 0xca;                 
sfr16 TMR2     = 0xcc;                 
//-----------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------

#define SYSCLK       24500000            //  系统工作频率
//-----------------------------------------------------------------------------
//位定义
//-----------------------------------------------------------------------------
sbit LED = P1^3;                         // LED所接的引脚
unsigned char i; 
unsigned int xdata frequencydata[100];   //此数组用于存放最后测得结果
unsigned int  fmd;                       //计算时的数据暂存字节
unsigned int pdata *point;               //数组frequencydata的指针
//-----------------------------------------------------------------------------
// 函数定义
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (void);
void INT_Init (void);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void) {
 unsigned char j;
   PCA0MD &= ~0x40;                       // 禁止看门狗定时器
                                          
	
   SYSCLK_Init ();                        // 系统时钟初始化 
                                        
   PORT_Init ();                          // 交叉开关和通用I/O口初始化
  
   Timer2_Init ();                        // 定时器2初始化
                                         
   INT_Init ();   

   EA = 1;                                // 总中断使能
     
   point =&frequencydata;                 
   for(j=0;j<=100;j++)                    //测试结果存放位置清0
	  {
	   *point=0x00;
       point++;
       }
   point =&frequencydata;                //重新给指针赋初值
   while (1)
    {                         
     if(i==2)
       {
        EA=0;                            //关中断
		i=0;
    	TR2=0;
        fmd=TMR2;                        //读取定时器2的值
    	TMR2=0x00;                       //清定时器2数据寄存器
        fmd=(fmd*0.04)+10;               //0.04=1/24.5M,10为中断时所需的系统时钟周期
        fmd=1000000/fmd; 
		*point=fmd-8;                    //这里以1K为基准,8为修正值l
		point++;
	    EA=1;
		}
	 
	 }
}

//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
//

void SYSCLK_Init (void)
{
   OSCICN = 0x83;                         //  系统时钟初始化为片内的 24.5MHz  
                                          
   RSTSRC = 0x04;                         // 使能时钟丢失检测器
}

//-----------------------------------------------------------------------------
// 通用I/O初始化
//-----------------------------------------------------------------------------
//
void PORT_Init (void)
{
                                         
   XBR0     = 0x08;                       // 系统时钟输出
   XBR1     = 0x40;                       // 使能交叉开关和弱上拉
   P0MDOUT |= 0x01;                       // P0.0设为推挽方式
   P1MDOUT |= 0x08;                       // P1.3设为推挽方式
}

//-----------------------------------------------------------------------------
// 定时器2初始化
//-----------------------------------------------------------------------------

void Timer2_Init ()
{
   TMR2CN  = 0x00;                        // 16位自动重装入,禁止定时器2; 并清TF2标志位;                              
   CKCON   = 0x10;                         //使用系统时钟作为定时器2的时钟源                                        
   TMR2    = 0x0000;                   
   ET2     = 1;                           //使能定时器2中断
}
//-----------------------------------------------------------------------------
// 中断0初始化
//-----------------------------------------------------------------------------
//
void INT_Init (void)
{
  EX0=1;
  INT01CF=0x01;                           //中断0引脚分配在P0.1
  TCON   =0x01;                           //下降沿产生中断
}
//-----------------------------------------------------------------------------
// 中断0子程序
//-----------------------------------------------------------------------------
//
void INT0_ISR (void) interrupt 0
{
  TR2= 1;                           // 检测到第一次中断时启动定时器2
  i++;
  if(i==2)
    {
     TR2=0;                        //检测到第二次中断时定时器2停止计数
	 LED=!LED;  
     }
}

⌨️ 快捷键说明

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