|
问题说明:我设置的波特率是9600,然后这个程序就是笔记本发送数据给单片机,单片机马上原封不动地发送回去,但是在发送回来的时候发现缺位了,比如说我发送了一串数字2019060720055905,但是传回来的时候有时候就少了一位数字成了201906072055905,我想问下这是程序写的有什么问题吗,需要延时还是怎样?
- /*************************************************单纯串口通讯程序******************************************************/
- 先上程序
- #include <reg52.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- void SendStr(uchar *s);
- void InitUART()
- void main()
- {
- InitUART();
- SendStr("UART test");
- ES = 1
- while(1)
- {
- }
- }
- void SendByte(uchar dat)
- {
- SBUF = dat;
- while(!TI)
- TI=0;
- }
- void SendStr(uchar *s)
- {
- while(*s != '\0')
- {
- SendByte(*s);
- s++;
- }
- }
- void InitUART()
- {
- SCON = 0x50
- TMOD = 0x20;
- TH1 = 0xFD;
- TR1 = 1;
- EA = 1;
- }
- void UART_SER() interrupt 4
- {
- uchar temp;
- if(RI)
- {
- RI = 0;
- temp = SBUF;
- SBUF = temp;
- }
- if(TI)
- {
- TI = 0;
- }
- }
复制代码
/******************************************串口中断和定时器中断**********************************************/
我这里需要串口给单片机传时间数据,也需要定时器定时给数码管扫描显示数据,但是串口传给单片机的数据好像也不对,数码管显示的时间也不对,所以我觉得是不是两个中断会相互干扰,因为串口中断优先级比定时器0中断低,所以我特别设置了IP = 0x10,但是也没什么用,所以想来问下这其中到底有什么问题。下面是串口程序和定时器0程序。
- /**************串口程序***************/
- #include "UART.h"
- bit SetFlag;
- uchar time_buf2[16];
- void UART_Init()
- {
- SCON = 0X50;// SCON:模式1, 8-bit UART,
- TMOD |= 0x20;//TMOD: timer 1, mode 2, 8-bit
- TH1 = 0xFD; // TH1:波特率 9600 2
- TR1 = 1;
- EA = 1;
- ES = 1;
-
- }
- void UART() interrupt 4
- {
- uchar temp;
- static uchar i;
- if(RI)
- {
- RI = 0;
- temp = SBUF;
- time_buf2[i] = temp;
- i++;
- if(i == 16)
- {
- i = 0;
- SetFlag = 1;
- }
- SBUF = temp;
- }
- if(TI)
- {
- TI = 0;
- }
- }
- /*************定时器0程序***************/
- #include "Display.h"
- #include "Delay.h"
- uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar TempData[8];
- void Display(uchar firstbit, uchar num)
- {
- static uchar i = 0;
-
- DataPort=0; //Çå¿Õ¶ÎËø′æÖDμÄêy¾Y£¬·àÖ1óD½»ìæÖØó°
- Seg_Latch = 1;
- Seg_Latch = 0;
-
- DataPort = WeiMa[i+firstbit];
- Bit_Latch = 1;
- Bit_Latch = 0;
-
- DataPort = TempData[i];
- Seg_Latch = 1;
- Seg_Latch = 0;
-
- i++;
- if(i == num)
- {
- i = 0;
- }
- }
- void Init_Timer0()
- {
- TMOD |= 0x01;
- TH0 = (65535-2000)/256;
- TL0 = (65535-2000)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void Timer0() interrupt 1
- {
- static uchar num;
- TH0 = (65535-500)/256;
- TL0 = (65535-500)%256;
- Display(0,8);
- num++;
-
- if(num == 50)
- {
- num = 0;
- ReadTimeFlag = 1;
- }
-
- }
复制代码
下面就是串口通讯的错误结果
|
|