找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2990|回復(fù): 1
收起左側(cè)

單片機(jī)制作音頻分貝測試的程序?

[復(fù)制鏈接]
ID:269260 發(fā)表于 2018-6-20 11:50 | 顯示全部樓層 |閱讀模式
本帖最后由 wdsg 于 2018-6-20 11:52 編輯

原理圖能運(yùn)行,把lcd改成了led,程序是lcd的,但是不會(huì)改程序,有大神可以教一下嗎??? 電路圖.PNG

程序:#include <reg52.h>
unsigned long int fre;
unsigned char time;
unsigned int count;
unsigned int count1;
sbit   LCD_RS=P1^0;          //片選信號(hào)
sbit   LCD_RW=P1^1;          //讀寫信號(hào)
sbit   LCD_E=P1^2;           //使能信號(hào)
#define LCD_DB  P0        //數(shù)據(jù)信號(hào)
unsigned char character[10]={0};//在屏幕上顯示的字符串
unsigned char character_1[]={"fre= Hz"};
unsigned char FLAG = 0;  //是否分頻選擇標(biāo)志
void LCD_init(void);//初始化函數(shù)   
void LCD_write_command(unsigned char command);//寫指令函數(shù)         
void LCD_write_data(unsigned char dat);//寫數(shù)據(jù)函數(shù)           
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-15),y(1-2)
void delay_n40us(unsigned int n);//延時(shí)函數(shù)
void timer_init();            //中斷初始化函數(shù)  
//-----------------------------延時(shí)函數(shù)---------------------------
void delay_n40us(unsigned int n)                  //延時(shí)函數(shù)
{
        unsigned int i;
        unsigned char j;            
        for(i=n;i>0;i--)
        for(j=0;j<2;j++);         
}
void delay_1s()
{
        unsigned int i,j;
        for(i = 0;i<100;i++)
                for(j = 0;j<1000;j++);
}
//---------------------lcd1602液晶顯示函數(shù)--------------------                                    
void LCD_init(void)         //液晶初始化函數(shù)
{
        LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
        LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
        LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
        LCD_write_command(0x0c);//整體顯示,關(guān)光標(biāo),不閃爍
        LCD_write_command(0x06);//設(shè)定輸入方式,增量不移位
        LCD_write_command(0x01);//清除屏幕顯示         
        delay_n40us(100);//清屏延時(shí)
}
void LCD_write_command(unsigned char dat)  //寫命令函數(shù)
{
        LCD_DB=dat;
        LCD_RS=0;//指令         
        LCD_RW=0;//寫入         
        LCD_E=1; //使能         
        LCD_E=0;
        delay_n40us(1);//寫命令延時(shí)   
}         
void LCD_write_data(unsigned char dat)          //寫數(shù)據(jù)函數(shù)
{
        LCD_DB=dat;
        LCD_RS=1;//數(shù)據(jù)         
        LCD_RW=0;//寫入         
        LCD_E=1;//使能  
        LCD_E=0;
        delay_n40us(1);         //寫數(shù)據(jù)延時(shí)
}
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個(gè)字符
{
        unsigned char address;
        if(y==1)
                 address=0x80+x;         //顯示在第一排的時(shí)候的x的地址
        else
                 address=0xc0+x;         //顯示在第二排的時(shí)候的x的地址
        LCD_write_command(address);         //輸入地址
        LCD_write_data(dat);                 //輸入數(shù)據(jù)
}
void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個(gè)數(shù)字
{
        unsigned char address;
        if(y==1)
                 address=0x80+x;         //顯示在第一排的時(shí)候的x的地址
        else
                 address=0xc0+x;         //顯示在第二排的時(shí)候的x的地址
        LCD_write_command(address);         //輸入地址
        LCD_write_data(dat+48);                 //輸入數(shù)據(jù)
}
void dis_num(void)
{
        unsigned char i=0,j=0,k=0;
        LCD_write_command(0x01);//清除屏幕顯示
        character[0] = fre/10000000;
        character[1] = fre/1000000%10;
        character[2] = fre/100000%10;
        character[3] = fre/10000%10;
        character[4] = fre/1000%10;
        character[5] = fre/100%10;
        character[6] = fre/10%10;
        character[7] = fre%10;
    character[8] = 'H';
        character[9] = 'z';
        for(i = 0;i<4;i++)                 //顯示“fre=”
        {
                 LCD_disp_char(i+0,1,character_1);
        }
        for(i = 0;i<10;i++)         //判斷第一個(gè)不為0的數(shù)
        {
                if(character!=0)
                        break;
        }
        k = 8-i;
        for(j = 0;j<k;j++)         //顯示所有的數(shù)字
        {
                        LCD_disp_num(4+j,1,character[i++]);        
        }
    for(i = 5;i<7;i++)         //顯示“Hz”
        {
                 LCD_disp_char(j+4,1,character_1);
                j++;
        }
}
//----------------主函數(shù)--------------------
void main()
{
        unsigned char i;
        LCD_init();
        timer_init();             //定時(shí)/計(jì)數(shù)器初始化
        for(i = 0;i<4;i++)
        {
                 LCD_disp_char(i+0,1,character_1);
        }
        while(1)
        {
                dis_num();         //顯示
                delay_1s();
        }
}
//-------------------定時(shí)/計(jì)數(shù)器初始化--------------
void timer_init(void)         //定時(shí)/計(jì)數(shù)器初始化
{
        TMOD=0x66;                //計(jì)數(shù)器0和計(jì)數(shù)器1工作工作方式2,自動(dòng)重裝初值
        TH0=0;                    //計(jì)數(shù)器初值為0
        TL0=0;
        TR0=1;                    //計(jì)數(shù)器開始計(jì)數(shù)            
        ET0=1;                    //打開計(jì)數(shù)器0中斷   
        TH1=0;                    //計(jì)數(shù)器初值為0
        TL1=0;
        TR1=1;                    //計(jì)數(shù)器開始計(jì)數(shù)            
        ET1=1;                    //打開計(jì)數(shù)器1中斷   
        RCAP2H=(65536-62500)/256; //在程序初始化的時(shí)候給RCAP2L和RCAP2H賦值,
        RCAP2L=(65536-62500)%256; //TH2和TL2將會(huì)在中斷產(chǎn)生時(shí)自動(dòng)使TH2=RCAP2H,TL2=RCAP2L。
        TH2=RCAP2H;               //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
        TL2=RCAP2L;
        ET2=1;                    //打開定時(shí)器2中斷         
        TR2=1;                    //定時(shí)器2開始計(jì)時(shí)  
        EA=1;                     //開總中斷   
}
//------------------中斷函數(shù)----------------------
void timer2(void) interrupt 5 //定時(shí)器2中斷(62.5ms)
{
        time++;
        TF2=0;                    //定時(shí)器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
        if (time==16)             //定時(shí)1s時(shí)間到  
        {
           time=0;                //計(jì)時(shí)清0
           EA=0;                  //關(guān)中斷                 
           fre=(long)count1*256+TL1;     //count*256強(qiáng)制轉(zhuǎn)換成long型,否則將不產(chǎn)生進(jìn)位~先判斷分頻后(計(jì)數(shù)器1)
           FLAG = 0;
         
           if(fre<2000)//如果不到200KHz則讀取分頻前(計(jì)數(shù)器0)頻率(200K÷100=2000)
           {
                           fre = (long)count*256+TL0;
                        FLAG = 1;         
           }
                if(!FLAG)
                {
                        fre = fre *100;//100分頻
                }
           TL0=0;                 //清零計(jì)數(shù)器0計(jì)數(shù)            
           TH0=0;
           TL1=0;
           TH1=0;
           count=0;               //清零計(jì)數(shù)器0計(jì)數(shù)         
           count1=0;
           EA=1;                  //開中斷            
        }
}
//----------------------------------------------------------------
void timer0(void) interrupt 1 //計(jì)數(shù)器0中斷(100分頻前)         
{
        count++;
}               
//----------------------------------------------------------------
void timer1(void) interrupt 3 //計(jì)數(shù)器1中斷(100分頻后)
{
        count1++;
}

評(píng)分

參與人數(shù) 1黑幣 +2 收起 理由
云走殘陽 + 2

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:355221 發(fā)表于 2018-6-20 15:50 | 顯示全部樓層
LCD與數(shù)碼管完全不同。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表