前段时间帮别人搞毕设用普中的开发板进行了验证,下面是按键说明与接线图:
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- //uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
- //这三个引脚参考资料
- sbit E=P2^7; //1602使能引脚
- sbit RW=P2^5; //1602读写引脚
- sbit RS=P2^6; //1602数据/命令选择引脚
- sbit beep=P1^5; //蜂鸣器
- bit beep_flag;
- sbit start_game=P3^7;
- sbit pause=P3^6;
- bit run_off;
- uchar game_time_min=12;
- uchar game_time_sec=0;
- uchar game_num=1;
- sbit P24=P2^4;
- sbit P23=P2^3;
- sbit P22=P2^2;
- sbit P21=P2^1;
- sbit P20=P2^0;
- #define FOSC 11059200L
- #define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode
- uint count,count1,count2;
- uchar r_b,r_s,r_g,b_s,b_b,b_g; //红分和黑分的百十个
- bit h_h; //红黑方加减分标志
- uchar second_s,second_g; //倒计时的十和个
- bit updata=0;
- #define left 15
- #define right 3
- #define add_score 7
- #define sub_score 11
- #define start 14
- #define stop 2
- bit start_24sec=0;
- bit game_over;
- void add_score_function();
- void sub_score_function();
- void redisplay();
- /********************************************************************
- * 名称 : Delay_1ms()
- * 功能 : 延时子程序,延时时间为 1ms * x
- * 输入 : x (延时一毫秒的个数)
- * 输出 : 无
- ***********************************************************************/
- void Delay_1ms(uint i)//1ms延时
- {
- uchar x;
- uint j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++)
- ;
- }
- /********************************************************************
- * 名称 : delay()
- * 功能 : 延时,延时时间大概为140US。
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void delay()
- {
- int i,j;
- for(i=0; i<=10; i++)
- for(j=0; j<=2; j++)
- ;
- }
- /********************************************************************
- * 名称 : enable(uchar del)
- * 功能 : 1602命令函数
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void enable(uchar del)
- {
- P0 = del;
- RS = 0;
- RW = 0;
- E = 0;
- delay();
- E = 1;
- delay();
- }
- /********************************************************************
- * 名称 : write(uchar del)
- * 功能 : 1602写数据函数
- * 输入 : 需要写入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void write(uchar del)
- {
- P0 = del;
- RS = 1;
- RW = 0;
- E = 0;
- delay();
- E = 1;
- delay();
- }
- /********************************************************************
- * 名称 : L1602_init()
- * 功能 : 1602初始化,请参考1602的资料
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void L1602_init(void)
- {
- enable(0x01);
- enable(0x38);
- enable(0x0c);
- enable(0x06);
- enable(0xd0);
- }
- /********************************************************************
- * 名称 : L1602_char(uchar hang,uchar lie,char sign)
- * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
- L1602_char(1,5,'b')
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void L1602_char(uchar hang,uchar lie,char sign)
- {
- uchar a;
- if(hang == 1) a = 0x80;
- if(hang == 2) a = 0xc0;
- a = a + lie - 1;
- enable(a);
- write(sign);
- }
- /********************************************************************
- * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
- * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
- L1602_string(1,5,"ab cd ef;")
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void L1602_string(uchar hang,uchar lie,uchar *p)
- {
- uchar a;
- if(hang == 1) a = 0x80;
- if(hang == 2) a = 0xc0;
- a = a + lie - 1;
- enable(a);
- while(1)
- {
- if(*p == '\0') break;
- write(*p);
- p++;
- }
- }
- /********************************************************************
- * 名称 : Keyscan()
- * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
- * 输入 : 无
- * 输出 : 按键值
- ***********************************************************************/
- uchar keyscan(void)
- {
- uchar temp;
- P21=1;
- if(P24==0) {temp=right; goto next;}
- if(P23==0) {temp=sub_score; goto next;}
- if(P22==0) {temp=stop; goto next;}
-
- P20=1; P21=0;
- if(P24==0) {temp=left; goto next;}
- if(P23==0) {temp=add_score; goto next;}
- if(P22==0) {temp=start; goto next;}
- temp=0xff;
- next:
- while((P2&0x1c)!=0x1c); //等待按键释放
- return temp;
- }
- /********************************************************************
- * 名称 : Main()
- * 功能 : 主函数
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Main(void)
- {
- uchar Key_Value,temp; //读出的键值
-
- TMOD = 0x01; //set timer0 as mode1 (16-bit)
- TL0 = T1MS; //initial timer0 low byte
- TH0 = T1MS >> 8; //initial timer0 high byte
- //TR0 = 1; //timer0 start running
- ET0 = 1; //enable timer0 interrupt
- EA = 1; //open global interrupt switch
- start_game=1; //pull high
- pause=1; //pull high
-
- L1602_init();
- //draw some picturs
- for(temp=1; temp<17; temp++)
- {
- L1602_string(1,temp,"O");
- if((temp-1)!=0)
- {L1602_string(1,temp-1," ");}
- Delay_1ms(200);
- }
- L1602_string(1,1,"Basketball score");
- L1602_string(2,5,"Recorder");
- Delay_1ms(4000);
- //end draw some pictures
- begin:
- L1602_string(2,1,"Fir 12:00 24 Sec");
- second_s=2; second_g=4;
- L1602_char(1,11,second_s+48);
- L1602_char(1,12,second_g+48);
- h_h=1;
- L1602_string(1,1,"->R:000 B:000");
- while(1)
- {
- if(updata)
- {
- updata=0;
- redisplay();
- L1602_char(2,11,second_s+48);
- L1602_char(2,12,second_g+48);
- }
- if((second_s==0)&&(second_g<=3))
- {beep_flag=1;}
- if((game_time_min==0)&&(game_time_sec<=2))
- {beep_flag=1;}
-
- if(start_game==0)
- {
- Delay_1ms(15);
- if(start_game==0)
- {
- while(start_game==0);
- if(game_over)
- {
- game_over=0; game_num=1;
- game_time_min=12; game_time_sec=0;
- ET0=1; EA=1;
- goto begin;
- }
- run_off=1;
- }
- }
-
- if(pause==0)
- {
- Delay_1ms(15);
- if(pause==0)
- {
- while(pause==0);
- run_off=0;
- }
- }
- if(run_off) {TR0=1;}
-
- P2&=0xfc;
- P2|=0x1c;
- temp=P2&0x1c;
- if(temp!= 0x1c)
- {
- Delay_1ms(15); //按键消抖
- P2&=0xfc;
- P2|=0x1c;
- temp=P2&0x1c;
- if(temp != 0x1c)
- {
- Key_Value = keyscan();
- switch(Key_Value)
- {
- case left: //
- {
- h_h=1;
- redisplay();
- L1602_string(1,1,"->");
- L1602_string(1,10," ");
- break;
- }
- case right:
- {
- h_h=0;
- redisplay();
- L1602_string(1,1," ");
- L1602_string(1,10,"->");
- break;
- }
- case add_score:
- {
- add_score_function();
- break;
- }
- case sub_score:
- {
- sub_score_function();
- break;
- }
- case start:
- {
- start_24sec=1;
- break;
- }
- case stop:
- {
- start_24sec=0;
- second_s=2;
- second_g=4;
- updata=1;
- beep=0;
- break;
- }
- default: break;
- }
- }
- }
- }
- }
- //*******************************************
- void add_score_function()
- {
- if(h_h==0)
- {
- if(++b_g==10)
- {
- b_g=0;
- if(++b_s==10)
- {
- b_s=0;
- if(++b_b==10)
- b_b=0;
- }
- }
- redisplay();
- L1602_char(1,14,b_b+48);
- L1602_char(1,15,b_s+48);
- L1602_char(1,16,b_g+48);
- }
- else
- {
- if(++r_g==10)
- {
- r_g=0;
- if(++r_s==10)
- {
- r_s=0;
- if(++r_b==10)
- r_b=0;
- }
- }
- redisplay();
- L1602_char(1,5,r_b+48);
- L1602_char(1,6,r_s+48);
- L1602_char(1,7,r_g+48);
- }
- }
- //*********************************************
- void sub_score_function()
- {
- if(h_h==0)
- {
- if(b_g!=0)
- {b_g--;}
- else
- {
- if(b_s!=0)
- {
- b_s--; b_g=9;
- }
- else
- {
- if(b_b!=0)
- {b_b--; b_s=9; b_g=9;}
- }
- }
- redisplay();
- L1602_char(1,14,b_b+48);
- L1602_char(1,15,b_s+48);
- L1602_char(1,16,b_g+48);
- }
- else
- {
- if(r_g!=0)
- {r_g--;}
- else
- {
- if(r_s!=0)
- {
- r_s--; r_g=9;
- }
- else
- {
- if(r_b!=0)
- {r_b--; r_s=9; r_g=0;}
- }
- }
- redisplay();
- L1602_char(1,5,r_b+48);
- L1602_char(1,6,r_s+48);
- L1602_char(1,7,r_g+48);
- }
- }
- //***************************************************
- void redisplay()
- {
- uchar temp,temp1;
- temp=game_time_min/10;
- temp1=game_time_min%10;
- L1602_char(2,5,temp+48); L1602_char(2,6,temp1+48);
- temp=game_time_sec/10;
- temp1=game_time_sec%10;
- L1602_char(2,8,temp+48); L1602_char(2,9,temp1+48);
- }
- //-----------------------------------------------
- /* Timer0 interrupt routine */
- void tm0_isr() interrupt 1 using 1
- {
- TL0 = T1MS; //reload timer0 low byte
- TH0 = T1MS >> 8; //reload timer0 high byte
- if(beep_flag)
- {
- if(++count1==4)
- {
- count1=0;
- beep=!beep;
- }
- }
- else
- {beep=0;}
-
- if (++count== 1000) //1ms * 1000 -> 1s
- {
- count = 0; //reset counter
- updata=1;
-
- if(start_24sec) //24秒到计时
- {
- if(second_g!=0)
- {second_g--;}
- else
- {
- if(second_s!=0)
- {
- second_s--;
- second_g=9;
- }
- else
- {
- start_24sec=0;
- second_s=2;second_g=4;
- beep=0; beep_flag=0;
- }
- }
- }
-
- if(run_off) //正常计时
- {
- if(game_time_sec!=0)
- {game_time_sec--;}
- else
- {
- if(game_time_min!=0)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
篮球比赛计分器.rar
(159.04 KB, 下载次数: 78)
|