历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2021年10月19日 | 51单片机双向通信实例

2021-10-19 来源:eefocus

通过甲机按键控制点亮乙机LED灯,通过控制乙机按键向甲机发送数字,并且使用数码管显示。


电路原理图:

在这里插入图片描述

甲机代码:

#include

#define uchar unsigned char

#define uint unsigned int 


sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K1=P1^7;

uchar Operation_No=0; //操作代码

//数码管代码

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


//延时

void DelayMS(uint ms)

{

uchar i;

while(ms--) 

{

for(i=0;i<120;i++);

}

}

//向串口发送字符

void Putc_to_SerialPort(uchar c)

{

SBUF=c; 

while(TI==0); 

TI=0; //TI硬件置1,软件清0

}

//主程序

void main()

{

LED1=LED2=1; 

P0=0x00;

SCON=0x50;         //串口模式 1,允许接收

TMOD=0x20;        //T1 工作模式 2

PCON=0x00;         //波特率不倍增

TH1=0xfd; 

TL1=0xfd;    //9600

TI=RI=0;       //

TR1=1;

IE=0x90;        //允许串口中断

while(1)

{

DelayMS(100);

if(K1==0)       //按下 K1 时选择操作代码 0,1,2,3

{

while(K1==0); 

{

Operation_No=(Operation_No+1)%4;

}

 

switch(Operation_No)   //根据操作代码发送 A/B/C 或停止发送

{

case 0:    Putc_to_SerialPort('X'); LED1=LED2=1;break;

case 1:    Putc_to_SerialPort('A');LED1=~LED1;LED2=1;break;

case 2:    Putc_to_SerialPort('B'); LED2=~LED2;LED1=1; break;

case 3:    Putc_to_SerialPort('C'); LED1=~LED1;LED2=LED1; break;

}

}

}

}

//甲机串口接收中断函数

void Serial_INT() interrupt    4

{

if(RI)

{

RI=0;

if(SBUF>=0&&SBUF<=9) 

{

P0=DSY_CODE[SBUF];

}

else 

{

P0=0x00;

}

}

}


乙机代码:

#include

#define uchar unsigned char

#define uint unsigned int 

sbit LED1=P1^0;

sbit LED2=P1^3; 

sbit K2=P1^7; 

uchar NumX=-1;

//延时

void DelayMS(uint ms)

{

uchar i;

while(ms--) 

{

for(i=0;i<120;i++);

}

}

//主程序

void main()

{

LED1=LED2=1;

SCON=0x50;         //串口模式 1,允许接收

TMOD=0x20;        //T1 工作模式 2



TH1=0xfd;            //波特率 9600

TL1=0xfd;

PCON=0x00;         //波特率不倍增

RI=TI=0; 

TR1=1; 

IE=0x90; 

while(1)

{

DelayMS(100);

if(K2==0)

{

while(K2==0);

NumX=++NumX;   //产生 0~10 范围内的数字,其中 10 表示关闭

SBUF=NumX; 

if(NumX==10)

{

NumX=-1;

}

while(TI==0); 

TI=0; //TI硬件置1,软件清0

}

}

}

void Serial_INT() interrupt 4

{

if(RI)      //如收到则 LED 则动作

{

RI=0;

switch(SBUF) //根据所收到的不同命令字符完成不同动作

{

case 'X':  LED1=LED2=1;break;       //全灭

case 'A':  LED1=0;LED2=1;break;    //LED1 亮 

case 'B':  LED2=0;LED1=1;break;    //LED2 亮 

case 'C':  LED1=LED2=0;            //全亮

}

}

}


效果截图:

 搜索

会员中心 

收藏

动态

消息

创作

51单片机双向通信实例

青烨慕容 2020-05-06 09:16:53  2089 51单片机

51单片机专栏收录该内容

18 篇文章2 订阅

订阅专栏

  通过甲机按键控制点亮乙机LED灯,通过控制乙机按键向甲机发送数字,并且使用数码管显示。

电路原理图:

在这里插入图片描述

甲机代码:

#include
#define uchar unsigned char
#define uint unsigned int 

sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K1=P1^7;
uchar Operation_No=0; //操作代码
//数码管代码
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延时
void DelayMS(uint ms)
{
	uchar i;
	while(ms--) 
	{
		for(i=0;i<120;i++);
	}
		
}
//向串口发送字符
void Putc_to_SerialPort(uchar c)
{
	SBUF=c; 
	while(TI==0); 
	TI=0; //TI硬件置1,软件清0
}
//主程序
void main()
{
	LED1=LED2=1; 
	P0=0x00;
	SCON=0x50;         //串口模式 1,允许接收
	TMOD=0x20;        //T1 工作模式 2
	PCON=0x00;         //波特率不倍增
	TH1=0xfd; 
	TL1=0xfd;   			//9600
	TI=RI=0;       //
	TR1=1;
	IE=0x90;        //允许串口中断
	while(1)
	{
		DelayMS(100);
		if(K1==0)       //按下 K1 时选择操作代码 0,1,2,3
		{
		while(K1==0); 
			{
				Operation_No=(Operation_No+1)%4;
			}
			
		 
		switch(Operation_No)   //根据操作代码发送 A/B/C 或停止发送
			{
				case 0:    Putc_to_SerialPort('X'); LED1=LED2=1;break;
				case 1:    Putc_to_SerialPort('A');LED1=~LED1;LED2=1;break;
				case 2:    Putc_to_SerialPort('B'); LED2=~LED2;LED1=1; break;
				case 3:    Putc_to_SerialPort('C'); LED1=~LED1;LED2=LED1; break;
			}
		}
	}
}
//甲机串口接收中断函数
void Serial_INT() interrupt    4
{
	if(RI)
	{
		RI=0;
		if(SBUF>=0&&SBUF<=9) 
		{
			P0=DSY_CODE[SBUF];
		}
			
		else 
		{
			P0=0x00;
		}
			
	}
} 

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182

乙机代码:

#include
#define uchar unsigned char
#define uint unsigned int 
sbit LED1=P1^0;
sbit LED2=P1^3; 
sbit K2=P1^7; 
uchar NumX=-1;
//延时
void DelayMS(uint ms)
{
	uchar i;
	while(ms--) 
	{
		for(i=0;i<120;i++);
	}
		
}
//主程序
void main()
{
	LED1=LED2=1;
	SCON=0x50;         //串口模式 1,允许接收
	TMOD=0x20;        //T1 工作模式 2


	TH1=0xfd;            //波特率 9600
	TL1=0xfd;
	PCON=0x00;         //波特率不倍增
	RI=TI=0; 
	TR1=1; 
	IE=0x90; 
	while(1)
	{
		DelayMS(100);
		if(K2==0)
		{
			while(K2==0);
			NumX=++NumX;   //产生 0~10 范围内的数字,其中 10 表示关闭
			SBUF=NumX; 
			if(NumX==10)
			{
				NumX=-1;
			}
			while(TI==0); 
			TI=0; //TI硬件置1,软件清0
		}
	}
}
void Serial_INT() interrupt 4
{
	if(RI)      //如收到则 LED 则动作
	{
		RI=0;
		switch(SBUF) //根据所收到的不同命令字符完成不同动作
		{
			case 'X':  LED1=LED2=1;break;       //全灭
			case 'A':  LED1=0;LED2=1;break;    //LED1 亮 
			case 'B':  LED2=0;LED1=1;break;    //LED2 亮 
			case 'C':  LED1=LED2=0;            //全亮
		}
	}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263

效果截图:

在这里插入图片描述


推荐阅读

史海拾趣

骅讯(Cmedia)公司的发展小趣事

进入21世纪后,随着USB技术的普及,骅讯公司迅速抓住市场机遇,进军USB音频业务。凭借其在音频技术领域的深厚积累,骅讯成功开发出多款USB音频产品,并在市场上取得了良好的反响。这一举措不仅拓展了骅讯的业务范围,也为其在音频领域的持续发展奠定了坚实的基础。

BRIGHT公司的发展小趣事

BRIGHT公司不仅在电子产品领域取得了成功,还积极拓展酒店业务。他们成立了伯瑞特酒店集团,并在全国范围内开设了多家酒店。这些酒店以高品质的服务和独特的文化特色赢得了广大消费者的喜爱。其中,宁波伯瑞特酒店荣获了全国钻级酒店评定中的五钻酒家称号,千岛湖伯瑞特度假酒店也获得了金鼎特色文化主题饭店的荣誉。这些荣誉的获得不仅彰显了BRIGHT公司在酒店业务方面的实力,也为其未来的发展奠定了坚实的基础。

浙江东亚电子(DongYa)公司的发展小趣事

浙江东亚电子注重企业文化的建设,致力于为员工提供一个良好的工作环境和发展平台。公司关注员工的学习和成长,为员工提供持续长效的发展机会和有竞争力的薪酬。同时,公司还积极开展各类文化活动和社会公益活动,增强员工的归属感和凝聚力。

这些故事框架展示了浙江东亚电子在电子行业中发展起来的几个重要方面。通过技术创新、产业布局拓展、国际市场开拓、品质管理提升和企业文化建设等方面的努力,公司不断壮大自身实力,成为行业内的佼佼者。

GREEGOO公司的发展小趣事
加大时钟信号线路的电线直径,降低线路的电阻和电容,从而减少信号的衰减。
AIM - American Iron and Metal公司的发展小趣事

在电子行业的初期,AIM主要以传统的铁和金属加工业务为主。然而,随着电子技术的迅猛发展,公司管理层意识到转型的必要性。AIM开始投资研发,逐步将业务扩展到电子元件和设备的制造领域。通过引进先进的生产线和技术人才,AIM成功开发出一系列高性能的电子零部件,逐渐在市场中站稳脚跟。

Beta Dyne Inc公司的发展小趣事

Beta Dyne Inc最初是一家专注于研发新型半导体材料的小型创业公司。在创始人的带领下,公司成功研发出一种具有高效能、低功耗特性的新材料,这一技术突破迅速引起了业界的关注。随后,Beta Dyne积极与各大电子设备制造商合作,将其新材料应用于智能手机、平板电脑等消费电子产品中,成功开拓了新的市场。

问答坊 | AI 解惑

CAD-CAM数据转换的新标准

电子行业制造自功化是世界发展的趋势,电子产品设计复杂化,产品生命周期越来越短。将计算机、网络、先进的管理软件应用于电子制造,日益被各先进国家及厂商所重视,CAM文件格式的改进工作都有相应的进展并己经有所应用,国内未能进行相应研究。 ...…

查看全部问答>

DAC0832中文资料

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 前几天用的,网上下的,在这分享一下  …

查看全部问答>

嵌入式系统工程师的十个不要

1. 不要第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。         2. 初学者请不要看太多的书那会误人子弟的。先找一本好书系统的学习。很多人用了很久都是 ...…

查看全部问答>

初学VxWorks,求VxWorks书籍下载地址?

那位大哥给我一个VxWorks初学者书籍的下载地址?谢谢大哥大姐!!!!!…

查看全部问答>

座机电话如何实现全双工通信?

小菜鸟提问:电话的两根平行线是如何实现全双工通信的 如题对于座机电话如何用两根平行线就实现全双工通信一直很是困惑,希望哪位大虾指教。见笑见笑。 再一个问题就是一般的座机电话在平时不通话时(并且无人拨打)时,两根电话线上的信号是如 ...…

查看全部问答>

Windows CE系统 platform builder仿真系统黑屏问题

我用的是WinCE5.0 platform builder . 在建系统时 编译没有问题 但Attach Device后模拟器黑屏 看过以前的帖子 已经把分辨率调到640*480 内存开到128 可是还是建好后还是黑屏 等了很长时间都不行 不知道怎么回事 请高手解决一下…

查看全部问答>

DSP2000/6000、FPGA入门学习

4月21日(本周六),在北理工,选取目前最流行的嵌入式协处理器DSP和FPGA,基中DSP选取TI公司的2000和6000两个系列专题,希望通过本次活动半天的时间使大家快速了解DSP和FPGA的关键技术。 活动详情:http://www.farsight.com.cn/lecture/L070421.a ...…

查看全部问答>

望牛人指导C51对直流电机的PID控制程序!!!!

本帖最后由 paulhyde 于 2014-9-15 03:16 编辑 小弟比赛在即,望大家帮忙!    …

查看全部问答>

【MP430共享】鑫海宝贝发帖汇总(维普万方论文集)

鑫海宝贝兄弟,你发的同类型帖子太多了,眼睛都看不过来,严重影响大家查找资料,我帮你汇总一下,希望不要介意   【MP430共享】具有检测电池容量功能的充电器设计https://bbs.eeworld.com.cn/thread-301578-1-1.html  【MP430共享】 ...…

查看全部问答>