/****************************************************************
外部晶振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;
}
资源简介:/**************************************************************** 外部晶振8M PA0~3:四位数码管的位选 PB0~7:数码管的8位段选 外部中断0用...
上传时间: 2016-03-09
上传用户:彦 yan
资源简介:AVR单片机CRC校验码的查表与直接生成
上传时间: 2015-04-11
上传用户:hgy9473
资源简介:AVR单片机中文指令表,在开发AVR单片机的时候详细了解指令可以极大的提高开发者的效率~
上传时间: 2014-06-19
上传用户:zhangyi99104144
资源简介:开发环境ICC AVR单片机 用ADC做电压表 (多通道)
上传时间: 2015-12-09
上传用户:lijinchuan
资源简介:实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
上传时间: 2013-12-17
上传用户:爺的气质
资源简介:这是马潮老师最新力做<<AVR单片机潜入式系统原理与应用实践>>中有关ADC用来实现电压表的C程序,用CVAVR编译,对想熟悉和学习AVR单片机的朋友一定有用.注释详细,一看就懂.
上传时间: 2016-03-24
上传用户:dave520l
资源简介:使用avr单片机开发的数显表,附带protel文件,原理图和pcb齐全,已在试用阶段,推荐下来学习。
上传时间: 2016-09-05
上传用户:thuyenvinh
资源简介:这是一个使用NOKIA 3510I的液晶屏+AVR单片机来制作的电压表,使用AVR单片机内部自带的ADC做电压采样。
上传时间: 2014-12-22
上传用户:kernaling
资源简介:AVR单片机做的数字电压表,代码简单易懂,方便移植
上传时间: 2017-03-03
上传用户:saharawalker
资源简介:用于测量电机转速并带速度反馈,配增量编码器,用AVR单片机ATMEGA48
上传时间: 2017-03-22
上传用户:jackgao