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

📄 ss.c

📁 功能描述: 利用AT89S51单片机的T0、T1的定时计数器功能
💻 C
字号:
//************************************************** 
//头文件部分,文件名:plj.h 
/************************************************** 

//主函数: 
/*================================================================================== 
公司名称:   河海大学电气工程学院                                                * 
模块名  :   AT89C52单片机系统,全国电子设计大赛                                 * 
创建人  :   南东亮    日期:2007。7。28                                         * 
修改人  :                                                                       * 
功能描述:  利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行 
            频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ 
                的信号频率进行准确计数,计数误差不超过±hz 
程序设计内容:  
                1)定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下, 
                对输入的频率信号进行计数,当T/C工作在定时器时,计数脉冲来自外部脉冲 
                输入管脚T0(P3。4)或T1(P3。5),当T0或T1产生负跳变时计数器加1。识别 
                管脚的负跳变需要两个机器周期,即24个振荡周期。所以,以T0或T1脚输入的 
                可计数外部脉冲的最高频率为1/24Fosc。但对工作在计数状态下的T0, 
                最大计数值为fOSC/24,由于fOSC=12MHz 因此:T0的最大计数频率为500KHz? 
                高于此频率将出错。 
                对于频率的概念就是在一秒只数脉冲的个数,即为频率值 
                所以T1工作在定时状态下,每定时1秒钟到,就停止T0的计数, 
                而从T0的计数单元中读取计数的数值,然后进行数据处理。 
                送到数码管显示出来。  
                2)T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时, 
                所以采用定时50ms,共定时20次,即可完成1秒的定时功能。  
                                                                          * 
//;*其他说明:   产品为设计阶段                                                  *                                     
                                                                                 */ 
//;==================================================================================

//;主程序开始 
//;==================================================================================

//#include "plj.h"
#include<reg52.h> 
#include<absacc.h> 
#include <intrins.h> 
#define uint unsigned int 
#define uchar unsigned char 

#define LED_DATA P0

sbit LED_COM1=P2^4;		  // 第1位数码管的COM线连P2.4
sbit LED_COM2=P2^5;		  // 第1位数码管的COM线连P2.5
sbit LED_COM3=P2^6;		  // 第1位数码管的COM线连P2.6
sbit LED_COM4=P2^7;		  // 第1位数码管的COM线连P2.7

#define LED_ON 1		  // 点亮数码管的电平
#define LED_OFF 0		  // 熄灭数码管的电平


void mDelay(uchar j)    //延时,毫秒数由j决定 
{   uint i=0; 
    for(;j>0;j--) 
    {  for(i=0;i<124;i++) 
        {;} 
    } 
}

code unsigned char seg_code[10]={		   
 	0x3F,  0x06,  0x5B,  0x4F,  0x66,  0x6D,  0x7D,  0x07,  0x7F,  0x6F, // 对应0~9的8段数码管的段码
};

unsigned char   led_buffer[4];	
unsigned char code table1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0123456789

//unsigned char code table2[]={0x41,0x42,0x43,0x44,0x45,0x46};//abcdef 

 

uchar T0count;       //从T0的计数单元中读取计数的数值 
uchar timecount;       // 
bit flag;                     //标志位 
unsigned long x; 
//uchar xPos,yPos; 
uchar i;

static void delay1ms(const unsigned int N)	// 功能描述:延时N(0~65535)ms;输入参数:N  延迟时间(0~65535)
{	
	unsigned int i,j;
	for(i=0;i<N;i++)
	{
		for(j=0;j<128;j++);
	}
}

void led4bit_init(void)		  //初始化4位8段数码管显示,熄灭所有数码管。
{
	LED_COM1 =	LED_OFF;
	LED_COM2 =  LED_OFF;
    LED_COM3 =  LED_OFF;
    LED_COM4 =  LED_OFF;
}

void led4bit_disp(void)			//4位8段数码管显示。
{
	LED_DATA =  seg_code[ led_buffer[0]];    //准备好第1位数码管的数据
	LED_COM1 =	LED_ON;					    //  点亮第1位数码管  
	delay1ms(2);						   // 延时2毫秒  
	LED_COM1 =	LED_OFF;				    // 熄灭第1位数码管

	LED_DATA =  seg_code[ led_buffer[1] ];
    LED_COM2 =  LED_ON;                    // 点亮第2位数码管 
    delay1ms(2);                          // 延时2毫秒
    LED_COM2 =  LED_OFF;                   // 熄灭第2位数码管

	LED_DATA =  seg_code[ led_buffer[2] ];
    LED_COM3 =  LED_ON;                    // 点亮第3位数码管
    delay1ms(2);                          //  延时2毫秒 
    LED_COM3 =  LED_OFF;                   //  熄灭第3位数码管

	LED_DATA =  seg_code[ led_buffer[3] ];
    LED_COM4 =  LED_ON;                    // 点亮第4位数码管
    delay1ms(2);                          //  延时2毫秒  
    LED_COM4 =  LED_OFF;                   // 熄灭第4位数码管 
}
void t0() interrupt 1 using 0      //T0中断服务 
{ 
    T0count++;                      //对P3。4口的脉冲进行计数 
} 
//;==================================================================================

void t1(void) interrupt 3 using 0       //T1中断服务 
{ 
    TH1=(65536-4000)/256;               //计数初值重装载 
    TL1=(65536-4000)%256; 
    timecount++; 
    if(timecount==250) 
    { 
        TR0=0; 
        timecount=0; 
        flag=1;                              // 置标志 
    }     
} 


void main(void) 
{  
    TMOD=0x15;                 //T0工作为16位计数器(方式1),T1工作方式为16位定时器 
    TH0=0;                     //计数为65536                      
    TL0=0;                     // 
    TH1=(65536-4000)/256;     //定时器采用定时4ms.  初值为4000 
    TL1=(65536-4000)%256; 
    TR1=1;                    //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时 
    TR0=1;                    //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数 
    ET0=1;                    //定时器0开中断 
    ET1=1;                    //定时器1开中断 
    EA=1;                     //CPU开中断

while(1) 
{  	 
   
    if(flag==1)                    // 
    { 
        flag=0;                        //清标志位 
        x=T0count*65536+TH0*256+TL0;   //取得时间宽度参数
	  led_buffer[0]	=x/1000;
	  led_buffer[1]	=(x%1000)/100;
	  led_buffer[2]	=(x%100)/10;
 	  led_buffer[3]	=(x%10)/1;
	  led4bit_disp();	
    timecount=0; 
    T0count=0; 
    TH0=0; 
    TL0=0; 
    TR0=1;         //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数 
    } 
} 
} 
//;==================================================================================


⌨️ 快捷键说明

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