|
問題說明:我設(shè)置的波特率是9600,然后這個(gè)程序就是筆記本發(fā)送數(shù)據(jù)給單片機(jī),單片機(jī)馬上原封不動(dòng)地發(fā)送回去,但是在發(fā)送回來的時(shí)候發(fā)現(xiàn)缺位了,比如說我發(fā)送了一串?dāng)?shù)字2019060720055905,但是傳回來的時(shí)候有時(shí)候就少了一位數(shù)字成了201906072055905,我想問下這是程序?qū)懙挠惺裁磫栴}嗎,需要延時(shí)還是怎樣?
- /*************************************************單純串口通訊程序******************************************************/
- 先上程序
- #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;
- }
- }
復(fù)制代碼
/******************************************串口中斷和定時(shí)器中斷**********************************************/
我這里需要串口給單片機(jī)傳時(shí)間數(shù)據(jù),也需要定時(shí)器定時(shí)給數(shù)碼管掃描顯示數(shù)據(jù),但是串口傳給單片機(jī)的數(shù)據(jù)好像也不對(duì),數(shù)碼管顯示的時(shí)間也不對(duì),所以我覺得是不是兩個(gè)中斷會(huì)相互干擾,因?yàn)榇谥袛鄡?yōu)先級(jí)比定時(shí)器0中斷低,所以我特別設(shè)置了IP = 0x10,但是也沒什么用,所以想來問下這其中到底有什么問題。下面是串口程序和定時(shí)器0程序。
- /**************串口程序***************/
- #include "UART.h"
- bit SetFlag;
- uchar time_buf2[16];
- void UART_Init()
- {
question3.png (12.03 KB, 下載次數(shù): 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;
- }
- }
- /*************定時(shí)器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;
- }
-
- }
復(fù)制代碼
下面就是串口通訊的錯(cuò)誤結(jié)果
|
|