|
小弟入門單片機不久,在寫一個小程序,目標是從單片機從串口發送數據給單片機,單片機接受數據放進數組,新數據來到后和之前數組中的數據進行比較,如果相同不進入數組,不相同就進入數組,最后輸出數組中元素的個數,顯示到數碼管上。
這個是程序,單片機也可以從正常接收到數據,但是無法輸出正確的個數…,而且………這款單片機為什么只能用4800的波特率發送數據啊,只要用其他的波特率都會出錯啊?!??求大佬們幫忙找到程序中的錯誤,給我一些篩選比較方面的提示。。。
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include "intrins.h"
- #include "stdio.h"
- typedef unsigned int uint; //對數據類型進行聲明定義
- 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];//個位
- }
- void InitUART() //串口1設置 上位機通訊
- {
- TMOD = 0x20;
- SCON = 0x50;
- PCON = 0x80; //加倍后為19200
- TH1 = 0xF3;//2400,加倍后為4800
- TL1 = TH1;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /****************串行口1字節發送****************/
- void UART_SendOneByte(unsigned char c)
- {
- SBUF = c;
- while(!TI); //若TI=0,在此等待
- TI = 0;
- }
- /****************串行口1字符發送****************/
- void SendStr1(unsigned char *s)
- {
- while(*s!='\0') //通過檢測是否字符串末尾
- {
- UART_SendOneByte(*s);
- s++;
- }
- }
- /*******************************************************************************
- * 函 數 名 : delay
- * 函數功能 : 延時函數,i=1時,大約延時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
- }
- }
- /*******************************************************************************
- * 函 數 名 : DigDisplay
- * 函數功能 : 數碼管動態掃描函數,循環掃描8個數碼管顯示
- *******************************************************************************/
- void DigDisplay()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- switch(i) //位選,選擇點亮的數碼管,
- {
- 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];//發送段碼
- delay(100); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- InitUART();
- while(1);
- /*while(1)
- {
- if(!Key_U) //判斷按鍵是否按下
- {
- Delayms(5); //延時消抖
- if(!Key_U) //判斷按鍵是否按下
- {
- while(!Key_U); //等待按鍵松開
- SendStr1("\nU\r"); //發送<LF>U<CR> 多標簽讀取指令
- }
- }
- xianshi();
- DigDisplay(); //數碼管顯示函數
- }*/
- }
- 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;
- }
- }
復制代碼
我用的就是這款開發版,波特率只能是4800,只要是其他的波特率就會出錯。。。 |
|