先说一下目的:两个单片机,发送方称为A,接收方称为B。现在是想通过A的物理按键发送给B一个指令,让其开始计时,并输出相应的字符串到串口助手上面,然后通过按下B的物理按键停止计时,并输出相应的字符串给串口助手显示。
目前遇到的情况是指令发送,开始计时并输出相应的字符串到串口助手上面,这些都可以实现。但是停止计时按键按下的时候却出现了问题,不发送并且数码管显示也出现了异常(图1)
以下是接收方B的单片机代码。
#include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定义头文件
#include "intrins.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
void send_byte(uchar by);
void send_string(uchar *p);
void printf_String();
void printf_String1();
unsigned char num1=0; // 存放接收到的1个字节的数据
uchar time ;
int temp;int temp1=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
uchar yi,er,san,si;
uint num;
uchar data_L, data_H;
uchar data_0, b;
uchar flag=0;
sbit k4 = P3^3;
sbit k3 = P3^2;
/********************************************************************
* 名称 : Delay()
* 功能 : 延时
* 输入 : i
* 输出 : 无
***********************************************************************/
void delay(uchar i) //延时函数
{
uint j,k;
for(j=i;j>0;j--)
for(k=500;k>0;k--);
}
/********************************************************************
* 名称 : display()
* 功能 : 数码管显示函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void display(uchar yi,uchar er,uchar san,uchar si) //显示函数
{
P2=table[yi];
P41 = 0;
delay(5);
P41 = 1;
P2=table[er];
P42 = 0;
delay(5);
P42 = 1;
P2=table[san];
P44 = 0;
delay(5);
P44 = 1;
P2=table[si];
P45 = 0;
delay(5);
P45 = 1;
}
void printf_String(void)
{ char strTempA[5];
char strTempB[5];
char strTempC[5];
char strTempD[5];
int c=0;
int d=0;
sprintf(strTempA,"%d",temp);
sprintf(strTempB,"%d",temp1);
sprintf(strTempC,"%d",c);
sprintf(strTempD,"%d",d);
printf ("开始时间:%s%s:%s%s ",strTempC,strTempD,strTempB,strTempA);
}
void printf_String1(void)
{
char strTempE[5];
char strTempF[5];
char strTempG[5];
char strTempH[5];
int e =0;
int f =0;
sprintf(strTempE,"%d",temp);
sprintf(strTempF,"%d",temp1);
sprintf(strTempG,"%d",e);
sprintf(strTempH,"%d",f);
printf ("结束时间:%s%s:%s%s ",strTempG,strTempH,strTempF,strTempE);
printf ("所用的时间为:%s%s:%s%s\n ",strTempG,strTempH,strTempF,strTempE);
}
/***********************
串口初始化
**************************/
void UART_init(void)
{
// 下面代码设置定时器2
T2H = 0xFD; // 波特率:9600 /22.1184MHZ,1T
T2L = 0xC0; // 波特率:9600 /22.1184MHZ,1T
AUXR = 0x15; // 0001 0101,T2R=1启动T2运行,T2x12=1,定时器2按1T计数,S1ST2=1
// 下面代码设置定串口1
SCON = 0x50; // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)
// 下面代码设置中断
ES = 1; // 开串口1中断
EA = 1; // 开总中断
TI=1;
}
/***********************
主函数
**************************/
void main()
{
P0M0=0X00;P0M1=0X00;
delay(5);
P1M0=0X00;P1M1=0X00;
delay(5);
P2M0=0X00;P2M1=0X00;
P3M0=0X00;P3M1=0X00;
P4M0=0X00;P4M1=0X00; // 双端模式。用于数码管的显示
TH0=0x0D8;
TL0=0x0F0;
IT0=1; // 外中断0设置为下降沿触发
EX0=1; // 开外中断0
IT1=1;//外中断1设置为下降沿触发
EX1=1;//开外中断1
EA=1;
ET0=1;
TI=1;
UART_init();
while(1){
display(yi,er,temp1,temp);
}
}
/*********发送一个字节******/
void send_byte(uchar by)
{
SBUF = by;
while(!TI);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里
TI = 0; //在这里将TI清零
}
/*********发送一个字符串*********/
void send_string(uchar *p)
{
while(*p!= '\0')
{
send_byte(*p);
p++;
}
}
void UART1(void) interrupt 4 // 串行口1中断函数
//com6
{
if(TI)
{
TI = 0;
}
if(RI)
{ PX1=1;
RI = 0;
num1 = SBUF;
//num1++;
SBUF = num1; // 启动数据发送过程
if(SBUF=='*')
{
//UART_init();
// send_string("w1");
TR0=1;
delay(100);
printf_String();
delay(100);
//printf_String1();
delay(100);
}
}
}
void TIME0(void) interrupt 1
{
TH0 = 0x0D8;
TL0 = 0x0F0;//定时10ms
time++;
if(time==50)//0.5秒到
{
time=0;
temp++;
if(temp==10)
{
temp=0;
temp1=temp1+1;
}
}
}
/*******外中断1**************/
/*void init2(void) interrupt 2
{
if(k4==0){
TR0=0;
delay(50);
//printf_String();
}
} */
还请各位大佬指教一下,问题出现在了哪里?
|