利用单片机实现延迟时间计数

利用单片机实现对声控延迟电路的延迟时间进行测量
有编程的程序使单片机显示屏可以显示出延迟时间。


#include<reg51.h>

#define LCD P2 //定义LCD端口

void delay(unsigned int xms); //定义延迟函数
void LCD_init(); //定义LCD初始化函数
void LCD_CmdWrite(unsigned char cmd); //定义写指令函数
void LCD_DataWrite(unsigned char dat); //定义写数据函数
void LCD_StringWrite(unsigned char addr,unsigned char *ptr); //定义写字符串函数

sbit mic=P3^0; //定义麦克风引脚

void main()
{
    unsigned int count=0; //定义计数器
    char str[3]; //定义字符数组
    LCD_init(); //LCD初始化

    LCD_StringWrite(0x80,"Delay Time:  "); //第一行显示
    LCD_StringWrite(0xc0,"--  ms"); //第二行显示

    while(1)
    {
        if(mic==0) //检测到声音
        {
            TMOD=0x01; //定时器T0工作在模式1
            TH0=0x00; //为T0赋初值0
            TL0=0x00; //为T0赋初值0
            TR0=1; //启动T0
            while(mic==0); //等待声音结束
            TR0=0; //停止T0
            count=TH0*256+TL0; //计算时间差
            sprintf(str,"%d",count); //将计数器的值转化为字符串
            LCD_StringWrite(0xc0,str); //第二行显示字符串
            LCD_DataWrite(' '); //在第二行最后一个字符后加一个空格
            LCD_DataWrite('m'); //在第二行最后一个字符后加一个m
            LCD_DataWrite('s'); //在第二行最后一个字符后加一个s
            delay(500); //延迟500ms
        }
    }
}

void delay(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}

void LCD_init()
{
    LCD_CmdWrite(0x38); // 显示模式设置:16×25×7点阵、8位数据
    LCD_CmdWrite(0x01); // 显示清除
    LCD_CmdWrite(0x06); // 显示模式设置:光标右移,字符不移
    LCD_CmdWrite(0x0c); // 开显示,不显示光标,不闪烁
    LCD_CmdWrite(0x80); // 光标起始位置,第一行第一位
}

void LCD_CmdWrite(unsigned char cmd)
{
    LCD = cmd; // 将命令字写入 P0 端口
    LCD &= ~(1<<RS); //将RS端设置为0,选择命令寄存器
    LCD &= ~(1<<RW); //将RW端设置为0,向LCD写入数据
    LCD |= (1<<EN); //将EN端设置为1,使LCD执行命令
    delay(5); // 延时
    LCD &= ~(1<<EN); //将EN端设置为0,LCD命令结束
}

void LCD_DataWrite(unsigned char dat)
{
    LCD = dat; //将数据写入 P0 端口
    LCD |= (1<<RS); //将RS端设置为1,选择数据寄存器
    LCD &= ~(1<<RW); //将RW端设置为0,向LCD写入数据
    LCD |= (1<<EN); //将EN端设置为1,使LCD执行命令
    delay(5); // 延时
    LCD &= ~(1<<EN); //将EN端设置为0,LCD命令结束
}

void LCD_StringWrite(unsigned char addr,unsigned char *ptr)
{
    LCD_CmdWrite(addr); //设置光标的位置
    while(*ptr != '\0') // 当读到字符串结束标志时循环结束
    {
        LCD_DataWrite(*ptr); //写数据到LCD上显示一个字符
        ptr++; // 读下一个字符
    }
}

这个程序实现了通过计算声音信号持续时间的方法来测量延迟电路的延迟时间,并在LCD显示屏上显示出延迟时间。程序中定义了一个计数器来计算声音信号持续时间,然后将计数器的值转化为字符串,最后在第二行的LCD显示屏上显示出延迟时间值。