這是關于串口通信的一個演示程序,功能是通過計算機發送數到單片機以數碼管范圍是(0-65535)的形式顯示,在演示過程中發現一到
32767也就是發送7fff之后的數據時數碼管亂碼
這是7fff數據的調試變量表
1.png (41.57 KB, 下載次數: 27)
下載附件
2021-4-18 22:07 上傳
這是0x8000的
2.png (41.75 KB, 下載次數: 33)
下載附件
2021-4-18 22:12 上傳
單片機源程序如下:
- #include <reg52.h>
- #define uchar unsigned char;
- #define uint unsigned int ;
- uint sw,w,q,bai,shi,ge,num1,num2,aa,num;
- //定義數組存儲數碼管碼值
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};
- uint arr[]={0,0,0};
- //配置管腳
- sbit dul=P2^6;
- sbit wel=P2^7;
- void UART_Init();
- void display();
-
- //定義延時函數
- void delay(unsigned int x)
- {
- unsigned int a;
- unsigned int b;
- for(a=0;a<x;a++)
- {
- for(b=0;b<110;b++)
- {
- }
- }
- }
-
- void main()
- {
- UART_Init();
- while(1)
- {
- display();
- }
- }
- void UART_Init()
- {
- TMOD=0x20; //定時器1設置位 8位自動重載計數器
- TH1 =0xfd; //設置波特率為9600
- TL1 =0xfd;
- SM0 = 0;
- SM1 = 1; //串口工作方式1,為10位數據異步收發器
- REN = 1;//允許接收
- EA = 1;
- ES = 1; //把串口中斷打開
- TR1= 1;
- aa=0;
- }
- void UART() interrupt 4
- {
- aa++;
- arr[aa]=SBUF;
- RI=0;
- if(aa==2)
- {
- num=arr[1]*256+arr[2];
- sw=num/100000;
- w=num/10000%10;
- q=num/1000%10;
- bai=num/100%10;
- shi=num/10%10;
- ge =num%10;
- aa=0;
- }
- }
- void display()
- {
- wel=1;
- P0=0xfe;
- wel=0;
-
- dul=1;
- P0=table[sw];
- dul=0;
- delay(1);
- P0=0xff;
-
- wel=1;
- P0=0xfd;
- wel=0;
-
- dul=1;
- P0=table[w];
- dul=0;
- delay(1);
- P0=0xff;
-
- wel=1;
- P0=0xfb;
- wel=0;
-
- dul=1;
- P0=table[q];
- dul=0;
- delay(1);
- P0=0xff;
-
- wel=1;
- P0=0xf7;
- wel=0;
-
- dul=1;
- P0=table[bai];
- dul=0;
- delay(5);
- P0=0xff;
-
- wel=1;
- P0=0xef;
- wel=0;
-
- dul=1;
- P0=table[shi];
- dul=0;
- delay(1);
- P0=0xff;
-
- wel=1;
- P0=0xDf;
- wel=0;
-
- dul=1;
- P0=table[ge];
- dul=0;
- delay(1);
- P0=0xff;
- }
復制代碼
我num數據類型定義位unsigned int型應該沒有溢出啊我實在搞不懂所以請教一下各位哥到底哪出問題了
|