找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

利用單片機(jī)驅(qū)動(dòng)液晶屛進(jìn)行聲音定位

[復(fù)制鏈接]
ID:120148 發(fā)表于 2016-5-11 21:28 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
#include <math.h>                  
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="X:";
uchar code table1[]="Y:";
sbit lcden=P1^4;          //液晶使能端
sbit lcdrs=P1^6;          //液晶數(shù)據(jù)命令選擇端
sbit lcdrw=P1^5;    //液晶數(shù)據(jù)的讀與寫控制
uchar num=0;
uchar flag=0;       //標(biāo)志位,啟動(dòng)定時(shí)器2
uint Ta,Tb,Tc,Td;
uint x=0,y=0;
void delay(uint z)
{
        uint m,n;
        for(m=z;m>0;m--)
                for(n=110;n>0;n--);
}
void Init_ex_int()     //外部中斷初始化函數(shù)
{
        EA=1;
        EX0=1;
        EX1=1;
        IT0=1;        //下降沿觸發(fā)
        IT1=1;
}
//計(jì)數(shù)器0
void InitTimer0()    //初始化函數(shù)
{       
    TMOD=0x05;    //設(shè)置定時(shí)器0工作模式1
        TH0=0x0FF;    //計(jì)數(shù)器裝初值
        TL0=0x0FF;
        EA=1;              //開總中斷
        ET0=1;             //開計(jì)數(shù)器0中斷
        TR0=1;             //啟動(dòng)定時(shí)器0
}
//計(jì)數(shù)器1
void InitTimer1()      //初始化函數(shù)
{       
    TMOD=0x50;    //設(shè)置定時(shí)器1工作模式1
        TH1=0x0FF;     //計(jì)數(shù)器裝初值
        TL1=0x0FF;
        EA=1;               //開總中斷
        ET1=1;              //開定時(shí)器1中斷
        TR1=1;              //啟動(dòng)定時(shí)器1
}
//定時(shí)器
void InitTimer2()      //初始化函數(shù),打開定時(shí)器2
{       
    TMOD=0x01;    //設(shè)置定時(shí)器2工作模式1
        TH2=0;         //定時(shí)器裝初值
        TL2=0;
        EA=1;               //開總中斷
        ET2=1;              //開定時(shí)器2中斷
        TR2=1;              //啟動(dòng)定時(shí)器2
}

void write_com(uchar com)      //寫命令
{
        lcdrs=0;
        P2=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_data(uint date)      //寫數(shù)據(jù)
{
        lcdrs=1;
        P2=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void printc(uint cc)      //將阿拉伯?dāng)?shù)字在液晶上準(zhǔn)確顯示
{       
        write_data(cc/100+'0');       //百位
        write_data(cc/10%10+'0');     //十位
//        prints(".");
        write_data(cc%10+'0');        //個(gè)位
}
void Initlcd()
{
        lcden=0;
        write_com(0x38);          //設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)接口
        write_com(0x0c);          //設(shè)置開顯示,不顯示光標(biāo)
        write_com(0x06);          //寫一個(gè)字符后地址指針加1
        write_com(0x01);          //顯示清零,數(shù)據(jù)指針清零
}
void date(uint Ta,uint Tb,uint Tc,uint Td)       //定位算法
{
        double m1,n1,m2,n2,b1,b2,c1,c2,c3,c4,d1,d2;     //計(jì)算中的中間變量
        uint x1,x2,y1,y2;
        c1=0.34*(Ta-Tb);        //時(shí)間差到距離差 單位為毫米
        c2=0.34*(Ta-Tc);
        c3=0.34*(Tc-Td);
        c4=0.34*(Tb-Td);
        m1=(4*c2)/(c1*3);
        n1=(c1*c2-c2*c2+300*300)/600;      //計(jì)算中的中間變量
        b1=m1*m1+1-(4*200*200)/(c1*c1);
        b2=n1*n1+200*200-(c1*c1)/4;
        x1=(int)((sqrt((m1*m1*n1*n1-b1*b2))-m1*n1)/b1);     //第一組想(x,y)
        y1=(int)(m1*x1+n1);

        m2=4*c4/(3*c3);
        n2=(c3*300*300+c3*c4*c4-c4*c3*c3)/(600*c3);
        d1=m2*m2+1-(4*200*200)/(c3*c3);
        d2=n2*n2-600*n2+300*300+200*200-(c3*c3)/4;
        x2=(int)((sqrt((m2*m2*(n2-300)*(n2-300)-d1*d2))-m2*(n2-300))/d1);    //第二組(x,y)
        y2=(int)(m2*x2+n2);

        x=(int)((x1+x2)/2);      //最終的(x,y)(取算數(shù)平均值)
        y=(int)((y1+y2)/2);
}
void main()
{
        Init_ex_int();
        InitTimer0();
        InitTimer1();
        Initlcd();
        TH2=0;       //定時(shí)器2裝初值
        TL2=0;
            while(1)
                {
                        if(flag==1)      //第一次外部中斷發(fā)生后打開T2
                        {
                                write_com(0x85);
                                write_data('1');
                                InitTimer2();       
                        }
                        if(flag==4)      //第四個(gè)外部中斷發(fā)生后關(guān)掉所有中斷
                        {
                                write_com(0xc5);
                                write_data('1');
                                EA=0;           //關(guān)總中斷
                                 ET2=0;            //關(guān)定時(shí)器2中斷       
                               }
                    date( Ta,Tb,Tc,Td);
               // date( 300,250,300,250);
                        write_com(0x80);        //在1602的第一行上顯示X
                        for(num=0;num<2;num++)
                        {
                                write_data(table[num]);
                                delay(5);
                        }
                //write_data(48);
                        printc(x);      //顯示X的值
                        delay(5);
                        write_com(0x80+0x40);       //在1602的第二行上顯示Y
                        for(num=0;num<2;num++)
                        {
                                write_data(table1[num]);
                                delay(5);
                        }
                        printc(y);       //顯示Y的值
                        delay(5);
                }
}
void ex_int0() interrupt 0       //外部中斷0的中斷服務(wù)程序
{
        EX0=0;       //關(guān)閉外部中斷0
        flag++;
        Ta=TH2*256+TL2;      //讀取定時(shí)器2中的值
}
void ex_int1() interrupt 0       //外部中斷1的中斷服務(wù)程序
{
        EX1=0;
           flag++;
        Tb=TH2*256+TL2;       //讀取定時(shí)器2中的值
}
void timer0() interrupt 1       //定時(shí)/計(jì)數(shù)器0中斷服務(wù)程序
{
        ET0=0;             //關(guān)定時(shí)器0中斷
        flag++;
        Tc=TH2*256+TL2;      //讀取定時(shí)器2中的值
}
void timer1() interrupt 1      //定時(shí)/計(jì)數(shù)器1中斷服務(wù)程序
{
        ET1=0;               //關(guān)定時(shí)器1中斷
        flag++;
        Td=TH2*256+TL2;
}




請(qǐng)教大神上面程序哪里出錯(cuò)了,為什么液晶屛上不顯示任何東西,拜托拜托。。。。


評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2016-5-11 21:32 | 顯示全部樓層
這個(gè)很好啊 樓主能分享一下你的電路圖嗎?
回復(fù)

使用道具 舉報(bào)

ID:120148 發(fā)表于 2016-5-11 21:49 | 顯示全部樓層
電路圖.PNG
回復(fù)

使用道具 舉報(bào)

ID:120148 發(fā)表于 2016-5-11 21:50 | 顯示全部樓層
請(qǐng)問(wèn)程序哪里有問(wèn)題,為什么不能顯示坐標(biāo)呢。。。。。
回復(fù)

使用道具 舉報(bào)

ID:120148 發(fā)表于 2016-5-11 21:52 | 顯示全部樓層
拜托拜托。。。
回復(fù)

使用道具 舉報(bào)

ID:120148 發(fā)表于 2016-5-11 21:53 | 顯示全部樓層
請(qǐng)教大神為什么顯示屏不顯示坐標(biāo)
回復(fù)

使用道具 舉報(bào)

ID:293965 發(fā)表于 2018-3-19 14:45 | 顯示全部樓層
請(qǐng)問(wèn)一下你的聲音定位系統(tǒng)問(wèn)題解決了嗎?能否分享一些經(jīng)驗(yàn),最近也在研究這個(gè)問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:293965 發(fā)表于 2018-3-19 14:47 | 顯示全部樓層
請(qǐng)問(wèn)一下您的聲音定位系統(tǒng)解決了嗎?能否分享一下經(jīng)驗(yàn)。最近也在做這個(gè),論壇上這方面的資料很少有
回復(fù)

使用道具 舉報(bào)

ID:293965 發(fā)表于 2018-3-19 14:48 | 顯示全部樓層
能分享一下聲音定位系統(tǒng)的經(jīng)驗(yàn)嗎?論壇上很少有。
回復(fù)

使用道具 舉報(bào)

ID:698983 發(fā)表于 2020-4-5 23:16 | 顯示全部樓層
請(qǐng)問(wèn),這個(gè)程序問(wèn)題解決了嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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