欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于單片機的雙機通信電路設計(十六進制)附仿真程序
[打印本頁]
作者:
2219945883
時間:
2024-6-26 09:13
標題:
基于單片機的雙機通信電路設計(十六進制)附仿真程序
這是學單片機以來做的第二個實驗內容 ,文件含proteus仿真工程以及keil源文件,功能(如下)都已經實現。新人第一次發分享的帖子,請大家多多指教。
單片機功能;在二個單片機之間編程實現串行口通訊,發送方以流水燈字節碼作為發送數據定時發送,并在接收方的 P0 口上顯示接收到的字節,在數碼屏上以十六進制顯示,中間有按鈕可以啟動和暫停。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
屏幕截圖 2024-06-26 091050.png
(187.15 KB, 下載次數: 15)
下載附件
2024-6-26 09:11 上傳
發送方源碼
#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();//數碼管顯示函數
}
}
void Display(void)
{
switch (P1)//根據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 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);//串口發送流水燈的值
}
ET0=1;
}
// 串口發送函數
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;//串口接收數據
void Display(void);
void Delay(void);
void UARTInit(void);
void main()
{
P1=0xff;//給初始化值
UARTInit(); // 初始化串口
while (1)
{
Display();//數碼管顯示函數
}
}
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
}
// 串口接收函數
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, 下載次數: 2)
2024-6-26 14:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1