|
小弟入門單片機(jī)不久,在寫一個(gè)小程序,目標(biāo)是從單片機(jī)從串口發(fā)送數(shù)據(jù)給單片機(jī),單片機(jī)接受數(shù)據(jù)放進(jìn)數(shù)組,新數(shù)據(jù)來到后和之前數(shù)組中的數(shù)據(jù)進(jìn)行比較,如果相同不進(jìn)入數(shù)組,不相同就進(jìn)入數(shù)組,最后輸出數(shù)組中元素的個(gè)數(shù),顯示到數(shù)碼管上。
這個(gè)是程序,單片機(jī)也可以從正常接收到數(shù)據(jù),但是無法輸出正確的個(gè)數(shù)…,而且………這款單片機(jī)為什么只能用4800的波特率發(fā)送數(shù)據(jù)啊,只要用其他的波特率都會(huì)出錯(cuò)???求大佬們幫忙找到程序中的錯(cuò)誤,給我一些篩選比較方面的提示。。。
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include "intrins.h"
- #include "stdio.h"
- typedef unsigned int uint; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char uchar;
- #define RX0_Lenth 200
- uint date,count;
- char TimeOut;
- char idata shuzu[];
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit Key_U=P3^2;
- uint count=1;
- uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9的值
- uchar disp[4];
- void xianshi()
- {
- disp[0]=smgduan[count/1000];//千位
- disp[1]=smgduan[count%1000/100];//百位
- disp[2]=smgduan[count%1000%100/10];//十位
- disp[3]=smgduan[count%1000%100%10];//個(gè)位
- }
- void InitUART() //串口1設(shè)置 上位機(jī)通訊
- {
- TMOD = 0x20;
- SCON = 0x50;
- PCON = 0x80; //加倍后為19200
- TH1 = 0xF3;//2400,加倍后為4800
- TL1 = TH1;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /****************串行口1字節(jié)發(fā)送****************/
- void UART_SendOneByte(unsigned char c)
- {
- SBUF = c;
- while(!TI); //若TI=0,在此等待
- TI = 0;
- }
- /****************串行口1字符發(fā)送****************/
- void SendStr1(unsigned char *s)
- {
- while(*s!='\0') //通過檢測是否字符串末尾
- {
- UART_SendOneByte(*s);
- s++;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
- *******************************************************************************/
- void delay(uint i)
- {
- while(i--);
- }
- void Delayms(unsigned int t) //@12.000MHz
- {
- unsigned char a,b;
- while(t--)
- {
- for(b=18;b>0;b--)
- for(a=152;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : DigDisplay
- * 函數(shù)功能 : 數(shù)碼管動(dòng)態(tài)掃描函數(shù),循環(huán)掃描8個(gè)數(shù)碼管顯示
- *******************************************************************************/
- void DigDisplay()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- }
- P0=disp[3-i];//發(fā)送段碼
- delay(100); //間隔一段時(shí)間掃描
- P0=0x00;//消隱
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- InitUART();
- while(1);
- /*while(1)
- {
- if(!Key_U) //判斷按鍵是否按下
- {
- Delayms(5); //延時(shí)消抖
- if(!Key_U) //判斷按鍵是否按下
- {
- while(!Key_U); //等待按鍵松開
- SendStr1("\nU\r"); //發(fā)送<LF>U<CR> 多標(biāo)簽讀取指令
- }
- }
- xianshi();
- DigDisplay(); //數(shù)碼管顯示函數(shù)
- }*/
- }
- void UART_1Interrupt() interrupt 4 //串口1接收程序
- {
- uint i;
- if(RI)
- {
- for(i=0;i<count;i++)
- {
- date = SBUF;
- if(date != shuzu[i+1] )
- {
- if(count >= RX0_Lenth) count = 0;
- shuzu[count] = date;
- count++;
- }
- }
- RI=0;
- SBUF = count;
- while(!TI);
- TI=0;
- // TimeOut = 5;
- }
- }
復(fù)制代碼
我用的就是這款開發(fā)版,波特率只能是4800,只要是其他的波特率就會(huì)出錯(cuò)。。。 |
-
|