標題:
關于兩個單片機通信中接收方設置問題
[打印本頁]
作者:
wh132987
時間:
2021-3-20 10:48
標題:
關于兩個單片機通信中接收方設置問題
先說一下目的:兩個單片機,發(fā)送方稱為A,接收方稱為B,F(xiàn)在是想通過A的物理按鍵發(fā)送給B一個指令,讓其開始計時,并輸出相應的字符串到串口助手上面,然后通過按下B的物理按鍵停止計時,并輸出相應的字符串給串口助手顯示。
目前遇到的情況是指令發(fā)送,開始計時并輸出相應的字符串到串口助手上面,這些都可以實現(xiàn)。但是停止計時按鍵按下的時候卻出現(xiàn)了問題,不發(fā)送并且數(shù)碼管顯示也出現(xiàn)了異常(圖1)
IMG_20210320_103427.jpg
(10.45 MB, 下載次數(shù): 64)
下載附件
2021-3-20 10:47 上傳
以下是接收方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個字節(jié)的數(shù)據(jù)
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) //延時函數(shù)
{
uint j,k;
for(j=i;j>0;j--)
for(k=500;k>0;k--);
}
/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display(uchar yi,uchar er,uchar san,uchar si) //顯示函數(shù)
{
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計數(shù),S1ST2=1
// 下面代碼設置定串口1
SCON = 0x50; // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接收)
// 下面代碼設置中斷
ES = 1; // 開串口1中斷
EA = 1; // 開總中斷
TI=1;
}
/***********************
主函數(shù)
**************************/
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; // 雙端模式。用于數(shù)碼管的顯示
TH0=0x0D8;
TL0=0x0F0;
IT0=1; // 外中斷0設置為下降沿觸發(fā)
EX0=1; // 開外中斷0
IT1=1;//外中斷1設置為下降沿觸發(fā)
EX1=1;//開外中斷1
EA=1;
ET0=1;
TI=1;
UART_init();
while(1){
display(yi,er,temp1,temp);
}
}
/*********發(fā)送一個字節(jié)******/
void send_byte(uchar by)
{
SBUF = by;
while(!TI);//當寫下這句的時候,就不要在中斷函數(shù)里面在寫TI = 0;這句了,不然進入中斷函數(shù)將TI清零之后,程序就會一直卡在這里
TI = 0; //在這里將TI清零
}
/*********發(fā)送一個字符串*********/
void send_string(uchar *p)
{
while(*p!= '\0')
{
send_byte(*p);
p++;
}
}
void UART1(void) interrupt 4 // 串行口1中斷函數(shù)
//com6
{
if(TI)
{
TI = 0;
}
if(RI)
{ PX1=1;
RI = 0;
num1 = SBUF;
//num1++;
SBUF = num1; // 啟動數(shù)據(jù)發(fā)送過程
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();
}
} */
還請各位大佬指教一下,問題出現(xiàn)在了哪里?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1