久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3258|回復: 12
打印 上一主題 下一主題
收起左側

單片機中斷問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:120148 發表于 2016-5-11 22:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在實驗中,我用51單片機驅動液晶屛,當int0中斷時,液晶屛會顯示數字,
但是問題出現了,為什么單片機int0接口沒有接信號時,液晶屛仍會顯示數字呢,新手上路,請教大神!!!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:120148 發表于 2016-5-11 22:05 | 只看該作者
請大神指點!!!
回復

使用道具 舉報

板凳
ID:7485 發表于 2016-5-11 22:18 | 只看該作者
“大神”們弄不明白你的意思!
回復

使用道具 舉報

地板
ID:111634 發表于 2016-5-11 22:29 | 只看該作者
單片機int0接口沒有接信號,怎么會產生int0中斷呢?
回復

使用道具 舉報

5#
ID:120148 發表于 2016-5-11 22:30 | 只看該作者
簡單說就是,我的單片機中斷INT0沒有接任何東西,液晶屛仍會顯示信息,這是為什么!!!
回復

使用道具 舉報

6#
ID:111634 發表于 2016-5-11 22:30 | 只看該作者
你的問題沒頭沒腦,無法解答
回復

使用道具 舉報

7#
ID:120148 發表于 2016-5-11 22:32 | 只看該作者
我盡力了
回復

使用道具 舉報

8#
ID:120148 發表于 2016-5-11 22:35 | 只看該作者
大神,請跳過上面問題,請問下面的程序有問題嗎,我想讓液晶屛顯示坐標,為什么液晶屛什么東西都不顯示呢?
#include <reg52.h>
#include <math.h>                  
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="X:";
uchar code table1[]="Y:";
sbit lcden=P3^4;          //液晶使能端
sbit lcdrs=P3^5;          //液晶數據命令選擇端
sbit lcdrw=P3^6;    //液晶數據的讀與寫控制
uchar num=0;
uchar flag=0;       //標志位,啟動定時器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()     //外部中斷初始化函數
{
        EA=1;
        EX0=1;
        EX1=1;
        IT0=1;        //下降沿觸發
        IT1=1;
}
//計數器0
void InitTimer0()    //初始化函數
{       
    TMOD=0x05;    //設置定時器0工作模式1
        TH0=0x0FF;    //計數器裝初值
        TL0=0x0FF;
        EA=1;              //開總中斷
        ET0=1;             //開計數器0中斷
        TR0=1;             //啟動定時器0
}
//計數器1
void InitTimer1()      //初始化函數
{       
    TMOD=0x50;    //設置定時器1工作模式1
        TH1=0x0FF;     //計數器裝初值
        TL1=0x0FF;
        EA=1;               //開總中斷
        ET1=1;              //開定時器1中斷
        TR1=1;              //啟動定時器1
}
//定時器
void InitTimer2()      //初始化函數,打開定時器2
{       
    TMOD=0x01;    //設置定時器2工作模式1
        TH2=0;         //定時器裝初值
        TL2=0;
        EA=1;               //開總中斷
        ET2=1;              //開定時器2中斷
        TR2=1;              //啟動定時器2
}

void write_com(uchar com)      //寫命令
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_data(uint date)      //寫數據
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void printc(uint cc)      //將阿拉伯數字在液晶上準確顯示
{       
        write_data(cc/100+'0');       //百位
        write_data(cc/10%10+'0');     //十位
//        prints(".");
        write_data(cc%10+'0');        //個位
}
void Initlcd()
{
        lcden=0;
        write_com(0x38);          //設置16X2顯示,5X7點陣,8位數據接口
        write_com(0x0c);          //設置開顯示,不顯示光標
        write_com(0x06);          //寫一個字符后地址指針加1
        write_com(0x01);          //顯示清零,數據指針清零
}
void date(uint Ta,uint Tb,uint Tc,uint Td)       //定位算法
{
        double m1,n1,m2,n2,b1,b2,c1,c2,c3,c4,d1,d2;     //計算中的中間變量
        uint x1,x2,y1,y2;
        c1=0.34*(Ta-Tb);        //時間差到距離差 單位為毫米
        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;      //計算中的中間變量
        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)(取算數平均值)
        y=(int)((y1+y2)/2);
}
void main()
{
        Init_ex_int();
        InitTimer0();
        InitTimer1();
        Initlcd();
        TH2=0;       //定時器2裝初值
        TL2=0;
            while(1)
                {
                        if(flag==1)      //第一次外部中斷發生后打開T2
                        {
                                InitTimer2();       
                        }
                        if(flag==4)      //第四個外部中斷發生后關掉所有中斷
                        {
                                EA=0;           //關總中斷
                                 ET2=0;            //關定時器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的中斷服務程序
{
        EX0=0;       //關閉外部中斷0
        flag++;
        Ta=TH2*256+TL2;      //讀取定時器2中的值
}
void ex_int1() interrupt 0       //外部中斷1的中斷服務程序
{
        EX1=0;
           flag++;
        Tb=TH2*256+TL2;       //讀取定時器2中的值
}
void timer0() interrupt 1       //定時/計數器0中斷服務程序
{
        ET0=0;             //關定時器0中斷
        flag++;
        Tc=TH2*256+TL2;      //讀取定時器2中的值
}
void timer1() interrupt 1      //定時/計數器1中斷服務程序
{
        ET1=0;               //關定時器1中斷
        flag++;
        Td=TH2*256+TL2;
}
回復

使用道具 舉報

9#
ID:120173 發表于 2016-5-11 22:40 | 只看該作者
搞不明白啊
回復

使用道具 舉報

10#
ID:120148 發表于 2016-5-11 22:40 | 只看該作者
請高手指點!!!!
回復

使用道具 舉報

11#
ID:120148 發表于 2016-5-11 22:45 | 只看該作者

大致思路就是:兩個外部中斷,兩個定時器中斷,,當flag=1時,為第一次發生中斷。在第一次發生中斷時,打開T2定時器,讓它從0開始計數。然后每次發生中斷時就從T2中讀取TH2和TL2的值,從而得到ta、tb、tc、td,然后通過計算得出坐標,在液晶屛上顯示。
回復

使用道具 舉報

12#
ID:120148 發表于 2016-5-11 22:45 | 只看該作者
大致思路就是:兩個外部中斷,兩個定時器中斷,,當flag=1時,為第一次發生中斷。在第一次發生中斷時,打開T2定時器,讓它從0開始計數。然后每次發生中斷時就從T2中讀取TH2和TL2的值,從而得到ta、tb、tc、td,然后通過計算得出坐標,在液晶屛上顯示。
回復

使用道具 舉報

13#
ID:114189 發表于 2016-5-11 23:39 來自手機 | 只看該作者
外部中斷1應該是interrupter 2吧我記得
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕免费在线 | 久久精品播放 | 91麻豆精品国产91久久久久久久久 | 欧美日韩国产在线观看 | 先锋av资源网 | 日本色综合 | 日韩欧美在线一区 | 日韩视频一区 | 怡红院成人在线视频 | 午夜成人在线视频 | 国产小视频在线观看 | www.一级毛片| 亚洲国产成人av | 91视频进入| 亚洲免费人成在线视频观看 | 精品少妇一区二区三区日产乱码 | 成人国产精品免费观看视频 | 国产精品久久久久久吹潮日韩动画 | 欧美精品网 | 一区二区三区高清不卡 | 精品熟人一区二区三区四区 | 欧美成年人视频在线观看 | 午夜精品久久久久久久 | 久久精彩视频 | 久久久精品久久久 | a在线v| 国产综合久久久久久鬼色 | 成人免费视频播放 | 亚洲精品一二三区 | 国产福利视频 | 国产成人精品一区二区三区网站观看 | 日韩成人 | 国产激情在线观看视频 | 国产精久久久久久久妇剪断 | 黄色一级大片在线免费看产 | 精品美女久久久久久免费 | 国产91视频免费 | 日本免费在线 | 黄色av大片 | 三级成人片 | 欧美成视频|