各位前辈好,鄙人大学狗,自己跟同学在做第一个项目,就是一个红外传感器触发警报,然后通过sim900a把gps模块传回的数据发送到指定手机上,我负责的是发送短信部分。现在在中断延时部分出现了一个小问题,我先把我写的代码发出来
#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define Crystal 8000000
#define Baud 9600
uchar data_temp;
uchar data=59;
uchar re,ok,error,comfirm=0;
unsigned int p,len,lenght=0;
uchar received[256],received1[256],receiveddata[256];
void port_init(void);
void USART0_Init(void);
void init_devices(void);
void usart0_char_send(unsigned char i);
void usart0_str_send(unsigned char *s);
unsigned char usart0_char_received();
unsigned int usart0_str_received();
void delay_(uint xms);
void message_send(void); //发送短信
void int0_int(void);
uchar s,m,h=0,flagt1=0;
void timer1_init(void);
/*******************主程序*************************/ /*加入外部触发*/
void main(void)
{
char ch[128];
unsigned long int i;
unsigned char dd=0;
CLI();
init_devices();
PORTA=0x00;
DDRA=0xff;
PORTD=0xff;
DDRD=0xFE;
int0_int();
timer1_init();
SEI();
while(1)
{
if(p==1)
{
message_send();
p=0;}
//else
// {delay(50);}
}
}
/****************中断******************************/
void int0_int(void)
{
EIMSK=0x00;
EICRA=0x00;
EIMSK=0x01; //int0中断允许
}
#pragma interrupt_handler int0:2
void int0()
{
if(flagt1==0)
{flagt1=1;
TIMSK|=0x10; //OCIE1A使能
}
}
void timer1_init(void)
{
TCCR1A=0;
TCCR1B=0;
TCNT1H=0;
TCNT1L=0;
OCR1AH=0x1E;
OCR1AL=0x84; //7812
TCCR1A=0x00; //00000010,CTC模式
TCCR1B=0x0D; //00001101,CTC模式,1024分频,T=0.128ms
//TIMSK|=0x10; //OCIE1A使能
TIMSK&=~(0x10);
//0.128ms*7812=1s
}
#pragma interrupt_handler t1_ocf_isr:13
void t1_ocf_isr()
{
s++;
if(s==20)
{
s=0;
if(s==0)
{PORTA=~PORTA;};
s=0;
p=1;
}
}
原本设计是红外模块的出发,使我这边下降沿触发进行第一个中断,然后开始定时,在第一个中断触发条件下每过20s发送一次数据,第一次20s灯泡亮,第二次灯泡灭,证明成功
然后但是现实是第一个20秒过后小灯亮,模拟串口通信正常然后再发送完数据,但是在20s后小灯接下来是不断的闪烁,亮一秒灭一秒,串口通信可以不间断发送,没有间隔。我不知道问题出现在哪里了,请各位指点一下。 |