⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led频率.txt

📁 AVR基础试验程序
💻 TXT
字号:
#include <iom16v.h> 
#include <macros.h>
char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char position[4]={0x7f,0xbf,0xdf,0xef};
char dis_buff[8]; // 显示缓冲区,存放要显示的8个字符的段码值
char posit=0;
char freq_ok=0;
char time2_new;
unsigned int freq;
unsigned long int freq_temp;
#define uchar unsigned char
#define uint unsigned int
//////////////////////////////////

void DelayMs(uint i )           //Ms级延时,参数i为延时时间
{uint j;
 for(;i!=0;i--)
  {for(j=1142;j!=0;j--) {;}}     //原来8000,改为1142//
}
//////////////////

void Display(void) // 8位LED数码管动态扫描函数
{
PORTC=0xff;
PORTA = led_7[dis_buff[posit]];
//if (posit==5)PORTA=PORTA|0x80;
PORTC=position[posit];
DelayMs(2); 
if (++posit>=4)posit=0;
}
//////////////////////////////
void display(void) // 8位LED数码管动态扫描函数
{
PORTC=0xff;
PORTA = led_7[dis_buff[posit]];
//if (posit==5)PORTA=PORTA|0x80;
PORTC=position[posit];
if (++posit >=4)posit=0;
}
/////////////////////////////////////////////
// T/C0 比较匹配中断服务,250个计数脉冲中断一次
#pragma interrupt_handler Compare0:20
void  Compare0(void)
{
time2_new=TCNT2;
TCNT2=0;
TIFR |= 0x02;
freq_temp=freq;
freq=0;
freq_ok=1;
}
/////////////////////////////////////////
// T/C2 比较匹配中断服务,500us一次
#pragma interrupt_handler Compare2:4
void  Compare2(void)
{
freq++;
SEI(); // 开中断,允许中断嵌套,T/C0中断可打断该中断服务
display();
}
////////////////////////////
void freq_to_disbuff(void) // 频率值转化为BCD码送显示缓冲区
{
char i,j=3;
for (i=0;i<=3;i++)
{
dis_buff[j-i]=freq_temp%10;
freq_temp=freq_temp/10;
}
}
void main(void)
{
char i;
DDRB=0x00;                   
 PORTB=0x00;
DDRA=0xFF; // LED数码管
DDRC=0xFF;
 //Display(); 
// T/C2初始化
TCCR2=0x0B; //A 内部时钟,32分频(8M/32=250KHz),CTC模式,250K
TCNT2=0x00; //基时为4us
OCR2=0x7D; // OCR2 = 0xF9(249),(249+1)/500=0.5ms  f9f97D F9 125
// T/C0初始化
TCCR0=0x0E; //外部T0脚下降沿触发计数,CTC模式
TCNT0=0x00;
OCR0=0xF9; // OCR0 = 0xF9(249),(249 + 1)=250
TIMSK=0x82; // 允许T/C2、T/C0比较匹配中断
for(i=0;i<=3;i++)dis_buff[i]=0;
SEI(); // 开放全局中断
while (1)
{
if (freq_ok)
{
freq_temp =freq_temp*125+time2_new; // 累计250个脉冲的时间间隔
freq_temp =(125000000)/(2.183465*freq_temp); // 换算成频率
freq_to_disbuff(); // 频率值送显示
freq_ok=0;
}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -