2个外部中断计数窜口通信

xiaolongx 2017-08-31 04:55:38
用89C52单片机,2个外部脉冲信号分别计数,将结果由窜口输出到PC。我试了多次,单个中断可行,2个则不行,请教!

#include<reg52.h>
#include<Stdio.h>
#define duan P0
#define uchar unsigned char
#define uint unsigned int
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit LED =P1^0;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint num1=0,num2=0,ge,shi,bai,qian;
uchar UART_buff,SEND_buff[8];
bit New_rec = 0, Send_ed = 1, Start = 0;
void SendString(unsigned char *p);

//----------------------------------------------
void delay(unsigned int i) //Delay
{
unsigned int j;
for(i;i>0;i--)
for(j = 112; j >0; j--);
}
//----------------------------------------------
void display() //display
{
duan=tab[ge];
wei1=0;
wei2=0;
wei3=0;
wei4=1;
delay(5);
duan=tab[shi];
wei1=0;
wei2=0;
wei3=1;
wei4=0;
delay(5);
duan=tab[bai];
wei1=0;
wei2=1;
wei3=0;
wei4=0;
delay(5);
duan=tab[qian];
wei1=1;
wei2=0;
wei3=0;
wei4=0;
delay(5);
}
//----------------------------------------------
void main (void)
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES= 1; //port interrupt
EA=1; //sum interrupt

EX0=1; //out interrupt 0
IT0=1; //1-down edge ,0-low
PX0=1; //First

EX1=1; //out interrupt 1
IT1=1; //1-down edge ,0-low
PX1=0; //second

while(1)
{
display();
if ((New_rec == 1) && (Send_ed == 1))
{
New_rec = 0;
Send_ed = 0;
}
}
}

//----------------------------------------------
void int0() interrupt 0 //sensor1 interrupt
{
num1++;
//sprintf(SEND_buff,"%8d",num1,"\n");
printf(SEND_buff,"%s : %s",num1,num2);
ge=num1%10;
shi=num1/10%10;
bai=num2%10;
qian=num2/10%10;
if(num1==99)
num1=0;
}

//----------------------------------------------
void int1() interrupt 1 //sensor2 interrupt
{
num2++;
//sprintf(SEND_buff,"%8d",num2,"\n");
printf(SEND_buff,"%s : %s",num1,num2);
ge=num1%10;
shi=num1/10%10;
bai=num2%10;
qian=num2/10%10;
if(num2==99)
num2=0;
}
//----------------------------------------------
void ser_int (void) interrupt 4 //serial port
{
if(RI == 1)
{
RI = 0; //recive string
New_rec = 1;
UART_buff = SBUF;
if(UART_buff == '#')
{ LED = 1,num1=0,num2=0;
//sprintf(SEND_buff,"%8d",num1,"\n");
sprintf(SEND_buff,"%s : %s",num1,num2);
}
else if(UART_buff == '$')
{ LED = 0;
SendString(SEND_buff);
}
else if(UART_buff == '%')
{ LED = 0;
SendString(SEND_buff);
}
}
else
{
SendString(SEND_buff); //send string
TI = 0;
Send_ed = 1;
}
//delay(200);
//while(P3^2==0);
}
void SendChar(unsigned char Chr)
{
SBUF=Chr;
while(!TI);
TI=0;
}
void SendString(unsigned char *p)
{
while(*p)
{
SendChar(*p);
p++;
}
}
...全文
176 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxj001 2017-09-01
  • 打赏
  • 举报
回复
char num1=78; char num2=56; char SEND_buff[8]; sprintf(SEND_buff,"=m",num1,num2); 运行后 SEND_buff[]=“78 96” 这样,SEND_buff数组里面就已经是字符串内容的2个计数数据了。
依然冷暖 2017-09-01
  • 打赏
  • 举报
回复
stdio带一个sprintf()函数 直接把内容变成字符串
tianxj001 2017-08-31
  • 打赏
  • 举报
回复
2 个结果,我看你貌似在个十百千已经进行处理了啊,这个个十百千应该是你显示程序用的变量吧,里你所谓的拼接是指?串口输出数据拼接?
xiaolongx 2017-08-31
  • 打赏
  • 举报
回复
引用 2 楼 tianxj001 的回复:
#include<reg52.h>
#include<Stdio.h>
#define duan P0
#define uchar unsigned char
#define uint unsigned int
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit LED1=P2^0;
sbit LED2=P2^1;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint num1=0,num2=0,ge,shi,bai,qian;
uchar UART_buff,SEND_buff[8];
bit New_rec = 0, Send_ed = 1, Start = 0;
void SendString(unsigned char *p);

//----------------------------------------------
void delay(unsigned int i)      //Delay
{
  unsigned int j;
  for(i;i>0;i--)
        for(j = 112; j >0; j--);
}
//----------------------------------------------
void display()                    //display
{
  	duan=tab[ge];
wei1=0;
wei2=0;
wei3=0;
wei4=1;
delay(5);
duan=tab[shi];
wei1=0;
wei2=0;
wei3=1;
wei4=0;
delay(5);
duan=tab[bai];
wei1=0;
wei2=1;
wei3=0;
wei4=0;
delay(5);
duan=tab[qian];
wei1=1;
wei2=0;
wei3=0;
wei4=0;
delay(5);
}
//----------------------------------------------
void main (void)
{
    SCON = 0x50;  
    TMOD = 0x20; 
    TH1 = 0xFD; 
    TL1 = 0xFD;
    TR1 = 1;                        
    ES= 1;     //port interrupt
EA=1;      //sum interrupt

    EX0=1;	   //out interrupt 0
    IT0=1;	   //1-down edge ,0-low 
PX0=1;     //First

    EX1=1;	   //out interrupt 1
    IT1=1;	   //1-down edge ,0-low 
PX1=0;     //second

    while(1)  
 { 
display();	
      if ((New_rec == 1) && (Send_ed == 1))  
{  	
New_rec = 0;
Send_ed = 0;
        }
      }
}

//----------------------------------------------
void int0() interrupt 0    //sensor1 interrupt
{
 LED1=~LED1;
//   num1++;
// //sprintf(SEND_buff,"%8d",num1,"\n");
// printf(SEND_buff,"%s : %s",num1,num2);
//   ge=num1%10;
//   shi=num1/10%10;
//   bai=num2%10;
//   qian=num2/10%10;
//   if(num1==99)
//   num1=0;
}

//----------------------------------------------
void int1() interrupt 1    //sensor2 interrupt
{
    LED2=~LED2;
//   num2++;
// //sprintf(SEND_buff,"%8d",num2,"\n");
// printf(SEND_buff,"%s : %s",num1,num2);
//   ge=num1%10;
//   shi=num1/10%10;
//   bai=num2%10;
//   qian=num2/10%10;
//   if(num2==99)
//   num2=0;
}
//----------------------------------------------
void ser_int (void) interrupt 4    //serial port
{
    if(RI == 1) 
{ 
      RI = 0;              //recive string
      New_rec = 1;
      UART_buff = SBUF; 
      if(UART_buff == '#')
{ //LED = 1,num1=0,num2=0;
//sprintf(SEND_buff,"%8d",num1,"\n");
sprintf(SEND_buff,"%s : %s",num1,num2);
            }
else if(UART_buff == '$') 
{ //LED = 0;
SendString(SEND_buff);
}
else if(UART_buff == '%') 
{ //LED = 0;
SendString(SEND_buff);
     	}
      }
    else 
  { 
  SendString(SEND_buff);     //send string
      TI = 0;  
      Send_ed = 1;
    }
//delay(200);
  //while(P3^2==0);
} 
void SendChar(unsigned char Chr)
{	
SBUF=Chr;
while(!TI);
TI=0;
}
void SendString(unsigned char *p)
{
while(*p)
{
SendChar(*p);
p++;
}
}
修改了几个地方,为了快速测试,在PROTEUS上面仿真通过
双中断工作解决了,现在问题: 如何将两个结果拼接成一窜字符输出?
tianxj001 2017-08-31
  • 打赏
  • 举报
回复

2个按钮分别可以反转D1 D2状态,说明下降沿中断正确执行
tianxj001 2017-08-31
  • 打赏
  • 举报
回复
#include<reg52.h>
#include<Stdio.h>
#define duan P0
#define uchar unsigned char
#define uint unsigned int
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
sbit LED1=P2^0;
sbit LED2=P2^1;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint num1=0,num2=0,ge,shi,bai,qian;
uchar UART_buff,SEND_buff[8];
bit New_rec = 0, Send_ed = 1, Start = 0;
void SendString(unsigned char *p);

//----------------------------------------------
void delay(unsigned int i) //Delay
{
unsigned int j;
for(i;i>0;i--)
for(j = 112; j >0; j--);
}
//----------------------------------------------
void display() //display
{
duan=tab[ge];
wei1=0;
wei2=0;
wei3=0;
wei4=1;
delay(5);
duan=tab[shi];
wei1=0;
wei2=0;
wei3=1;
wei4=0;
delay(5);
duan=tab[bai];
wei1=0;
wei2=1;
wei3=0;
wei4=0;
delay(5);
duan=tab[qian];
wei1=1;
wei2=0;
wei3=0;
wei4=0;
delay(5);
}
//----------------------------------------------
void main (void)
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES= 1; //port interrupt
EA=1; //sum interrupt

EX0=1; //out interrupt 0
IT0=1; //1-down edge ,0-low
PX0=1; //First

EX1=1; //out interrupt 1
IT1=1; //1-down edge ,0-low
PX1=0; //second

while(1)
{
display();
if ((New_rec == 1) && (Send_ed == 1))
{
New_rec = 0;
Send_ed = 0;
}
}
}

//----------------------------------------------
void int0() interrupt 0 //sensor1 interrupt
{
LED1=~LED1;
// num1++;
// //sprintf(SEND_buff,"%8d",num1,"\n");
// printf(SEND_buff,"%s : %s",num1,num2);
// ge=num1%10;
// shi=num1/10%10;
// bai=num2%10;
// qian=num2/10%10;
// if(num1==99)
// num1=0;
}

//----------------------------------------------
void int1() interrupt 1 //sensor2 interrupt
{
LED2=~LED2;
// num2++;
// //sprintf(SEND_buff,"%8d",num2,"\n");
// printf(SEND_buff,"%s : %s",num1,num2);
// ge=num1%10;
// shi=num1/10%10;
// bai=num2%10;
// qian=num2/10%10;
// if(num2==99)
// num2=0;
}
//----------------------------------------------
void ser_int (void) interrupt 4 //serial port
{
if(RI == 1)
{
RI = 0; //recive string
New_rec = 1;
UART_buff = SBUF;
if(UART_buff == '#')
{ //LED = 1,num1=0,num2=0;
//sprintf(SEND_buff,"%8d",num1,"\n");
sprintf(SEND_buff,"%s : %s",num1,num2);
}
else if(UART_buff == '$')
{ //LED = 0;
SendString(SEND_buff);
}
else if(UART_buff == '%')
{ //LED = 0;
SendString(SEND_buff);
}
}
else
{
SendString(SEND_buff); //send string
TI = 0;
Send_ed = 1;
}
//delay(200);
//while(P3^2==0);
}
void SendChar(unsigned char Chr)
{
SBUF=Chr;
while(!TI);
TI=0;
}
void SendString(unsigned char *p)
{
while(*p)
{
SendChar(*p);
p++;
}
}


修改了几个地方,为了快速测试,在PROTEUS上面仿真通过

xiaolongx 2017-08-31
  • 打赏
  • 举报
回复
问题解决了一半,将 void int1() interrupt1    //sensor2 interrupt 改为 void int1() interrupt 2    //sensor2 interrupt 双中断计数可工作。 还有问题是如何将两个结果拼接成一窜字符输出? 刚入手单片机,请教!

27,381

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧