基于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; //定时器工作在方式2
TH1 = 0xfd; //9600波特率
TL1 = 0xfd;
EA = 1; //总中断
TR1 = 1;
REN=1;//允许串口接收
ES = 1; //允许中断
}
//定时器初始化
void Init_Time()
{
//初始化定时器10ms
TMOD|=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;//10MS
TL0=(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设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)等。具体内容如下,全网最全! !
可以关注下方公众号!
点赞分享一起学习成长。