您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机ATMEGA8单片机频率计程序与电路图 正文
ATMEGA8单片机频率计程序与电路图

ATMEGA8单片机频率计程序与电路图

点击数:7266 次   录入时间:03-04 11:49:30   整理:http://www.55dianzi.com   AVR单片机
    //printf("\nOverFlowTimes %d",T1_OV_Times);
   
    LongConvertToChar(Frequence);   //把Frequence 转换后的数据 放到 net[]数组里面
    DisplayListChar(0, 5, net);     //把net[]的数据输出到LCD
  
    SET_CLEAR;                  //一定要先把 74ls393 清零 再对TCNT1 清零
    _delay_loop_2(2);           //适当延时,其实可不要
    CLR_CLEAR;
    _delay_loop_2(2);
   
    TCNT1H=0x00;
    TCNT1L=0x00;   

    T2_OV_Time=1;             //启动下一次测量
   }
else
   { 
    SET_DOOR;  
    T2_OV_Time=2;        
   }
}


/*----------------------LCD_1602函数实体------------------*/

void LCD_ON(void)
{
delay_nms(400); //启动等待,等LCD讲入工作状态
LCDInit(); //LCD初始化
delay_nms(100); //延时片刻(可不要)
DisplayListChar(0, 0, Owner);
DisplayListChar(0, 5, net);
}

void UsePrintfToConvert(unsigned long WD)   //利用 printf 的转换功能 爽! ^.^
{
SetPrintfConvertMode=1; //设置 printf 为自定义转换模式
printf("%13ld Hz",WD);    //net[]数组总共有 16 个成员 与LCD1602的一行16个位对应
SetPrintfConvertMode=0;   //还原 printf 为 Uart 输出模式

/*---------为输出数据添加逗号 999,999,999 ------------*/


    net[2]=net[4];
net[3]=net[5];
net[4]=net[6];
if(net[2]!=’ ’||net[3]!=’ ’||net[4]!=’ ’)
{
   if(net[4]!=’-’)
    {
     net[5]=’,’;
    }
}
net[6]=net[7];
net[7]=net[8];
net[8]=net[9];
if(net[6]!=’ ’||net[7]!=’ ’||net[8]!=’ ’)
{
   if(net[8]!=’-’)
    {
    net[9]=’,’;
    }
}
}

void LongConvertToChar(unsigned long WD)
{
UsePrintfToConvert(WD);
}

void WritEDAtaTo595(unsigned char WDLCD) // 74hc595 串行转并行输出
{
unsigned char i;
CLR_74LS595_CLK;
for(i=0;i<8;i++)
   {
    CLR_74LS595_SHIFT;
    if(WDLCD&0x01)
     {
      SET_74LS595_DI;
     }
    else
     {
      CLR_74LS595_DI;
     }
    WDLCD>>=1;
    SET_74LS595_SHIFT;
   }
_delay_loop_2(1);
SET_74LS595_CLK; 
}

//写数据
void WritEDAtaLCD(unsigned char WDLCD)
{
delay_nms(1);//适当加延时,避免 LCD1602 繁忙
WritEDAtaTo595(WDLCD);
SET_LCD_RS;
CLR_LCD_RW;
CLR_LCD_E; //若晶振速度太高可以在这后加小的延时
_delay_loop_2(1);
SET_LCD_E;
}

//写指令
void WriteCommandLCD(unsigned char WCLCD)
{
delay_nms(1);//适当加延时,避免 LCD1602 繁忙
WritEDAtaTo595(WCLCD);
CLR_LCD_RS;
CLR_LCD_RW; 
CLR_LCD_E;
_delay_loop_2(1);
SET_LCD_E; 
}


void LCDInit(void) //LCM初始化
{
WritEDAtaTo595(0);
WriteCommandLCD(0x38); //三次显示模式设置,不检测忙信号
delay_nms(15);
WriteCommandLCD(0x38);
delay_nms(5);
WriteCommandLCD(0x38);
delay_nms(5);

WriteCommandLCD(0x38); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08); //关闭显示
WriteCommandLCD(0x01); //显示清屏
WriteCommandLCD(0x06); // 显示光标移动设置
WriteCommandLCD(0x0C); // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCD(X); //这里不检测忙信号,发送地址码
WritEDAtaLCD(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
{
unsigned char ListLength;

ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20) //若到达字串尾则退出
{
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
}
}

/*----------------------串口函数实体------------------*/


void Uart_Init(void)
{
UCSRB=_BV(RXEN)|_BV(TXEN); 
UBRRL=51;   
stdout=&mystd;
stdin=&mystd;
}

int System_putchar(char c, FILE *stream)
{
if(SetPrintfConvertMode==1)
{
   net[Net_Pointer]=c;
   Net_Pointer++;
   if(Net_Pointer>=16)
   {
    Net_Pointer=0;
   }
  
}
else
{
   if (c == ’\n’)
   System_putchar(’\r’, stream);
   loop_until_bit_is_set(UCSRA, UDRE);
   UDR = c;
}

return 0;
}


int System_getchar( FILE *stream)
{
loop_until_bit_is_set(UCSRA,RXC);
return UDR;
}


参考链接:http://pICavr.h15.rree.com/news/2009-05/9337.htm

上一页  [1] [2] 


本文关键字:单片机  程序  电路图  AVR单片机单片机-工控设备 - AVR单片机