這是學單片機以來做的第二個實驗內容 ,文件含proteus仿真工程以及keil源文件,功能(如下)都已經(jīng)實現(xiàn)。新人第一次發(fā)分享的帖子,請大家多多指教。
單片機功能;在二個單片機之間編程實現(xiàn)串行口通訊,發(fā)送方以流水燈字節(jié)碼作為發(fā)送數(shù)據(jù)定時發(fā)送,并在接收方的 P0 口上顯示接收到的字節(jié),在數(shù)碼屏上以十六進制顯示,中間有按鈕可以啟動和暫停。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
屏幕截圖 2024-06-26 091050.png (187.15 KB, 下載次數(shù): 15)
下載附件
2024-6-26 09:11 上傳
發(fā)送方源碼- #include<reg51.h>
- #define uchar unsigned char
- uchar code Tab[16]={0xC0,/*0*/
- 0xF9,/*1*/
- 0xA4,/*2*/
- 0xB0,/*3*/
- 0x99,/*4*/
- 0x92,/*5*/
- 0x82,/*6*/
- 0xF8,/*7*/
- 0x80,/*8*/
- 0x90,/*9*/
- 0x88,/*A*/
- 0x83,/*B*/
- 0xC6,/*C*/
- 0xA1,/*D*/
- 0x86,/*E*/
- 0x8E /*F*/};
- uchar Counter=0;Second_1=0,Second_0=0;
- sbit Key = P3^2;
-
- void Display(void);
- void Delay(void);
- void UARTInit(void);
- void UARTSend(uchar data1);
- void timer0Init(void);
-
- void main()
- {
- P1=0xff;//給流水燈初始化值
- UARTInit();//串口初始化
- timer0Init();//定時器初始化
- while(1)
- {
- if(Key == 0)
- {
- EA = 1; //打開總中斷
- }
- if(Key == 1)
- {
- EA = 0; //關閉總中斷
- }
- Display();//數(shù)碼管顯示函數(shù)
- }
- }
- void Display(void)
- {
- switch (P1)//根據(jù)P1的值給數(shù)碼管賦值
- {
- case 0xFE:{Second_1 = 15, Second_0 = 14; break;}
- case 0xFD:{Second_1 = 15, Second_0 = 13; break;}
- case 0xFB:{Second_1 = 15, Second_0 = 11; break;}
- case 0xF7:{Second_1 = 15, Second_0 = 7 ; break;}
- case 0xEF:{Second_1 = 14, Second_0 = 15; break;}
- case 0xDF:{Second_1 = 13, Second_0 = 15; break;}
- case 0xBF:{Second_1 = 11, Second_0 = 15; break;}
- case 0x7F:{Second_1 = 7 , Second_0 = 15; break;}
- default: break;
- }
- P0=Tab[Second_1];
- P2=0x01;
- Delay();
- P2=0x00;
- P0=Tab[Second_0];
- P2=0x02;
- Delay();
- P2=0x00;
- }
- void timer0Init()
- {
- EA = 1; //打開總中斷
- ET0 = 1;//打開定時器0中斷
- TR0 = 1; //啟動定時器0
- REN = 1;//允許串口接收
- TMOD |= 0X01; //定時器工作模式1,16位定時模式
- TH0=0x3c;
- TL0=0xb0;
- }
- //串口初始化
- void UARTInit()
- {
- EA = 1; //打開總中斷
- ES = 1; //打開串口中斷
- SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可變
- REN = 1;//串口允許接收
- TR1 = 1;//啟動定時器1
- TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
- TH1 = 0xfd;
- TL1 = 0xfd;//設置比特率9600
- }
- void Timer0() interrupt 1
- {
- ET0=0;
- TH0=0x3c;
- TL0=0xb0;
- Counter++;
- if(Counter==20)
- {
- Counter=0;
- P1<<=1;//左移一位
- P1|=0x01;//最后一位補1
- if(P1==0xff)//檢測是否移到最左端
- {
- P1=0xfe;
- }
- UARTSend(P1);//串口發(fā)送流水燈的值
- }
- ET0=1;
- }
- // 串口發(fā)送函數(shù)
- void UARTSend(uchar data1)
- {
- SBUF = data1;
- while(!TI);
- TI = 0;
- }
- void Delay(void)
- {
- uchar data i;
- for(i=500;i>0;i--);
- }
復制代碼 接收方源碼- #include <reg51.h>
- #define uchar unsigned char
- uchar code Tab[16]={0xC0,/*0*/
- 0xF9,/*1*/
- 0xA4,/*2*/
- 0xB0,/*3*/
- 0x99,/*4*/
- 0x92,/*5*/
- 0x82,/*6*/
- 0xF8,/*7*/
- 0x80,/*8*/
- 0x90,/*9*/
- 0x88,/*A*/
- 0x83,/*B*/
- 0xC6,/*C*/
- 0xA1,/*D*/
- 0x86,/*E*/
- 0x8E /*F*/};
- uchar Counter=0;Second_1=0,Second_0=0;
- uchar receivedData = 0;//串口接收數(shù)據(jù)
-
- void Display(void);
- void Delay(void);
- void UARTInit(void);
-
- void main()
- {
- P1=0xff;//給初始化值
- UARTInit(); // 初始化串口
- while (1)
- {
- Display();//數(shù)碼管顯示函數(shù)
- }
- }
- void Display(void)
- {
- switch (P1)
- {
- case 0xFE:{Second_1 = 15, Second_0 = 14; break;}
- case 0xFD:{Second_1 = 15, Second_0 = 13; break;}
- case 0xFB:{Second_1 = 15, Second_0 = 11; break;}
- case 0xF7:{Second_1 = 15, Second_0 = 7 ; break;}
- case 0xEF:{Second_1 = 14, Second_0 = 15; break;}
- case 0xDF:{Second_1 = 13, Second_0 = 15; break;}
- case 0xBF:{Second_1 = 11, Second_0 = 15; break;}
- case 0x7F:{Second_1 = 7 , Second_0 = 15; break;}
- default: break;
- }
- P0=Tab[Second_1];
- P2=0x01;
- Delay();
- P2=0x00;
- P0=Tab[Second_0];
- P2=0x02;
- Delay();
- P2=0x00;
- }
- //串口初始化
- void UARTInit()
- {
- EA = 1; //打開總中斷
- ES = 1; //打開串口中斷
- SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可變
- REN = 1;//串口允許接收
- TR1 = 1;//啟動定時器1
- TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
- TH1 = 0xfd;
- TL1 = 0xfd;//設置比特率9600
- }
- // 串口接收函數(shù)
- void UART() interrupt 4
- {
- if(RI)
- {
- RI = 0;
- receivedData = SBUF;
- P1 = receivedData;
- }
- else
- TI = 0;
- }
- void Delay(void)
- {
- uchar data i;
- for(i=500;i>0;i--);
- }
復制代碼
Proteus8.10 仿真程序:
基于單片機的雙機通信電路設計.7z
(66.14 KB, 下載次數(shù): 2)
2024-6-26 14:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|