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

📄 frequence.c

📁 使用Mega16编制的频率检测程序
💻 C
字号:
//ICC-AVR application builder : 2007-11-21 10:43:58
// Target : M16
// Crystal: 1.0000Mhz

#include <iom16v.h>
#include <macros.h>

#define OUTPT PORTA //根据连接的端口,设置PORTA
#define OUTDR DDRA //根据连接的端口,设置DDRA

#define CS 0 
#define CLK 1 
#define DIO 2 
#define KEY 3 

#define Delay 2
#define LongDelay 10
//用于延时周期数

//Pure Command 纯指令,不带返回值
#define Reset 0xA4
#define Test 0xBF
#define LeftShift 0xA1
#define RightShift 0xA0
#define LeftCycle 0xA3
#define RightCycle 0xA2

//Command with parameter 带参数的指令
#define DispMethod0 0x80
#define DispMethod0Data 0x00
//上面为使用方式0显示数据,
//DispMethod0数值为 10000 a2 a1 a0,其中a2 a1 a0为显示位0-7地址
//DispMethod0Data为DP X X X d3 d2 d1 d0 ,其中DP为小数点
//d3 d2 d1 d0 为 0~9 - E H L P (空)的顺序编码

#define DispMethod1 0xC8
#define DispMethod1Data 0x00
//上面为使用方式1显示数据,
//DispMethod1数值为 11001 a2 a1 a0,其中a2 a1 a0为显示位0-7地址
//DispMethod1Data为DP X X X d3 d2 d1 d0 ,其中DP为小数点
//d3 d2 d1 d0 为 0~9 A~F 的顺序编码

#define BlinkControl 0x88
#define BlinkBit 0x00
//BlinkBit为d8 d7 d6 d5 d4 d3 d2 d1对应位 其中 0代表闪烁 1不闪烁

#define DisappearControl 0x98
#define DisappearBit 0x00
//DisappearBit为d8 d7 d6 d5 d4 d3 d2 d1对应位 其中1代表显示 0消隐
//消隐不能把所有的位都消隐

#define ReadKeyboard 0x15
#define ReadASCII
//ReadASCII为读出的键盘值,从0~3FH 没有键盘按下时为0xFF
//当ZLG7289A 检测到有效的按键时,KEY 引脚从高电平变为低电平并一直保持
//到按键结束。在此期间如果ZLG7289A 接收到“读键盘数据指令”则输出当前
//按键的键盘代码,没有有效按键输出FFH (11111111B)

unsigned char frequence=0;//用于记录频率
unsigned char save=0;//用于存数

void SetB(unsigned char k)
{//这里的PORTB根据自己的程序修改
    OUTPT|=(1<<k);
}

void ClrB(unsigned char l)
{//这里的PORTB根据自己的程序修改
    OUTPT&=~(1<<l);
}

void WriteOne7289(unsigned char Cmd)
{//写入一个字节,可以是单字节命令
    unsigned char i=0;//用于移了几位
    unsigned char j=0;//用于延时
    
    SetB(CS);
    j=Delay;
    while(j--);
    
    ClrB(CLK);
    j=Delay;
    while(j--);
    OUTDR|=0x0f;
    
    ClrB(CS);
    j=LongDelay;
    while(j--);
    for(i=0;i<8;i++)
    {
        if(0x80&Cmd)
        {
            SetB(DIO);
            j=Delay;
            while(j--);
            
            SetB(CLK);
            j=Delay;
            while(j--);
            
            ClrB(CLK);
            j=Delay;
            while(j--);
        }
        else
        {
            ClrB(DIO);
            j=Delay;
            while(j--);
            
            SetB(CLK);
            j=Delay;
            while(j--);
            
            ClrB(CLK);
            j=Delay;
            while(j--);        
        }
        Cmd<<=1;
    }
    SetB(CS);
}

void WriteTwo7289(unsigned char Cmd,unsigned char Data)
{//写入一个带参数的命令
    unsigned char i=0;//用于移了几位
    unsigned char j=0;//用于延时
    
    SetB(CS);
    j=Delay;
    while(j--);
    
    ClrB(CLK);
    j=Delay;
    while(j--);
    OUTDR|=0x0f;
    
    ClrB(CS);
    j=LongDelay;
    while(j--);
    for(i=0;i<8;i++)
    {//发送命令
        if(0x80&Cmd)
        {
            SetB(DIO);
            j=Delay;
            while(j--);
            
            SetB(CLK);
            j=Delay;
            while(j--);
            
            ClrB(CLK);
            j=Delay;
            while(j--);
        }
        else
        {
            ClrB(DIO);
            j=Delay;
            while(j--);
            
            SetB(CLK);
            j=Delay;
            while(j--);
            
            ClrB(CLK);
            j=Delay;
            while(j--);        
        }
        Cmd<<=1;
    }//发送命令
    for(i=0;i<8;i++)
    {//发送参数
        if(0x80&Data)
        {
            SetB(DIO);
            j=Delay;
            while(j--);
            
            SetB(CLK);
            j=Delay;
            while(j--);
            
            ClrB(CLK);
            j=Delay;
            while(j--);
        }
        else
        {
            ClrB(DIO);
            j=Delay;
            while(j--);
            
            SetB(CLK);
            j=Delay;
            while(j--);
            
            ClrB(CLK);
            j=Delay;
            while(j--);        
        }
        Data<<=1;
    }//发送参数
    SetB(CS);    
}

void DispChar(unsigned char Addr,unsigned char num)
{//地址Addr为数码管某一位,数值0-7
//用于在指定位置显示数据,当num为0~9时,显示同数字
//当num为10~15时,显示A~F,当num为16~21时,显示 - E H L P (空)
//当num为50~59时,显示0.~9.,当num为60~65时,显示A.~F.
    if(num>=0&&num<16)//显示16进制数
    {
        WriteTwo7289(DispMethod1+Addr,num);
    }
    if(num>=50&&num<66)//显示带小数点的16进制数
    {
        WriteTwo7289(DispMethod1+Addr,0x80+num);
    }
    if(num>=16&&num<22)//显示特殊符号
    {
        WriteTwo7289(DispMethod0+Addr,num-6);
    }
}

//TIMER0 initialize - prescale:Falling edge
//用于记录外部引脚的变化
void timer0_init(void)
{
    TCCR0 = 0x00; //stop
    TCNT0 = 0x00 /*INVALID SETTING*/; //set count
    TCCR0 = 0x06; //启动计数器,记录低脉冲个数
}

//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1000Hz
//用于产生1KHz的中断
void timer1_init(void)
{
    TCCR1B = 0x00; //计时停止
    TCNT1H = 0xFC; //设置计数次数64536
    TCNT1L = 0x18;

    TCCR1A = 0x00;
    TCCR1B = 0x01; //启动定时器
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
    //TIMER1 has overflowed
    TCNT1H = 0xFC; //reload counter high value
    TCNT1L = 0x18; //reload counter low value
    
    TCCR0=0x00;
    frequence=TCNT0;//读入脉冲个数
    TCNT0=0;
    TCCR0=0x06;//启动计数器,低电平记录
    
    DispChar(1,frequence/10);
    DispChar(0,frequence%10);   
}

//初始化所有设备
void init_devices(void)
{
 //stop errant interrupts until set up
    CLI(); //disable all interrupts
    timer0_init();
    timer1_init();

    MCUCR = 0x00;
    GICR  = 0x00;
    TIMSK = 0x04; //timer interrupt sources TOIE1 T/C1的溢出中断程序
    SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
    init_devices();
    while(1);

 //insert your functional code here...
}

⌨️ 快捷键说明

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