找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2380|回复: 2
打印 上一主题 下一主题
收起左侧

单片机篮球计分器设计

[复制链接]
跳转到指定楼层
楼主
  1. #include <reg51.h>
  2. #include "intrins.h"     //_nop_();延时函数用
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define Lcd_Port P3     //定义数据端口
  6. #define KEY_IO     P0  //键盘接口                 
  7. sbit RS = P2^1;                 //定义和LCM的连接端口
  8. sbit RW = P2^2;
  9. sbit E = P2^5;
  10. sbit Busy = P3^7;
  11. sbit speaker=P1^0;
  12. uchar data keytemp,key;
  13. uchar L=0;
  14. uchar k=0;
  15. uchar c = 0;
  16. uchar b=0;
  17. uchar j=0;
  18. uchar e=1;
  19. uchar d = 0;
  20. uchar hour =24;
  21. uchar hour1=0;
  22. uchar min = 11;
  23. uchar sec = 59; //赋初值
  24. uchar data flag=0x00;
  25. bit flag_key=0;
  26. uchar code Lcddata[] ={"0123456789:"};
  27. //uchar codeLcddata[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
  28. /******************************************************************************************
  29. * 函数名称    :Timer0Init
  30. * 功能描述    :定时器0初始化        
  31. ******************************************************************************************/
  32. void Timer0Init(void)
  33. {
  34. TMOD=0x11;
  35. TH0 = 0x3c;
  36. TL0 = 0xb0;
  37. TH1=-10300/256;
  38. TL1=-10300%256;      //25MS定时初值(T1计时用)
  39. ET0=1;
  40. ET1=1;
  41. TR0=1;
  42. TR1=1;
  43. EA=1;
  44. }
  45. /******************************************************************************************
  46. * 函数名称    :IsrTimer0
  47. * 功能描述    :T0 50mS中断程序      
  48. ******************************************************************************************/
  49. void IsrTimer0(void) interrupt 1 using 1//T0 50mS中断程序
  50. {
  51. static uchar count = 0;
  52.   TH0 = 0x3c;
  53. TL0 = 0xb0;
  54. count++;
  55. if(count ==20)   //定时1s时间到
  56. {
  57.    count = 0;
  58.    sec--;
  59.   if(sec == 0) //1分钟时间到
  60.    {
  61.       if(min == 0) //1小时时间到
  62.       {
  63.           min = 0;
  64.                  EA=0;
  65.           speaker=~speaker;
  66.                       }
  67.            else
  68.            {
  69.               sec= 59;
  70.               min--;
  71.             }
  72.    }
  73. }
  74. }
  75. void IsrTimer1(void) interrupt 3 using3//T1 50mS中断程序
  76. {uchar i=0,m=0,a=0;
  77. static uchar ta20ms= 0;
  78.    TH1=-10300/256;
  79. TL1=-10300%256;
  80. ta20ms++;
  81. if(ta20ms== 1 )   //定时1s时间到
  82. {
  83.    ta20ms=0;
  84.    hour1--;
  85.   if(hour1 ==-1) //1分钟时间到
  86.    {
  87.            hour--;hour1 =99;
  88.           if(hour==0)
  89.                  {
  90.    hour=24;hour1=0;
  91.    k=1;
  92.    //EA=0;
  93.    L=1;
  94.    speaker=~speaker;
  95.    while(a<=2){
  96.    while(m<=225){for(i=0;i<=225;i++)
  97.     a++;m++;}}
  98.    speaker=1;}
  99.        }
  100. }
  101. }
  102. /******************************************************************************************
  103. * 函数名称    :Delay
  104. * 功能描述    :延时子程序,延时 (1MS*t) S      
  105. ******************************************************************************************/
  106. void Delay(uchar t)
  107. {
  108. uchar a;
  109. while(t-- != 0)
  110. {
  111.   for(a = 0; a < 125; a++);
  112. }
  113. }
  114. /******************************************************************************************
  115. * 函数名称    :Read_Busy
  116. * 功能描述    :读忙信号判断
  117. ******************************************************************************************/
  118. void Read_Busy(void)
  119. {
  120. uchar i=50;
  121.   Lcd_Port=0xff;
  122.    RS= 0;
  123.    RW= 1;
  124.    E= 1;
  125. while((i--)&&Busy);
  126. E=0;
  127. }
  128. /******************************************************************************************
  129. * 函数名称    :Write_Comm
  130. * 功能描述    :写指令函数   ok
  131. ******************************************************************************************/
  132. void Write_Comm(uchar lcdcomm)
  133. {
  134. Read_Busy();
  135. RS = 0;
  136. RW = 0;
  137. E = 1;
  138. Lcd_Port=lcdcomm;
  139. E = 0;
  140. }
  141. /******************************************************************************************
  142. * 函数名称    :Write_Char
  143. * 功能描述    :写字符函数    ok
  144. ******************************************************************************************/
  145. void Write_Char(uint num)//写字符函数
  146. {
  147.   Read_Busy();
  148. RS = 1;
  149. RW = 0;
  150. E = 1;
  151. Lcd_Port = Lcddata[num];
  152. E = 0;
  153. }
  154. /******************************************************************************************
  155. * 函数名称    :Write_Data
  156. * 功能描述    :写数据函数    ok
  157. ******************************************************************************************/
  158. void Write_Data(uchar lcddata)
  159. {
  160. Read_Busy();
  161. RS = 1;
  162. RW = 0;
  163. E = 1;
  164. Lcd_Port = lcddata;
  165. E = 0;
  166. }
  167. /******************************************************************************************
  168. * 函数名称    :Init_LCD
  169. * 功能描述    :初始化LCD
  170. ******************************************************************************************/
  171. void Init_LCD(void)
  172. {
  173. //Delay(400);      //稍微延时,等待LCM进入工作状态
  174. Write_Comm(0x38); //8位2行5*8
  175. Write_Comm(0x0c); //显示开/关,光标开闪烁开
  176. Write_Comm(0x01); //清显示
  177. Write_Comm(0x06); //文字不动,光标右移
  178. Write_Comm(0x02); //光标归位
  179. }
  180. /******************************************************************************************
  181. * 函数名称    :Show_Time
  182. * 功能描述    :LCD上显示当前时间
  183. ******************************************************************************************/
  184. void Show_Time(void)
  185. {
  186. Write_Comm(0x80+0x08); //显示首地址
  187. Write_Char( hour / 10 );//显示小时
  188. Write_Char( hour % 10 );
  189.    Write_Char( 10 ); //显示:
  190.     Write_Char( hour1 / 10 );//显示小时
  191. Write_Char( hour1 % 10 );   
  192.   Write_Comm(0x80+0x4b);
  193. Write_Char( min / 10 ); //显示分钟
  194. Write_Char( min % 10 );
  195. Write_Char( 10 ); //显示:
  196. Write_Char( sec / 10 ); //显示秒
  197. Write_Char( sec % 10 );
  198.     Write_Comm(0x80+0x45);
  199.     Write_Char( c / 10 );
  200.   Write_Char( c % 10 );
  201. Write_Comm(0x85);
  202. Write_Char(d / 10 );
  203.   Write_Char(d % 10 );
  204. }
  205. //***************按键扫描函数/*************
  206. void keyscan()
  207. {
  208. uchar i,t=0xef,temp=0;       //1110 1111   
  209. KEY_IO=0x0f;
  210. keytemp=(~KEY_IO)&0x0e;
  211. if(keytemp!=0)                //0000 0000 ;0000 1000; 00000100; 0000 0010; 0000 0001;
  212. {
  213. Delay(20);
  214. for(i=0;i<4;i++)
  215.    {
  216.   KEY_IO=t;
  217.   keytemp=(~KEY_IO)&0x0e;
  218.   if(keytemp!=0&flag_key==0)
  219.     {
  220.    flag_key=1;
  221.    switch(keytemp)
  222.     {
  223.     case 0x08:key=0*3+i;break;
  224.     case 0x04:key=1*4+i;break;
  225.     case 0x02:key=2*4+i;break;
  226.     default:break;
  227.     }
  228.    switch(key)
  229.             {
  230.             case0:{c++; j=1;if(c>=99){ Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;
  231.             case 1:{c++;c++; j=1;if(c>=99){Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;
  232.             case 2:{c++;c++;c++;if(c>=99){Write_Comm(0x84);Write_Data('1');d=0;} j=1;b=0;}break;
  233.             case 4:{d++;if(d>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;};b=1;j=0;}break;
  234.             case 5:{d++;d++;if(d>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;
  235.             case 6:{d++;d++;d++;if(d>=99){Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;
  236.             case 8:{if(b==1){d--;if (d==0)d=0;};if(j==1) c--;}break;
  237.             case 9:if(k==1)hour=24;EA=~EA;speaker=1;L=0;k=0;break;
  238.             case 10: e++;if(e==5)e=1;Write_Comm(0x80+0x0d);Write_Char(e%10); break;
  239.                case 3:{ Write_Comm(0x80);
  240.                                    Write_Data('C');
  241.                                    Write_Data('B');
  242.                                    Write_Data('A');
  243.                                    Write_Data(':');
  244.                                    Write_Comm(0x80+0x0d);
  245.                                    Write_Char(e%10);
  246.                                    Write_Data('S');
  247.                                    Write_Data('t');
  248.                                    Write_Comm(0x80+0x40);
  249.                                    Write_Data('N');
  250.                                    Write_Data('B');
  251.                                    Write_Data('A');
  252.                                    Write_Data(':');
  253.                                    temp=c;
  254.                                    c=d;
  255.                                    d=temp;
  256.                                    }break;
  257.                case 7:{ Write_Comm(0x80);
  258.                                    Write_Data('N');
  259.                                    Write_Data('B');
  260.                                    Write_Data('A');
  261.                                    Write_Data(':');
  262.                                    Write_Comm(0x80+0x0d);
  263.                                    Write_Char(e%10);
  264.                                    Write_Data('S');
  265.                                    Write_Data('t');
  266.                                    Write_Comm(0x80+0x40);
  267.                                    Write_Data('C');
  268.                                    Write_Data('B');
  269.                                    Write_Data('A');
  270.                                    Write_Data(':');
  271.                                    temp=c;
  272.                                    c=d;
  273.                                    d=temp;}break;
  274.             default:break;
  275.             }
  276.     }
  277.    t=(t<<1)|0x01;
  278.    }
  279. }
  280.   else flag_key=0;
  281. }
  282. /******************************************************************************************
  283. * 函数名称    :main
  284. * 功能描述    :主函数
  285. ******************************************************************************************/
  286. void main(void)
  287. {
  288.        Init_LCD();    //初始化 LCM
  289.        Timer0Init();   //初始化定时器
  290.        Write_Comm(0x80);
  291.        Write_Data('N');
  292.        Write_Data('B');
  293.        Write_Data('A');
  294.        Write_Data(':');
  295.        Write_Comm(0x80+0x0d);
  296.        Write_Char(e%10);
  297.        Write_Data('S');
  298.        Write_Data('t');
  299.        Write_Comm(0x80+0x40);
  300.        Write_Data('C');
  301.        Write_Data('B');
  302.        Write_Data('A');
  303.        Write_Data(':');
  304.        while(1)
  305.        {  
  306.               Show_Time();   //显示时间
  307.            keyscan();
  308.        }
  309. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:576137 发表于 2019-7-3 19:46 | 只看该作者
有没有源程序和原理图的打包阿,急求,有的大兄弟回复下,最近作业要用,急
回复

使用道具 举报

板凳
ID:684081 发表于 2020-1-9 18:11 | 只看该作者
这代码运行有误啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表