西建大单片机课设记录
我本人做的单片机课设是篮球记分牌,根据课设内容要求作出的仿真图和C语言程序。如有问题,请联系我。
课设要求
- 设计内容
(1)选择51单片机,晶振采用12MHz。
(2)按下启动按钮时K0双方显示的初始分数复位为00(四位数码管双方各用两位显示分数)。
(3)按下红、蓝两个按钮实现为各方分数加1、加2、加3的功能,按钮(K1和K2)。
(4)计分范围为00~99。
(5)按键按下时有提示音,当有键按下时蜂鸣器发出声音,按键释放时停止发音。
Proteus仿真图
最小系统
显示系统
分别显示蓝红两队的分数,前两位是蓝队分数,后两位是红队分数
本作品采用的是共阴数码管,如果要采用共阳数码管,请自己改变相应引脚连接及代码部分。
加分系统
不同的按键对应不同的分数,为了美观及提示作用在按键前添加了LED灯,增加的电阻是为了防止电流过大,LED灯损坏。按键按下时,灯亮,蜂鸣器响,按键释放时,灯灭,蜂鸣器停。
提醒系统
当有按键按下时,P3^7输出高电平,经放大电路放大,蜂鸣器响,如蜂鸣器不响,先检查电路,电路正确的话,可能是蜂鸣器默认值的问题,双击蜂鸣器,改变默认值(12V改为5V)
Keil程序(C语言)
#include <reg51.h>
#define BLUEDUAN P0 //定义P0口为段选位
#define WEI P1 //定义P1口为位选位
#define REDDUAN P0 //
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};//共阴数码管cc
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
sbit K1=P3^0; //BLUE+1
sbit K2=P3^1; //RED+1
sbit K3=P3^2; //B+2
sbit K4=P3^3;//R+2
sbit K5=P3^4;//B+3
sbit K6=P3^5;//R+3
sbit K7=P3^6;//00
sbit BUZZ=P3^7; //buzz
uchar BLUEnum,REDnum,a;//BLUE队分数 RED队分数
//*****延时函数*****//
void delay(unsigned int a) //12.00MHz
{
unsigned i,j;
for(i=a;i>0;i--)
for(j=120;j>0;j--);
}
//*****主函数部分*****//
void main()
{BUZZ=0;//关闭蜂鸣器
if(BLUEnum>99)
{BLUEnum=99;}
if(REDnum>99)
{REDnum=99;}//当某队分数达到99时,分数归零,即0~99
while(1)
{
/显示/
WEI=0xff; //数码管显示位控制
WEI=0xfe; //1
BLUEDUAN=table[BLUEnum/10]; //BLUEnum十位
delay(5); //延时5ms
WEI=0xff; //全灭
WEI=0xfc; //2
BLUEDUAN=table[BLUEnum%10]; //BLUEnum个位
delay(5); //延时5ms
WEI=0xff; //全灭
WEI=0xfb; //3
REDDUAN=table[REDnum/10]; //REDnum十位
delay(5); //延时5ms
WEI=0xff; //全灭
WEI=0xf7; //4
REDDUAN=table[REDnum%10]; //REDnum个位
delay(5);// 延时5ms
/00///
if(!K7)
{delay(10);//按键消抖
if(!K7)
{BUZZ=1;
REDnum=0;//RED==0
BLUEnum=0;//BLUE==0
while(!K7);//等待按键释放
}
}
/BLUE+1/
if(!K1)
{
delay(10); //按键消抖
if(!K1)
{BUZZ=1; //蜂鸣器响
BLUEnum++; //BLUE+1
while(!K1); //等待按键释放
}
}
/RED+1/
if(!K2)
{
delay(10); //按键消抖
if(!K2)
{BUZZ=1;
REDnum++; //RED+1
while(!K2); //等待按键释放
}
}
/BLUE+2/
if(!K3)
{
delay(10); //按键消抖
if(!K3)
{BUZZ=1;
BLUEnum+=2; //BLUE+2
while(!K3); //等待按键释放
}
}
/RED+2/
if(!K4)
{
delay(10); //按键消抖
if(!K4)
{BUZZ=1;
REDnum+=2; //RED+2
while(!K4); //等待按键释放
}
}
/BLUE+3/
if(!K5)
{
delay(10); //按键消抖
if(!K5)
{BUZZ=1;
BLUEnum+=3; //BLUE+3
while(!K5); //等待按键释放
}
}
/RED+3/
if(!K6)
{
delay(10); //按键消抖
if(!K6)
{BUZZ=1;
REDnum+=3; //RED+1
while(!K6); //等待按键释放
}
}
}
}
以上为我的简单介绍,如有问题请评论或私信留言。