您现在的位置是:源码地带 > 资源下载

AVR单片机转速表

  • 上传时间: 2016-03-09
  • 上传用户:lgjdqm
  • 资源积分:2 下载积分
  • 标      签: C语言

资 源 简 介

/**************************************************************** 
                外部晶振8M 
                PA0~3:四位数码管的位选 
                PB0~7:数码管的8位段选 
                外部中断0用于计数 
                定时器0溢出中断的定时为1ms 
                说明 :检测到水流较小时,继电器延时1秒关闭 
******************************************************************/               
#include<iom16v.h>  
#include<macros.h>  
#define uchar unsigned char  
#define uint unsigned int  
  
 char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //数码管段选  
   
 char position[4]={0xfe,0xfd,0xfb,0xf7};//数码管位选  
   
 uint sumnum=0;  //用于记录1000ms内进入中断的次数  
   
 uint time=0;   //记录进入比较定时器0的次数  
   
 uint num=0;     //记录1ms内进入中断的次数  
   
 uint count=0;   //进入外部中断0的次数  
   
 uchar flag;  
   
 uint sumnum1;   //记录100ms内的数目  
   
/***************************函数声明***************************/  
   
 void delay();  
   
 void display(uint m );  
   
 void init();  
   
 void init_0();  
   
 void init_2();  
 void _delay_us(uint l)  
{  
     unsigned int i;  
     for(i=0;i<l;i++)  
     {  
     asm("nop");  
     }  
}  
   
   
/**************************主函数***********************************/  
  
 void main()  
{  
     init();  
     init_0();  
     init_2();  
     while(sumnum<5)  
     {  
        PORTD=0XBF;  
        segdisplay(sumnum1);  
     }  
    while(1)  
    {  
        segdisplay(sumnum1);  
    }  
       
}  
   
 /*************************扫描数码管时的延时函数*********************/  
   
 void delay()  
 {  
      uchar i,j;  
      for(i=6;i>0;i--)  
      for(j=225;j>0;j--);  
 }  
   
 /************************数码管显示函数*****************************/  
   
void segdisplay( int temp)  
     {  
      int seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
      int temp1,temp2,temp3,temp4;  
      temp1=temp/1000;  
      temp2=(temp/100)%10;  
      temp3=(temp/10)%10;  
      temp4=temp%10;  
      DDRB=0xff;  
      DDRA|=0x0f;  
        PORTA=~BIT(3);  
        PORTB=seg[temp1];  
        _delay_us(100);  
        PORTA=~BIT(2);  
        PORTB=seg[temp2];  
        _delay_us(100);  
        PORTA=~BIT(1);  
        PORTB=seg[temp3];  
        _delay_us(100);  
        PORTA=~BIT(0);  
        PORTB=seg[temp4];  
        _delay_us(100);  
    }  
   
 /***********************管脚初始化函数*********************/  
   
 void init()  
 {  
        
          DDRD|=0X40;   //PD4 设置为输出  
          PORTD=0XBF;     
          DDRA=0XFF;  
          DDRB=0XFF;  
          PORTA=0XFF;  
          PORTB=0XFF;  
 }  
   
 /***********************外部中断0初始化*********************/  
   
 void init_0()  
 {  
      MCUCR=0X02;   //INT0为下降沿触发  
      GICR=0X40;   //使能INT0中断  
      SREG=0X80;  //使能总中断  
 }  
   
 /**********************定时器2初始化***********************/  
   
 void init_2()  
 {  
      TCCR0=0x03;   // 内部时钟,64 分频(8M/64=125KHz)   
      TCNT0=0x83;   //装初值    
      TIMSK=0x01;   // 允许 T/C0溢出中断中断    
 }  
  
  
 /***********************外部中断0子函数********************/  
     #pragma interrupt_handler int0_isr:2  
     void int0_isr(void)  
     {  
          count++;  
     }   
    /*********************定时计数器0溢出中断子函数*****************/  
    #pragma interrupt_handler int0_over:10   
    void int0_over(void)  
    {  
        TCNT0=0x83;   //重装初值   
        if((time%100) == 0)  
            sumnum1 = num;  
        if(time == 1000)  
        {  
            sumnum=num;  
            if(sumnum<10)  
            {  
                  
                if((flag==1)&&(sumnum<10))  
                {  
                    PORTD=0XFF;  
                    flag=0;  
                }                 
                    flag++;  
            }  
            else  
                    PORTD=0XBF;  
            num=0;  
            time=0;  
        }  
        num+=count;  
        count=0;  
        ++time;   
    } 

相 关 资 源