基于51单片机的乒乓球小游戏
(仿真+程序)
功能介绍
具体功能:
1.用两块单片机串口进行通信;
2.一排LED模拟乒乓球运动(哪里亮表示运动到哪);
3.当最左边LED亮,表示球运动到左边,需要左方击球;
4.当最右边LED亮,表示球运动到右边,需要右方击球;
5.复位按键模拟发球;
演示视频:
基于51单片机的乒乓球小游戏
添加图片注释,不超过 140 字(可选)
主机程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/***公众号:木子单片机****/
uchar led_data=0x80;
uchar flag=0;
uchar send_data=0x80;
uchar send_flag=1;//************************************
//串口初始化
//************************************void Init_Uart()
{SCON = 0X50; //设置串口工作在方式1,允许接收TMOD |= 0x20; //定时器工作在方式2TH1 = 0xfd; //9600波特率TL1 = 0xfd;EA = 1; //总中断TR1 = 1;REN=1;//允许串口接收ES = 1; //允许中断
}
//定时器初始化
void Init_Time()
{//初始化定时器10msTMOD|=0X01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;
}//串口输出数据
void TX_data(uchar num)
{SBUF = num;while(!TI);TI=0;}void Ex0_Init() //外部中断
{EX0=1;//打开外部中断IT0=1;//下降沿中断
}//主函数
void main(void)
{Ex0_Init();Init_Uart(); //串口初始化Init_Time(); //定时器初始化while(1){ P0=~led_data;if(send_flag){TX_data(send_data);send_flag=0;}}
}
void EX0_INTER() interrupt 0 //外部中断1
{if(led_data==0x01)//刚好按下此时反向{flag=1;send_flag=1; send_data=0xff; }else{flag=2;led_data=0;send_flag=1; send_data=0; }
}
//串口中断子函数
void Uart_INT(void) interrupt 4
{uchar temp=0;if(RI==1) //如果接收到了数据 { RI=0; temp=SBUF;//接收数据if(temp==0xff){flag=0;led_data=0x80;}else{led_data=temp;}}
}//定时中断子程序
void time0(void) interrupt 1 using 1
{static uchar temp_time=0;TH0=(65536-10000)/256;//10MSTL0=(65536-10000)%256;if(++temp_time>=30)//1s{temp_time=0;if(flag==0) //左移{if(led_data==0x01)//移动到最左边也没有按键那就失败{led_data=0;flag=2;send_flag=1; send_data=0; return;}led_data=led_data>>1;;send_flag=1; send_data=led_data;}}}
硬件设计
使用元器件:
单片机:AT89C51;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
添加图片注释,不超过 140 字(可选)
设计资料
01仿真图
本设计使用proteus7.8版本设计,与其他版本不兼容!具体如图!
添加图片注释,不超过 140 字(可选)
02程序
本设计使用软件keil5版本编程设计!具体如图!
03设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)等。具体内容如下,全网最全! !
可以关注下方公众号!
点赞分享一起学习成长。