|
問題說明:我設置的波特率是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()
- {
question3.png (12.03 KB, 下載次數: 76)
下載附件
2019-6-7 20:32 上傳
- 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;
- }
-
- }
復制代碼
下面就是串口通訊的錯誤結果
|
|