找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2915|回复: 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 单片机教程网

快速回复 返回顶部 返回列表