|
小弟入门单片机不久,在写一个小程序,目标是从单片机从串口发送数据给单片机,单片机接受数据放进数组,新数据来到后和之前数组中的数据进行比较,如果相同不进入数组,不相同就进入数组,最后输出数组中元素的个数,显示到数码管上。
这个是程序,单片机也可以从正常接收到数据,但是无法输出正确的个数…,而且………这款单片机为什么只能用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,只要是其他的波特率就会出错。。。 |
|