关于中断问题
时间: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;
}
以下是整个程序:
#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;
}