您的位置 首页 解答

ATMEGA8计数器

//可测1MHZ的频率#includeiom8v.h>#includeDELAY.H>#defineucharunsignedchar#defineuintunsignedint/****

//可测1MHZ的频率

#include
#include
#define uchar unsigned char
#define uint unsigned int
/***********对应的几个数码管显现*****************/
const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned long load=0;
uchar data[4]={0,0,0,0};//
uint cnt=0;//守时中的中止次数
uchar temp=0;//超越65536时这个数需求
//
void display(uchar *p)
{
uchar i,j,sel=0x01;
for(j=0;j<2;j++)
for(i=0;i<4;i++)
{PORTB=~table[p[i]];
PORTC=sel;
Delay_us(2000);
sel=sel<<1;
}
}
void process(unsigned long t,uchar *p)//数据处理
{unsigned long i=t;
if(i<=9999)
PORTD=PORTD|0X03;
else if((i<=99999)&&(i>9999))
{
i=i/100;
PORTD=PORTD&0XFE;
PORTD=PORTD|0X02;
}
else if(i>99999)
{
PORTD=PORTD|0X01;
PORTD=PORTD&0XFD;
i=i/1000;
}
p[3]=i/1000;
i=i%1000;
p[2]=i/100;
i=i%100;
p[1]=i/10;
i=i%10;
p[0]=i;
}
void int_io(void)
{DDRB=DDRC=0XFF;
DDRD=0XDF;
PORTC=PORTB=0XFF;
PORTD=0XFF;
SREG=0X80;//大局使能
TCCR1B=0X06;//计数方法:T1下降沿
TCNT1H=0X00;//计数器赋初值
TCNT1L=0X00;
}
void main(void )
{
int_io();
PORTB=0X00;
PORTC=0XFF;
Delay_ms(500);
PORTB=0XFF;
/****************************/
TCNT0=0X06;//守时计数初使值为6
TCCR0=0X04;//T/C0作业在守时方法,体系时钟256分频
TIMSK=0X01;//守时部分使能T/C0
while(1)
{
process(load,data);
display(data);
if(TIFR&0X04)//用标志位来进行 >65536时的事情
{ // if(TIFR&0X20)
temp++;
TIFR=TIFR&0X04;
}
}
}
/************************/
///////////////以下是T0的守时中止
#pragma interrupt_handler time0:10
void time0(void)
{
uint tep=0;//读取高字TCNT1L的值
cnt++;
if(125==cnt)//125*256us,且此处用于调理精度;
{
cnt=0;//
/********以下为读取计数器的值***********/
load=0;
load=TCNT1L;//读取计数器低位的值
tep=TCNT1H*256;//读取计数器高位的值并处理
load=tep+load;//高位加低位
load=load+65536*temp;//处理完的数
/***********************/
TCNT1H=0X00;//从头赋初值
TCNT1L=0X00;
temp=0;
}
}
//TO用于守时,

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/266732.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部