资 源 简 介
/****************************************************************
外部晶振8M
PA0~3:四位数码管的位选
PB0~7:数码管的8位段选
外部中断0用于计数
定时器0溢出中断的定时为1ms
说明 :检测到水流较小时,继电器延时1秒关闭
******************************************************************/
#include
#include
#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;i0;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;
}