微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于中断问题

关于中断问题

时间:10-02 整理:3721RD 点击:
INT0和INT1外接两路频率为8hz的数字信号,T0和T1外接频率为1024hz的数字信号,INT0和INT1为下降沿触发,当INT0 下降沿是开通T0,INT0变高电平时关断TO开通T1,当INT0再变下降沿时关T1开通T0,循环8次,液晶显示程序没有问题,为什么我的这个程序显示不出来,是中断哪里有问题吗?求大神帮帮忙!
以下是整个程序:

#include <reg51.h>
#include<intrins.h>  //包含_nop_()函数定义的头文件  
sbit RS=P2^0;             //寄存器选择位,将RS位定义为P2.0引脚  
sbit RW=P2^1;             //读写选择位,将RW位定义为P2.1引脚  
sbit E=P2^2;              //使能信号位,将E位定义为P2.2引脚  
sbit BF=P0^7;             //忙碌标志位,将BF位定义为P0.7引脚  
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
sbit p32=P3^2;
sbit p33=P3^3;
unsigned int tuji[9];
unsigned int aocao[9];
unsigned int sudu;
int a,b,c;
/************************函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒****************************/
void delay1ms()
{
        signed char i,j;  
        for(i=0;i<10;i++)
        for(j=0;j<33;j++);
}
/************************函数功能:延时若干毫秒  入口参数:n***********************************************************/
void delay(unsigned char n)
{
        unsigned char i;
        for(i=0;i<n;i++)
        delay1ms();
}
/************************函数功能:判断液晶模块的忙碌状态  返回值:result。result=1,忙碌;result=0,不忙**************/
unsigned char BusyTest(void)
{
        bit result;
        RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态  
        RW=1;
        E=1;        //E=1,才允许读写
        _nop_();    //空操作  
        _nop_();
        _nop_();  
        _nop_();    //空操作四个机器周期,给硬件反应时间        
        result=BF;  //将忙碌标志电平赋给result
        E=0;        //将E恢复低电平  
        return result;
}
/************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate******************************/
void WriteInstruction (unsigned char dictate)
{   
        while(BusyTest()==1);  //如果忙就等待  
        RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令  
        RW=0;   
        E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,  // 就是让E从0到1发生正跳变,所以应先置"0"
        _nop_();
        _nop_();               //空操作两个机器周期,给硬件反应时间  
        P0=dictate;            //将数据送入P0口,即写入指令或地址  
        _nop_();
        _nop_();
        _nop_();
        _nop_();               //空操作四个机器周期,给硬件反应时间  
        E=1;                   //E置高电平  
        _nop_();
        _nop_();
        _nop_();
        _nop_();               //空操作四个机器周期,给硬件反应时间  
        E=0;                   //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/**************************函数功能:指定字符显示的实际地址  入口参数:x**********************************************/
void WriteAddress(unsigned char x)
{
        WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/**************************函数功能:将数据(字符的标准ASCII码)写入液晶模块  入口参数:y(为字符常量)*******************/
void WriteData(unsigned char y)
{
        while(BusyTest()==1);   
        RS=1;            //RS为高电平,RW为低电平时,可以写入数据  
        RW=0;
         E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,  // 就是让E从0到1发生正跳变,所以应先置"0"
        P0=y;            //将数据送入P0口,即将数据写入液晶模块  
        _nop_();
        _nop_();
        _nop_();
        _nop_();         //空操作四个机器周期,给硬件反应时间  
        E=1;             //E置高电平  
        _nop_();
        _nop_();
        _nop_();
        _nop_();         //空操作四个机器周期,给硬件反应时间  
        E=0;             //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/**************************函数功能:对LCD的显示模式进行初始化设置*****************************************************/
void LcdInitiate(void)
{
        delay(15);              //延时15ms,首次写指令时应给LCD一段较长的反应时间  
        WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口  
        delay(5);               //延时5ms ,给硬件一点反应时间  
        WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁  
        delay(5);
        WriteInstruction(0x06); //显示模式设置:光标右移,字符不移  
        delay(5);
        WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除  
        delay(5);
}
/****************************函数功能:显示速度提示符******************************************************************/
void display_sym(void)
{
        WriteAddress(0x00);  //写显示地址,将在第1行第1列开始显示  
        WriteData('v');      //将字符常量v写入LCD
        WriteData('=');      //将字符常量=写入LCD  
}  
/****************************函数功能:显示速度数值*******************************************************************/
void display_val(unsigned int x)
{
        unsigned char i,j,k,l;     //j,k,l分别储存温度的百位、十位和个位  
        i=x/1000;         //取千位  
        j=(x%1000)/100;   //取百位  
        k=(x%100)/10;     //取十位  
        l=x%10;           //取个位  
        WriteAddress(0x02);     //写显示地址,将在第1行第3列开始显示  
        WriteData(digit[i]);    //将千位数字的字符常量写入LCD
        WriteData(digit[j]);    //将百位数字的字符常量写入LCD
        WriteData(digit[k]);    //将十位数字的字符常量写入LCD
        WriteData(digit[l]);    //将个位数字的字符常量写入LCD
}  
/****************************函数功能:显示速度单位“r/min”************************************************************/
void display_unit(void)
{
        WriteAddress(0x06);//写显示地址,将在第2行第7列开始显示  
        WriteData('r');    //将字符常量r写入LCD
        WriteData('/');    //将字符常量/写入LCD
        WriteData('m');    //将字符常量m写入LCD
        WriteData('i');    //将字符常量i写入LCD
        WriteData('n');    //将字符常量n写入LCD
}
void main(void)
{
        a=0,b=1,c=0;
        LcdInitiate();
        IT0=1;
        IT1=1;
        TMOD=0x55;
        TH0=0;
        TL0=0;
        TH1=0;
        TL1=0;
        EA=1;
        display_sym();            //显示速度提示符  
        display_val(0000.00);        //显示器工作正常标志  
        display_unit();
        EX0=1;
        while(1)
        {       
                if(a>0&b<9&p32==1)
                {
                        TR0=0;
                        if(b<9)
                        {
                                TR1=1;
                                b++;
                        }
                        aocao[a-1]=TH0*256+TL0;
                        TH0=0;
                        TL0=0;
                        EX0=1;
                }
                if(a==8&b==9&EX0==0)
                {
                        if(c<8)
                        EX1=1;
                        if(c==8)
                        {
                                TR0=0;
                                sudu=TH0*256+TL0;
                                c=0;
                        }
                        EA=0;
                        a=0,b=1;                       
                }
                        display_val(sudu);
        }
}
void  counter0(void) interrupt 0
{
   TR1=0;
   if(a<8)
   {       
                   TR0=1;
                   a++;
   }
   tuji[b-1]=TH1*256+TL1;
   TH1=0;
   TL1=0;
   EX0=0;
}
void  counter1(void) interrupt 2
{
   TR0=1;
   c++;
   EX1=0;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top