//////////////////////////////////////////////////////////// 
//程序名称:车速测量 
//编写:DREAMER开发板 
//简介:本程序通过单片机对光电脉冲计数模块产生的脉冲计数 
//实现对电机速度进行测量的目的 
//////////////////////////////////////////////////////////// 
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 
#include<stdio.h> 
#include"1602.h" 
#include"delay.h" 
#define HIGH (65536-50000)/256 
#define LOW  (65536-50000)%256 
 
//sbit LED=P1^2;    //定义LED端口 
bit OVERFLOWFLAG; 
bit TIMERFLAG; 
/*------------------------------------------------ 
                    定时器0初始化子程序 
                                        本程序用于计数 
------------------------------------------------*/ 
void Init_Timer0(void) 
{ 
 TMOD |= 0x01 | 0x04;          //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响                      
 TH0=0x00;                      //给定初值 
 TL0=0x00;          
 EA=1;                    //总中断打开 
 ET0=1;                   //定时器中断打开 
 TR0=1;                   //定时器开关打开 
} 
/*------------------------------------------------ 
                    定时器1初始化子程序 
                                        本程序用于定时 
------------------------------------------------*/ 
void Init_Timer1(void) 
{ 
 TMOD |= 0x10;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响  
 TH1=HIGH;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 
 TL1=LOW; 
 EA=1;            //总中断打开 
 ET1=1;           //定时器中断打开 
 TR1=1;           //定时器开关打开 
} 
/*------------------------------------------------ 
                    主程序 
------------------------------------------------*/ 
main() 
{ 
 float a; 
 char temp[16];      //定义字符显示缓冲数组 
 Init_Timer0();      //初始化定时器0 
 Init_Timer1();      //初始化定时器1 
 LCD_Init();         //初始化液晶屏 
 delay_ms(10);       //延时用于稳定,可以去掉 
 LCD_Clear();        //清屏 
 LCD_Write_String(0,0,"ssssssssss");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入 
 while(1) 
 { 
  if(OVERFLOWFLAG)//检测溢出标志,如果溢出表明频率过高,显示溢出信息 
    { 
         OVERFLOWFLAG=0;//标志清零 
     LCD_Write_String(0,1,"overflow >655KHz"); 
        } 
  if(TIMERFLAG)      
    { 
         a=TL0+TH0*256;//读取计数值 
         a=a*8; 
         a=a/20; 
         a=a/3; 
 
     sprintf(temp,"%8.2f cm/s",a); 
     LCD_Write_String(0,1,temp);//显示到液晶第二行 
         TR0=1;                     //2个定时器打开 
         TR1=1; 
         TH0=0;                     //保证计数器初值为0 
         TL0=0; 
         TIMERFLAG=0;               //打开计时计数标志 
          
        } 
  } 
} 
 
/*------------------------------------------------ 
                 定时器0中断子程序 
------------------------------------------------*/ 
void Timer0_isr(void) interrupt 1 
{ 
 TH0=00;              //重新给定初值 
 TL0=00;  
 
 OVERFLOWFLAG=1;  //溢出标志 
 
} 
/*------------------------------------------------ 
                 定时器1中断子程序 
------------------------------------------------*/ 
void Timer1_isr(void) interrupt 3 
{ 
 static unsigned char i; 
 TH1=HIGH;                 //重新赋值10ms 
 TL1=LOW; 
 
 i++; 
 if(i==60)       //50ms 计数时间单位,得出50ms脉冲个数 x60就是3s中脉冲个数 
   { 
   i=0; 
   TR0=0;        //2个定时器关闭 
   TR1=0; 
   TIMERFLAG=1;  //标志位清零 
   TH1=HIGH;         //重新赋值 
   TL1=LOW; 
   } 
}
 |