//-------------------------------------头文件-------------------------------------- #include <reg52.h> #include <absacc.h> #include <intrins.h> //-------------------------------------头文件--------------------------------------
//********定义引脚************************************* sbit P33 = P3^3; //喂狗 sbit P23 = P2^3; sbit D2 = P0^2; //********定义引脚*************************************
//**************定义变量************************************************* int WDogZdJs; //喂狗中断计数 char rece[5]; //接收的字符 int j; bit receive; //**************定义变量*************************************************
void delay() { int i,j; for(i=0;i<100;i++) { for(j=0;j<10;j++) { ; } } }
void delay2() { int i,j; for(i=0;i<100;i++) { for(j=0;j<500;j++) { ; } } }
void Sendtex() //向电脑发送字符 '1' { SBUF='1'; while(!TI)P33=~P33; TI=0; }
void ComInStr() interrupt 4 //串行口中断 { if(RI) //接收 { if (j>4) { j=0; } rece[j]=SBUF; j++; if(j>4) receive=1; //接收标志置位 RI=0; } }
void timer0(void) interrupt 1 //喂狗中断程序 { TH0 = (65536-5000)/256; //重载计数初值 每 5 ms 中断一次 TL0 = (65536-5000)%256; //这是手动装置,如果 T0 为模式 1 的话,必须要手动装入 //如果如果 T0 为模式 2 的话,只要初始化了, //则在这里可以不要 TH0 = (65536-5000)/256; TL0 = (65536-5000)%256; WDogZdJs ++; if ( WDogZdJs >= 10 ) { P33 =! P33; //不停喂狗 WDogZdJs = 0; } }
void main() { delay(); P0 = 0xff; P1 = 0xff; P2 = 0xff; P3 = 0xff; P33 =! P33; EA = 0; TMOD=0x21; //定时器1模式1 定时器0模式1 //---------------------------处理串口中断--------------------------------------- SCON=0x50; //串行口工作方式1, 10 位异步收发,波特率由定时器控制 PCON |= 0x00; TL1=0xFA; TH1=0xFA; //22.1184M晶振 波特率9600 //---------------------------处理串口中断--------------------------------------- //------------------------------处理中断喂狗------------------------------------ TH0 = (65536-1000)/256; //预置计数初值,每 5 ms 中断一次 TL0 = (65536-1000)%256; //------------------------------处理中断喂狗------------------------------------ EA = 1 ; //允许中断 ES = 1 ; //允许串行中断 ET0 = 1; //T/C0 开中断(定时器0/计数器0) ET1 = 0; //T/C0 开中断(定时器0/计数器0) TR1=1; //启动定时器1/计数器1 TR0 = 1; //启动定时器0/计数器0
while(1) { if(receive) { Sendtex(); receive = 0; } } }
请教: void ComInStr() interrupt 4 //串行口中断 { if(RI) //接收 { if (j>4) { j=0; } rece[j]=SBUF; j++; if(j>4) receive=1; //接收标志置位 RI=0; } }
说明介绍 5 个字符则 receive 置为 1
现在情况是这样的: 现象1: 当我用串口调试软件 发 '11111' 则 执行了 Sendtex(); 是正确的 现象2: 我首先发送字符串 '111' ,没有执行 Sendtex(), 可是然后我发 字符串 '11' ,则执行 Sendtex(), 是两次总共发了 5 个字符啊。
是不是我需要自己写一个东西 表示多久没有接收到 新星,则把 前面的清空,
一般是多久啊? 这样的程序怎么写?
谢谢!
|