這個是pc機和單片機的通信,程序沒問題,但顯示出來的是亂碼,使用VSPD虛擬串口軟件調試。望各位大俠幫忙指導!
- #include<reg52.h>
- #include<intrins.h>
- #include<stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define FREQ 11059200 //振蕩器頻率11.0592Mhz
- uchar code SEG_CODE[]= //共陰數碼管數字段碼表,最后為“-”的段碼
- {0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40};
- uchar R[]={10,10,10,10}; //保存接收到的四位數字(初始時為4個“-”)
- //延時程序
- void delay_ms(uint x)
- {
- uchar t;
- while(x--)
- {
- for(t=0;t<120;t++);
- }
- }
- //初始化串口(使用time1定時器)
- void init_usart_ut1()
- {
- SCON=0X50; //串口方式1
- TMOD=0X20; //t1工作于方式2(8位自動重裝)
- PCON=0X80; //波特率不倍增
- TH1=TL1=-FREQ/384/9600; //波特率配置(TH1=TL1=0XFD)
- //或:TH1=TL1=256-FREQ/384/9600;
- TR1=1; //啟動定時器1
- }
- //串口初始化(使用t2定時器)(當T2CON寄存器的RCLK,TCLK二者之一置位
- //t2即工作于波特率發生器模式,TH2-TL2溢出時,RCAP2H-RCAP2L重裝TH2-TL2)
- void init_usart_ut2()
- {
- RCAP2H=0XFF; //波特率配置(RCAP2H=0XFF)
- RCAP2L=-FREQ/32/9600; //波特率配置(RCAP2L=0XDC)
- //或:RCAP2L=256-FREQ/32/9600;
- SCON=0X50; //串口方式1
- T2CON=0X30; //收/發時鐘位:RCLK,TCLK同時置位
- PCON=0X00; //波特率不倍增
- TR2=1; //啟動定時器t2
- }
- //主程序
- main()
- {
- uchar i;
- init_usart_ut2(); //串口初始化(使用timer2定時器)
- //或:init_usart_ut1(); //串口初始化(使用timer1定時器)
- EX0=1; IT0=1; //允許外部中斷0,下降沿觸發
- ES=1; //允許串口中斷
- EA=1; //開中斷
- while(1)
- {
- for(i=0;i<4;i++) //循環先掃描顯示4個數字字符
- {
- P0=0X00; //先暫時關閉段碼
- P2=~(1<<i); //發送位碼
- P0=SEG_CODE[R[i]]; //發送段碼
- delay_ms(4); //位間短暫延時
- }
- }
- }
- //串口接收中斷
- void receive_4_digit() interrupt 4
- {
- static uchar i=0; //接收緩沖索引(靜態變量)
- uchar c; //當前接收的字符
- if(RI) //接收中斷標志位判斷
- {
- RI=0; //軟件清零中斷標志位
- c=SBUF; //從SBUF寄存器讀取字符
- if(c=='#') //接收時遇到‘#’則將接收索引清零
- {
- i=0;
- }
- else
- {
- if(c>='0'&&c<='9') //遇到數字0-9時從當前位置循環存放
- {
- R[i++]=c-'0'; //存入R數組當前位置,索引遞增
- if(i==4) //索引范圍限于0-3
- {
- i=0;
- }
- }
- }
- }
- }
- //INT0中斷發送字符串
- void EX_INT0() interrupt 0
- {
- uchar *s="這是由8051單片機發送的字符串!!!\r\n";
- uchar i=0;
- while(s[i]!='\0')
- {
- SBUF=s[i++]; //發送1字節,索引遞增
- while(TI==0) //等待發送完畢
- {
- TI=0; //軟件清零中斷標志位TI
- }
- }
- }
復制代碼
|