单片机课程设计报告---打字小游戏

合集下载

单片机显示汉字课程设计

单片机显示汉字课程设计

单片机显示汉字课程设计一、课程目标知识目标:1. 学生理解单片机显示汉字的基本原理,掌握显示汉字的基础知识;2. 学生掌握单片机编程中常用的字模提取、编码及显示方法;3. 学生了解汉字显示在单片机应用中的实际意义和广泛应用。

技能目标:1. 学生能够运用所学知识,完成单片机显示汉字的编程任务;2. 学生能够自主分析并解决汉字显示过程中遇到的问题;3. 学生通过实际操作,提高动手能力和团队协作能力。

情感态度价值观目标:1. 学生培养对单片机及编程的兴趣,激发学习主动性和创新意识;2. 学生在学习过程中,培养严谨、细心的态度,提高自我管理和解决问题的能力;3. 学生了解我国在单片机领域的发展现状,增强民族自豪感,树立正确的价值观。

课程性质:本课程为实践性较强的课程,要求学生在掌握理论知识的基础上,进行实际操作。

学生特点:学生具备一定的单片机基础知识,对编程有一定的了解,但动手能力和问题解决能力有待提高。

教学要求:结合学生特点,注重理论与实践相结合,强调实际操作,培养学生的学习兴趣和创新能力。

通过本课程的学习,使学生能够独立完成单片机显示汉字的编程任务,提高综合运用知识的能力。

二、教学内容1. 理论知识:- 单片机显示汉字原理;- 汉字字模提取与编码方法;- 单片机编程基础知识。

2. 实践操作:- 汉字显示电路设计;- 单片机编程实现汉字显示;- 汉字显示程序调试与优化。

3. 教学大纲:- 第一阶段:单片机显示汉字原理学习,包括显示原理、字模提取与编码方法等;- 第二阶段:单片机编程基础知识学习,为汉字显示编程打下基础;- 第三阶段:实践操作,分组完成汉字显示电路设计、编程及调试;- 第四阶段:总结与评价,展示成果,交流经验,提高问题解决能力。

4. 教材关联:- 教材章节:第三章 单片机显示技术,第四节 汉字显示;- 列举内容:汉字显示原理、字模提取与编码、编程实现汉字显示等。

教学内容安排和进度:共4课时,每课时45分钟。

c打字游戏课程设计报告

c打字游戏课程设计报告

c打字游戏课程设计报告一、课程目标知识目标:1. 学生能够掌握C语言基础语法,包括变量声明、数据类型、运算符等。

2. 学生能够理解并运用循环结构、条件语句编写简单的打字游戏程序。

3. 学生了解基本的计算机编码知识,如ASCII码。

技能目标:1. 学生能够运用C语言编写简单的打字游戏程序,提高编程实践能力。

2. 学生能够通过编写代码解决问题,培养逻辑思维和问题解决能力。

3. 学生能够熟练使用计算机键盘,提高打字速度和准确性。

情感态度价值观目标:1. 学生培养对编程的兴趣,激发学习C语言的热情。

2. 学生在团队协作中,培养沟通、协作能力,增强团队意识。

3. 学生通过编程实践,体会计算机科学的魅力,树立正确的科技观。

课程性质:本课程为实践性较强的编程课程,结合打字游戏的形式,让学生在轻松愉快的氛围中学习C语言编程。

学生特点:五年级学生,具备一定的计算机操作能力,对游戏有浓厚兴趣,具备初步的逻辑思维能力。

教学要求:教师应注重引导学生主动探究、实践,关注学生的个体差异,鼓励学生发挥创意,提高编程能力和团队协作能力。

通过本课程的学习,使学生达到上述具体的学习成果。

二、教学内容1. C语言基础语法:- 变量声明、数据类型(整型、字符型)- 常量和变量- 运算符(算术、关系、逻辑)- 语法结构(顺序、选择、循环)2. 编程实践:- 打字游戏程序设计思路- 设计简单循环结构,实现打字游戏基本框架- 引入随机函数,生成随机字母或单词- 使用条件语句,判断用户输入与随机字母的匹配3. 计算机编码知识:- ASCII码介绍- 键盘布局与打字技巧4. 教学内容的安排和进度:- 第一课时:C语言基础语法回顾,介绍打字游戏目标- 第二课时:设计打字游戏基本框架,学习循环结构- 第三课时:引入随机函数,学习条件语句- 第四课时:完善打字游戏功能,进行编程实践- 第五课时:总结与展示,讨论编程过程中的问题及解决方法教材关联:- 《C语言趣味编程》第三章:循环结构- 《C语言趣味编程》第四章:分支结构- 《计算机科学》第二单元:计算机编码知识教学内容注重科学性和系统性,结合教材相关章节,引导学生通过实践掌握C 语言编程知识,提高编程技能。

单片机课程设计报告-仿手机键盘

单片机课程设计报告-仿手机键盘

单片机课程设计报告课题:仿手机键盘报告人:XXX学号:XXXX班级:XXXX目录一、手机键盘使用说明 (3)(一)键盘说明 (3)(二)“时钟”模式 (3)(三)“设置”模式 (3)(四)“手机”模式 (4)二、手机键盘设计说明 (5)(一)设计要求 (5)(二)硬件电路 (6)1、CPU (6)2、矩阵键盘 (7)3、LCD (8)4、蜂鸣器 (8)(三)流程图 (9)1、时钟模式 (9)2、设置模式 (9)4、手机模式 (10)5、定时器0 (11)(四)源程序 (12)三、课程设计心得体会 (30)一、手机键盘使用说明(一)键盘说明1、键盘按键对应键值:2、定义双击:2s间隔内按下同一数字键(二)“时钟”模式键盘键值对应功能:0(设置):按下设置键进入设置模式1(切换):按下切换键进入手机模式(三)“设置”模式键盘键值对应功能:0(移位):光标在年、月、日、星期、时、分、秒之间循环移位1(加):光标对应的时间(日期)加一2(减):光标对应的时间(日期)减一3(返回):返回时钟模式(四)“手机”模式键盘键值对应功能:1)数字键:0(0,。

?):单击显示0,双击显示0,。

?,长按循环显示0,。

?1(1abc):单击写入”1”,双击写入”1abc”,长按循环写入”1”、”a”、”b”、”c”2(2def):同上3(3ghi):同上4(4jkl):同上5(5mno):同上6(6pqr):同上7(7stu):同上8(8vwx):同上9(9yz ):同上(第四个字符是空格)2)功能键:A(删除):删除光标前一个字符B(退格):光标左移C(右移):光标右移D(清屏):LCD清屏E(跳转):返回时钟模式F(打电话):按下蜂鸣器模拟电话响,再次按下挂断电话二、手机键盘设计说明(一)设计要求显示方式:1602LCD 编程语言:汇编1、任务利用键盘矩阵仿照手机键盘,每个按键均集成多个按键字符,在LCD上分别显示2、要求1)手机键盘对应字符:2)依次按下不同按键时所显示的是按键上的第一个字符,如果在2S间隔内按下同一按键,该按键上的字符将被依次显示,如果同一按键上的两次连续按键时间间隔超过2S,则取字符位置归0,即显示该按键的第一个字符3)可模拟拨打电话号码,“*”键可实现退格功能,“#”键可实现清除功能4)字符显示和拨打电话,可通过按键选择控制5)按键时,可利用蜂鸣器发出提示音6)不工作时,显示北京时间,可调整3、附加功能1)“清屏“键可实现LCD清屏2)“右移“键可实现光标右移3)长按数字键可循环显示按键对应的所有字符(二)硬件电路1、CPU2、矩阵键盘3、LCD4、蜂鸣器(三)流程图1、时钟模式2、设置模式4、手机模式5、定时器0(四)源程序LCD_RS EQU P3.6LCD_RW EQU P3.5LCD_EN EQU P3.3BUZZER EQU P2.6DIALING BIT 01H ;打电话CIRCLE BIT 02HYEAR EQU 46HMONTH EQU 47HDAY EQU 48HWEEK EQU 49HH0 EQU 50HM0 EQU 51HS0 EQU 52HMS0 EQU 53HKEY_BUF EQU 36HIDL_SEC EQU 37HIDLE EQU 38HDOU_SEC EQU 39HSAME EQU 40HCURSOR EQU 41HDOU_NMS EQU 42HBUF EQU 45HORG 00HJMP MAINORG 0BHJMP TIM0ORG 1BHJMP TIM1MAIN:MOV SP,#60HACALL LCD_INIT ;LCD初始化ACALL TIME_INIT ;计时器初始化MOV CURSOR,#00HMOV YEAR,#0MOV MONTH,#1MOV DAY,#1MOV WEEK,#0MOV H0,#0MOV M0,#0MOV S0,#0MOV MS0,#0CLR DIALINGCLR CIRCLEACALL LCD_INITACALL WELCOMEBEGIN:ACALL LCD_INITACALL DISP_DATENEW_TIME:ACALL DISP_TIMEACALL KEY_TMOV A,KEY_BUFJZ SET_TIMECJNE A,#1,NEW_TIMEJMP PHONESET_TIME:CLR TR0 ;关定时器0MOV A,#83H ;定位光标ACALL LCD_CMDMOV A,#0EH ;显示光标ACALL LCD_CMDST_K:ACALL KEY_TMOV A,KEY_BUFJNZ ST_1ACALL MOVEJMP ST_KST_1:CJNE A,#1,ST_2ACALL INC_TJMP ST_KST_2:CJNE A,#2,ST_3ACALL DEC_TJMP ST_KST_3:CJNE A,#3,ST_KMOV A,#0CH ;关光标ACALL LCD_CMDSETB TR0 ;开定时器0JMP NEW_TIMEPHONE:ACALL SJ_INITSJ_k:ACALL KEYJMP SJ_KTABLE_W: DB "WELCOME TO PHONE",00HTABLE_WEEK: DB "Mon Tue Wed Thu Fri Sat Sun "TABLE: DB "0,.?1abc2def3ghi4jkl5mno6pqr7stu8vwx9yz ";***********************欢迎子程序**************************** WELCOME:MOV DPTR,#TABLE_WACALL WRITEWELCOM_K:ACALL KEY_TMOV A,KEY_BUFJNZ WELCOM_KRET;***********************时间模式子程序************************* KEY_T:MOV P2,#0E0H ;全扫描,各列线都送低电平MOV P1,#00HMOV A,P1 ;读回各行线电平值ORL A,#0F0H ;只读低四位CPL A ;所读值置反JNZ KT_IN ;不是全0说明有键按下MOV KEY_BUF,#0FFHRET ;无键按下返回KT_IN:ACALL DELAY5MS ;调延时,等待按合抖动过去ACALL DELAY5MS ;调延时,等待按合抖动过去ACALL DELAY5MS ;调延时,等待按合抖动过去ACALL DELAY5MS ;调延时,等待按合抖动过去MOV R2,#04H ;R2做计数器,存待扫描行数MOV R4,#7FH ;R4做指针,指示待扫描行数MOV R7,#00H ;R7用于决定键号,初值置以0KT_SCAN:MOV A,R4RL AMOV R4,A ;以上三条调整待扫描行MOV P2,A ;逐行扫描, 被扫描行送低电平MOV P1,#00HMOV A,P1 ;读回各列线电平值MOV R3,#04H ;R3做记数器,存被扫描行的待查列数KT_NEXT:RRC A ;调整待查列JNC KT_FIND ;被查列为低电平,被按键找到,转FINDINC R7 ;未找到,键号加一DJNZ R3,KT_NEXT ;被扫描行的待查列数不为0,转回NEXTDJNZ R2,KT_SCAN ;未找到所按键,返回MOV KEY_BUF,#0FFHRETKT_FIND:MOV KEY_BUF,R7MOV P2,#0E0HSETB TR1KT_LOOSEN:MOV A,P1ORL A,#0F0HCPL AJNZ KT_LOOSEN ;以上几条重复全扫描,等待所按键松按CLR TR1RETDISP_DATE:MOV A,#80HACALL LCD_CMDMOV A,#32H ;'2'ACALL LCD_WDA TAMOV A,#30H ;'0'ACALL LCD_WDA TAMOV A,YEAR ;年ACALL BCD_LCDMOV A,#2DH ;'-'ACALL LCD_WDA TAMOV A,MONTH ;月ACALL BCD_LCDMOV A,#2DH ;'-'ACALL LCD_WDA TAMOV A,DAY ;日ACALL BCD_LCDMOV A,#20HACALL LCD_WDA TAMOV A,WEEK ;星期RL ARL AADD A,#TABLE_WEEKMOV DPL,AMOV R3,#3WEEK1:CLR AMOVC A,@A+DPTRACALL LCD_WDA TAINC DPTRDJNZ R3,WEEK1RETDISP_TIME:MOV A,#0C0H ;跳转到第二行开头ACALL LCD_CMDMOV A,H0 ;时ACALL BCD_LCDMOV A,#3AH ;':'ACALL LCD_WDA TAMOV A,M0 ;分ACALL BCD_LCDMOV A,#3AH ;':'ACALL LCD_WDA TAMOV A,S0 ;秒ACALL BCD_LCDRETBCD_LCD:MOV B,#10DIV ABACALL BCD_ASCIIACALL LCD_WDA TAMOV A,BACALL BCD_ASCIIACALL LCD_WDA TARETBCD_ASCII:ANL A,#0FHADD A,#30HRET;光标移动:MOVE:ACALL LCD_RCMDCJNE A,#8CH,MOVE_1MOV A,#0C1HJMP MOVE_3MOVE_1:CJNE A,#0C7H,MOVE_2MOV A,#83HJMP MOVE_3MOVE_2:ADD A,#3MOVE_3:ACALL LCD_CMDRETINC_T:ACALL LCD_RCMDPUSH ACCCJNE A,#83H,ID_1INC YEARMOV A,YEARCJNE A,#100,ID_4MOV YEAR,#0JMP ID_4ID_1:CJNE A,#86H,ID_2INC MONTHMOV A,MONTHCJNE A,#13,ID_4MOV MONTH,#1JMP ID_4ID_2:CJNE A,#89H,ID_3INC DAYMOV A,DAYCJNE A,#31,ID_4MOV DAY,#1JMP ID_4ID_3:CJNE A,#8CH,INCTINC WEEKMOV A,WEEKCJNE A,#7,ID_4MOV WEEK,#0 ID_4:ACALL DISP_DATEPOP ACCACALL LCD_CMDRETINCT:CJNE A,#0C1H,IT_1INC H0MOV A,H0CJNE A,#24,IT_3MOV H0,#0JMP IT_3IT_1:CJNE A,#0C4H,IT_2INC M0MOV A,M0CJNE A,#60,IT_3MOV M0,#0JMP IT_3IT_2:CJNE A,#0C7H,IT_3INC S0MOV A,S0CJNE A,#60,IT_3MOV S0,#0IT_3:ACALL DISP_TIMEPOP ACCACALL LCD_CMDRETDEC_T:ACALL LCD_RCMDPUSH ACCCJNE A,#83H,DD_1DEC YEARMOV A,YEARCJNE A,#0FFH,DD_4MOV YEAR,#99JMP ID_4DD_1:CJNE A,#86H,DD_2DEC MONTHMOV A,MONTHCJNE A,#0,DD_4MOV MONTH,#12JMP DD_4DD_2:CJNE A,#89H,DD_3DEC DAYMOV A,DAYCJNE A,#0,DD_4MOV DAY,#30JMP ID_4DD_3:CJNE A,#8CH,DECTDEC WEEKMOV A,WEEKCJNE A,#0FFH,DD_4MOV WEEK,#6 DD_4:ACALL DISP_DATEPOP ACCACALL LCD_CMDRETDECT:CJNE A,#0C1H,DECT_1DEC H0MOV A,H0CJNE A,#0FFH,DECT_3MOV H0,#23JMP DECT_3DECT_1:CJNE A,#0C4H,DECT_2DEC M0MOV A,M0CJNE A,#0FFH,DECT_3MOV M0,#59JMP DECT_3DECT_2:CJNE A,#0C7H,DECT_3DEC S0MOV A,S0CJNE A,#0FFH,DECT_3MOV S0,#59DECT_3:ACALL DISP_TIMEPOP ACCACALL LCD_CMDRET;***********************手机模式子程序************************************** SJ_INIT:MOV BUF,#0FFHMOV CURSOR,#0ACALL LCD_INITMOV A,#0EHACALL LCD_CMDRET;扫描键盘子程序:KEY:MOV P2,#0E0HMOV P1,#00HMOV A,P1ORL A,#0F0HCPL AJNZ INRETIN:ACALL DELAYACALL DELAYACALL DELAYMOV R4,#7FHMOV R5,#04HMOV R6,#00HSCAN:MOV A,R4RL AMOV R4,AMOV P2,AMOV P1,#00HMOV A,P1MOV R7,#04HSCAN_LIE:RRC AJNC FINDINC R6DJNZ R7,SCAN_LIEDJNZ R5,SCANRETFIND:ACALL JUDGE ;判断是否双击MOV IDLE,#00HMOV SAME,R6ACALL GIVE_KEYACALL CLEAR ;清除按键时间SETB TR1 ;启动定时器1,记录按键时间MOV P2,#0E0HLOOSEN:MOV A,DOU_SECCJNE A,#02H,LOOSEN1 ;按键超过1秒,BUF=0(循环显示)MOV BUF,#00HMOV R7,#00HLOOSEN1:MOV P1,#00HMOV A,P1ORL A,#0F0HCPL AJNZ LOOSEN ;等待按键松开CLR TR1 ;关闭定时器1CLR CIRCLECJNE R6,#10,K1K1: JC KEY_DATA ;键值小于10跳转到数字键处理KEY_15: ;键值大于等于10为命令键MOV A,R6CJNE A,#0FH,KEY_14CPL DIALINGCLR TR1RETKEY_14:CJNE A,#0EH,KEY_13MOV A,#0CHACALL LCD_CMDJMP BEGINRETKEY_13:CJNE A,#0DH,KEY_12JMP PHONERETKEY_12:CJNE A,#0CH,KEY_11MOV A,CURSORJZ KEY_12_1ACALL LCD_FOREDEC CURSORKEY_12_1:RETKEY_11:CJNE A,#0BH,KEY_10ACALL LCD_RCMDCJNE A,#80H,KEY_11_1RETKEY_11_1:ACALL LCD_BACK;INC CURSORRETKEY_10:ACALL LCD_DELE;RETKEY_DATA:MOV A,BUFCJNE A,#0,DATA1RETDATA1:CJNE A,#1,DATA2ACALL LCD_DIS_SINRETDATA2:ACALL LCD_DIS_COMRETGIVE_KEY:MOV A,R6MOV B,#04HMUL ABADD A,#TABLEMOV DPL,ARET;显示第一个字符子程序:LCD_DIS_SIN:CLR AMOVC A,@A+DPTRACALL LCD_WCHARRET;显示全部字符子程序:LCD_DIS_COM:MOV R1,#3LCD_DIS_COM1:MOV A,#1MOVC A,@A+DPTRACALL LCD_WCHARINC DPTRDJNZ R1,LCD_DIS_COM1RET;长按循环显示子程序:LCD_CIRCLE:MOV A,#0MOVC A,@A+DPTRACALL LCD_WCHARINC DPTRINC R7CJNE R7,#4,CIRCLE1MOV R7,#00HMOV A,DPLSUBB A,#4MOV DPL,ACIRCLE1:RET;清除按键时间:CLEAR:MOV DOU_SEC,#0MOV DOU_NMS,#0 ; CLR DOUBLERET;判断是否双击:JUDGE:MOV A,R6CJNE A,SAME,JUDGE2MOV A,IDLECJNE A,#2,JUDGE1JUDGE1:JNC JUDGE2MOV A,BUFCJNE A,#1,JUDGE2MOV BUF,#2RETJUDGE2:MOV BUF,#1RET;写入一个字符到LCD子程序:LCD_WCHAR:ACALL LCD_MOVELCD_WCHAR_NL: ;直接覆盖写入ACALL LCD_WDA TAACALL LCD_RCMDCJNE A,#90H,LCD_WCHAR1MOV A,#0C0HACALL LCD_CMDJMP LCD_WCHAR2LCD_WCHAR1:CJNE A,#0D1H,LCD_WCHAR2ACALL LCD_DELELCD_WCHAR2:RET;删除一个字符子程序:LCD_DELE:ACALL LCD_RCMDCJNE A,#80H,DELE_1RETDELE_1:MOV A,CURSORJNZ DELE_2ACALL LCD_BACKMOV A,#20HACALL LCD_WDA TAACALL LCD_BACKRETDELE_2:ACALL LCD_BACKACALL LCD_RCMDPUSH ACCACALL LCD_FOREMOV R2,CURSOR LCD_DELE1:ACALL LCD_RDA TAPUSH ACCACALL LCD_BACKACALL LCD_BACKPOP ACCACALL LCD_WCHAR_NLACALL LCD_FOREDJNZ R2,LCD_DELE1ACALL LCD_BACKMOV A,#20HACALL LCD_WCHAR_NL LCD_DELE2:POP ACCACALL LCD_CMDRET;退格子程序:LCD_BACK:ACALL LCD_RCMDCJNE A,#0C0H,LCD_BACK1MOV A,#90HACALL LCD_CMDLCD_BACK1:MOV A,#10HACALL LCD_CMDRET;光标右移子程序:LCD_FORE:ACALL LCD_RCMDCJNE A,#8FH,LCD_FORE1MOV A,#0C0HACALL LCD_CMDRETLCD_FORE1:MOV A,#14HACALL LCD_CMDRETLCD_MOVE:PUSH ACCMOV A,CURSORJZ LCD_MOVE3MOV R2,CURSORCJNE R2,#1,MOVE0JMP LCD_MOVE2MOVE0:DEC R2LCD_MOVE1:ACALL LCD_FOREDJNZ R2,LCD_MOVE1MOV R2,CURSORLCD_MOVE2:ACALL LCD_RDA TAACALL LCD_WCHAR_NLACALL LCD_BACKACALL LCD_BACKACALL LCD_BACKDJNZ R2,LCD_MOVE2ACALL LCD_FORELCD_MOVE3:POP ACCRET;*******************************LCD相关子程序***************************** ;从LCD读出一个数据子程序:LCD_RDATA:ACALL CHECKBUSYMOV P0,#0FFHSETB LCD_RSSETB LCD_RWSETB LCD_ENNOPNOPNOPMOV A,P0CLR LCD_ENRET;读数据地址子程序:LCD_RCMD:ACALL CHECKBUSYMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENNOPNOPNOPMOV A,P0ORL A,#80HCLR LCD_ENRET;LCD初始化设定子程序LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD电源稳定ACALL DELAY5MSMOV A,#38H ;16*2显示,5*7点阵,8位数据ACALL LCD_CMD_NC ;不进行LCD忙检测ACALL DELAY5MSMOV A,#38H ;16*2显示,5*7点阵,8位数据ACALL LCD_CMD_NC ;不进行LCD忙检测ACALL DELAY5MSMOV A,#38H ;16*2显示,5*7点阵,8位数据ACALL LCD_CMD_NC ;不进行LCD忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD忙检测RET;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲LCD_CMD:CALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRETWRITE:PUSH ACCWRITE1:CLR AMOVC A,@A+DPTRJZ WRITE2INC DPTRACALL LCD_WDATAJMP WRITE1WRITE2:POP ACCRET;检测LCD控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;P0.7=1,LCD忙,等待。

单片机贪食蛇课程设计报告参考模板

单片机贪食蛇课程设计报告参考模板

单片机课程设计报告目录1设计任务及要求 (1)2总体设计思路及功能描述 (1)3 各部分软硬件设计原理及方案详细说明 (2)3.1 人机接口电路 (2)3.2单片机与PC机通信电路 (4)3.3 其他部分电路说明 (5)3.4 软件模块设计 (5)3.4.1 LCD初始化 (5)3.4.2 键盘扫描程序 (7)3.4.3 显示16*16点阵汉字 (7)3.4.4 食物的随机出现 (7)3.4.58X8点阵LED工作原理说明 (8)3.4.6锁存器(74HC573) (8)3.5软件编译 (10)4 调试的步骤及调试过程中出现的问题以及解决方法 (10)4.1 PROTEUS仿真 (10)4.2 硬件的安装 (10)4.3 调试注意事项 (11)4.3.1 硬件调试注意事项 (11)4.3.2 软件调试注意事项 (11)5 设计心得体会 (11)6 附录 (12)6.1总原理图 (12)6.2单片机程序代码 (13)7 参考文献 (22)正文:1设计任务及要求本设计以51系列单片机STC89C52为控制核心,以点阵液晶显示模块、键盘为人机接口,实现了一个贪食蛇游戏机。

通过本设计,令读者掌握利用单片机开发简单电子产品的基本技能,熟悉原理图绘制、仿真、软件设计、优化以及系统调试的基本方法,为进一步设计开发更为复杂的嵌入式模拟/数字混合系统打下一定的基础。

“贪食蛇”又称为“贪吃蛇”,是一种益智小游戏。

其游戏规则比较简单,就是一条小蛇,不停地在屏幕上游走去吃屏幕上出现的蛋,越吃越长,只要蛇头碰到屏幕四周或者碰到自己的身子,小蛇就立即毙命并结束游戏。

本作品有上下左右四个按键来控制蛇头的移动方向,另有一个复位按键控制程序的重启,游戏界面方案一:采用分辨率为128×64的液晶显示屏方案二:和8*8点阵显示。

2总体设计思路及功能描述如图ChpNum-3所示,贪食蛇软件主要分成三个部分:主程序、外部中断服务程序、定时中断服务程序。

单片机键盘输入课程设计

单片机键盘输入课程设计

目录第1章课程设计任务书 (1)第2章设计目的 (1)第3章设计原理与分析 (1)第4章所选元件清单 (9)第5章课程设计心得 (10)第6章参考文献 (11)第一章、课程设计任务书1、电子时钟显示用LED 数码管显示,由左向右分别为:时、分、秒,比如:23-20-40 表示23时20分40秒,刚开始工作时应显示为:12-00-00;2、按下按键实现小时加一,按下另外的按键实现小时减一,小时十位加一,分钟十位数加一,秒钟十位数个位数分别加一;3、按照分析、设计、调试和测试的软、硬件开发过程完成这个设计任务。

第二章、课程设计目的1、掌握51系列单片机编程原理(1)掌握单片机C51语言程序编程的思想及方法,加深对单片机的更深层次的理解,熟悉单片机的内部硬件资源。

(2)掌握定时中断、定时器程序的编写。

(3)通过此次课程设计,学会怎么利用所学单片机知识独立设计系统,达到学于致用的目的,加深了解C51设计编程思想及开发系统的一般过程,并不断创新。

2、掌握矩阵式键盘电路的接法及工作原理(1)掌握矩阵式键盘的接法及工作原理。

(2)掌握键盘消抖的工作原理。

3、掌握矩阵式键盘电路的接法及工作原理(1)掌握矩阵式键盘键盘扫描程序的编写。

(2)掌握键盘消抖程序的编写。

4、掌握共阳八段数码管动态显示的原理及程序编写第三章设计原理与分析1、实验原理程序原理:选共阳数码管,串接限流电阻,基极电流大,故需限流电阻,防止单片机引脚电流超限。

阻值选择用1K。

数码管要亮,必须满足里面的二极管导通,有两个条件,片选打开,数据口要置低。

首先要得到0到9十个数据的段码。

即按硬件的排布,画出对应的 0 到 9 形状,标出对应的二极管控制I/O口,得到数值可以参照我们提供的数据。

片选:片选就是开关,选择控制数码管亮或不亮的,每个数码管都有自己的片选。

数据口:数据口就直接接到了I/O口上面,低电平有效,灌电流。

数码管的显示分为两种:静态显示和动态显示。

单片机课程设计模拟键盘输入及显示系统设计

单片机课程设计模拟键盘输入及显示系统设计

课程设计说明课程名称:单片机应用基础设计题目:模拟键盘输入及显示系统设计专业:机械设计制造及其自动化指导教师:设计者:第一章课程设计的目的和要求1.1 课程设计的目的和要求1.2 课程设计预备知识1.3课题设计的任务............................................................第二章总体设计介绍对系统设计的总体认识及解决方案,并对采取的方案进行论证第三章硬件设计介绍本系统所选用的各种芯片的功能、引脚、相应的命令控制字格式等,画出系统工作原理图及实现方法第四章软件设计介绍本系统的主要功能模块程序的框图,以及总体程序框图和设计思路第五章系统调试介绍系统调试过程以及出现的问题、解决方法第六章结束语简述课程设计的收获、体会以及对本教学环节的意见和建议参考文献+1第一章、课程设计目的和要求 1.1课程设计目的和要求《单片机应用基础》课程设计是学好本门课程的又一重要实践性教学环节, 目的就是配合本课程的教学和平时实验,以达到巩固消化课程的内容,进一步加强综合应用能力及单片机应用系统开发和设计能力的训练,启发创新思维,使之具有独立单片机产品和科研的基本技能,是以培养学生综合运用所学知识的过程, 是知识转化为能力和能力转化为 工程素质的重要阶段。

1.2课程设计预备知识总的来说,设计者要具备Mcs-51单片机的有关硬件及软件知识,汇编语言编程或者语言编程的有关知识,1\0接口的有关知识,WAVE6000集成调试软件的应用,能利用PROTEUS 软件绘制系统工作原理,一定的设计经验等等。

本次设计所要掌握的一些基本知识如下:(1)键盘工作原理键盘是由若干按键组成的开关矩阵,是嵌入式控制系统的一种输入部件。

键盘分两种: —种是独立式按键, 另一种是矩阵式按键。

如图所示。

独立式按键用的比较少,可以直接与 单片机的P1 口某一位进行连接,通过判断这一位的状态知道是否有键输入。

单片机课程设计-模拟键盘输入及显示系统设计

单片机课程设计-模拟键盘输入及显示系统设计

单片机课程设计-模拟键盘输入及显示系统设计课程设计说明书课程名称:单片机应用基础设计题目:模拟键盘输入及显示系统设计专业:机械设计制造及其自动化指导教师:设计者:学号:目录第一章课程设计的目的和要求…………………………………………… (1)1.1课程设计的目的和要求 (1)1.2课程设计预备知识 (1)1.3课题设计的任务 (2)第二章总体设计介绍对系统设计的总体认识及解决方案,并对采取的方案进行论证第三章硬件设计介绍本系统所选用的各种芯片的功能、引脚、相应的命令控制字格式等,画出系统工作原理图及实现方法第四章软件设计介绍本系统的主要功能模块程序的框图,以及总体程序框图和设计思路第五章系统调试介绍系统调试过程以及出现的问题、解决方法第六章结束语思维,使之具有独立单片机产品和科研的基本技能,是以培养学生综合运用所学知识的过程,是知识转化为能力和能力转化为工程素质的重要阶段。

1.2课程设计预备知识总的来说,设计者要具备Mcs-51单片机的有关硬件及软件知识,汇编语言编程或者C语言编程的有关知识,I\O接口的有关知识,WAVE6000集成调试软件的应用,能利用PROTEUS软件绘制系统工作原理,一定的设计经验等等。

本次设计所要掌握的一些基本知识如下:(1)键盘工作原理键盘是由若干按键组成的开关矩阵,是嵌入式控制系统的一种输入部件。

键盘分两种:一种是独立式按键,另一种是矩阵式按键。

如图所示。

独立式按键用的比较少,可以直接与单片机的P1口某一位进行连接,通过判断这一位的状态知道是否有键输入。

在应用中通常需要数量较多的按键,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

微机课设报告 打字游戏汇编语言的设计

微机课设报告 打字游戏汇编语言的设计

学号09750223实习报告微型计算机原理及应用课程设计报告打字游戏程序设计起止日期:2012 年1 月3 日至2012年 1 月6 日学生姓名马聪班级09电气2班成绩指导教师(签字)电子与信息工程系2012年1月05日摘要为了更好地掌握学习微机原理的知识,我们进行了这次课程实验,以完善我们的知识体系,我们通过汇编语言在PC机上完成了一个打字游戏的设计,它具有练习打字的功能。

本有游戏主要针对指法练习,并提供字母和单词两种选择。

根据用户自身情况,可以进行速度调节,以达到最佳的练习效果。

同时本游戏提供显示得分,正确率和失败个数的功能。

当失败个数超过一定个数后,游戏结束并提示是否继续。

目录一、课程设计题目 (2)二、设计思路模块划分流程图 (2)㈠设计思路 (2)㈡模块划分 (2)㈢流程图 (3)三、程序源代码 (4)四、调试过程,运行结果和出现的问题及解决 (12)1、调试结果 (12)2、在调试中碰到问题 (14)五、课程设计心得 (14)六、成绩单 (15)一、课程设计题目、内容和实现的功能字母打字游戏基本功能:0 菜单主界面由“开始”“速度调整”“暂停”“结束”“统计得分”等项组成1 按ESC键退出游戏,显示得分,正确打字数和错误打字数.二、设计思路、模块划分、流程图(一)设计思路:利用计算机控制发声的原理,来演奏乐曲的程序。

乐曲按一定的高低、长短和强弱关系组成的音调。

根据歌谱,来编写歌程序的音符表和节奏表。

组成乐谱的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。

通过来设时间值,然后通过发声程序“*”来播放音乐。

通过键盘控制扬声器发出各种音符声音,使计算机键盘变成钢琴键盘,这是可以用它来演奏各种简单的声音。

弹奏时对应乐谱上的q音符,按下1,程序将接收到的1键的频率为262Hz送入程序中。

1、音乐播放选择从键盘上输入“1”,则播放“新年好”;从键盘上输入“q”,则退出;从键盘上输入其它字符,则等待重新输入。

小小打字游戏设计_课程设计材料

小小打字游戏设计_课程设计材料
[3]陈伟.SQL Server2005数据库应用与开发教程[M].清华大学出版社,2007
[4]谭浩强.C程序设计(第四版)[M].清华大学出版社,2010
[5]赵民.新概念Visual C#.NET Web教程[M].北京:北京海淀出版社,2000
指导教师签字
系主任签字
年月日
课程设计评审表
指导教师评语
(2)打字游戏的软件设计、系统功能、基本信息等。




(1)符合C#程序设计、打字游戏程序设计的基本要求;
(2)能够实现游戏的正常运行;
(3)达到打字练习兼娱乐的效果等。



为期两周




1.分析设计阶段:按照需求分析、总体设计、详细ห้องสมุดไป่ตู้计这几个步骤进行。这一阶段前第1天完成。
2. 编码调试阶段:根据设计分析方案编写C#代码,然后调试该代码,实现课题要求的功能。这一阶段在第3天完成。
3. 调试与改进阶段。这一阶段在第4天完成。
4. 总结报告阶段:总结设计工作,写出课程设计说明书、需求分析、总体设计、详细设计、编码、测试的步骤和内容。这一阶段在第5天完成。




[1]王晶.Visual C#.NET Web6.0基础[M].辽宁:辽宁教育出版社,2002
[2]郑阿奇、梁敬东.C#程序设计教程[M].北京:机械工业出版社,2015
成绩
评定
指导教师签字:
年 月 日
答辩教师评语
成绩
评定
答辩教师签字:
年 月 日
二级学院工作小组意见
成绩
评定
二级学院领导签字(盖章):

C#打字游戏课程设计报告

C#打字游戏课程设计报告

课程设计课程设计名称:小小打字游戏专业班级:计算机科学与技术11级01班指导教师:姓名学号:课程设计时间: 2013.1.5-2013.1.11课题名:C#程序设计题目:打字游戏2013年1月10 日一、需求分析软件名称:小小打字游戏(1)描述:使用VS2010开发环境,用C#语言编写一个打字游戏,游戏界面随机出现下落的A到Z的26个字母,当用户按下相应的键,游戏屏幕上正在下落的字母就会被消除,游戏分数将相应增加。

(2)系统功能:1、游戏显示:游戏窗口,随机下落颜色不定的65个字符,并根据游戏得分实时增加字母下落的速度。

2、游戏操作:按下键盘上对应字符键,游戏窗口上正在下落的对应字母被消除,并使游戏分数增加1。

3、实时显示用户的正确个数、错误个数和正确率!4、通过用户自己调整游戏的困难程度(包括高手,平民,菜鸟)。

5用户自己可以控制游戏的开始,暂停,结束。

2、系统设计(图表方式,要有说明部分)(1)新建程序项目:在VS2010上建立 game项目。

(2)设计界面:①、如图1-1、游戏窗口界面:有六个控件(4个Label控件,1个timer 控件 ,1个menustrip控件),界面背景图片由系统函数生成黑色。

(3)功能模块设计1、系统模块2、操作流程图三、系统实现核心代码创建线程:private void timer1_Tick(object sender, EventArgs e) {Random random=new Random ();Label label=new Label ();label .Height =40;label .Width =40;label.Left =random .Next (this .Width );this.Controls.Add(label);letter letter=new letter (label ,random ,this );thread = new Thread(new ThreadStart (letter.uptodown)); thread.Start();}窗体键盘事件以及统计正确与错误:private void Form1_KeyPress(object sender, KeyPressEventArgs e) {bo = true; //建立一个布儿类型foreach(object label in this.Controls){if(label is Label){Label b=(Label)label;if (b.Text[0] == e.KeyChar){Controls.Remove(b);label1.Text = "正确: "+Convert.ToString (++i) ;label3.Text = "正确率: " + Convert.ToString(i * 1.0 / (i + j));bo = false;}}}if (bo){label2.Text = "错误: " + Convert.ToString(++j);label3.Text = "正确率: " + Convert.ToString(i * 1.0 / (i + j));}}其他功能函数(开始,暂停,结束):private void 开始ToolStripMenuItem_Click(object sender, EventArgs e){Controls.Remove(label4);timer1.Start();}private void 暂停ToolStripMenuItem_Click(object sender, EventArgs e){timer1.Stop();}private void 退出ToolStripMenuItem_Click(object sender, EventArgs e){this.Close();}难度调节代码:private void 普通ToolStripMenuItem_Click(object sender, EventArgs e){timer1.Interval = 1000;}private void 困难ToolStripMenuItem_Click(object sender, EventArgs e){timer1.Interval = 100;}private void 菜鸟ToolStripMenuItem_Click(object sender, EventArgs e){timer1.Interval = 2000;}}字母飘动下落函数部分代码:try{while (label.Top <formparent.Height +100){if (label == null){Thread.CurrentThread.Abort();}label.Top += 1;Thread.Sleep(10);}if (Thread.CurrentThread.IsAlive){Thread.CurrentThread.Abort();}}创建字母函数部分代码:speed = radom.Next(5) + 1;switch (speed){case 1:label.ForeColor = System.Drawing.Color.Pink;break;case 2:label.ForeColor = System.Drawing.Color.Aqua; break;case 3:label.ForeColor = System.Drawing.Color.Orange; break;case 4:label.ForeColor = System.Drawing.Color.White; break;case 5:label.ForeColor = System.Drawing.Color.Yellow; break;}四、游戏窗体截图运行图:五、所用的知识点Winform基础(包括简单控件的使用)、多线程的操作等等知识点。

单片机打地鼠课程设计

单片机打地鼠课程设计

单片机打地鼠课程设计一、课程目标知识目标:1. 理解单片机的基本原理和功能,掌握其编程方法。

2. 学习并掌握利用单片机控制打地鼠游戏的硬件连接和软件编程。

3. 了解打地鼠游戏的规则和设计理念,将其与单片机技术相结合。

技能目标:1. 能够运用所学知识,设计并搭建单片机打地鼠游戏的硬件电路。

2. 独立编写程序,实现打地鼠游戏的基本功能,如随机出现地鼠、计分等。

3. 提高问题分析、电路设计和编程调试的能力。

情感态度价值观目标:1. 培养学生对单片机技术及电子制作的兴趣,激发创新意识和探索精神。

2. 培养团队合作精神,学会与他人共同解决问题,提高沟通协作能力。

3. 增强学生的自信心,使其在解决问题的过程中,体验成功的喜悦。

课程性质分析:本课程为实践性较强的课程,结合单片机技术,让学生在动手实践中掌握相关知识。

学生特点分析:学生具备一定的电子基础和编程知识,喜欢动手操作,对游戏类项目有较高的兴趣。

教学要求:注重理论与实践相结合,以学生为主体,鼓励学生自主探究和解决问题,提高实践能力。

将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 理论知识:- 单片机原理与结构:介绍单片机的组成、工作原理及性能指标。

- 编程基础:回顾C语言基础知识,强调在单片机编程中的应用。

2. 实践操作:- 硬件连接:学习并掌握单片机与按键、LED、蜂鸣器等外设的连接方法。

- 软件编程:编写控制打地鼠游戏的程序,实现随机出现地鼠、击打计分等功能。

3. 教学大纲:- 第一阶段(1课时):回顾单片机原理,介绍打地鼠游戏设计思路。

- 第二阶段(2课时):学习硬件连接,动手搭建打地鼠游戏电路。

- 第三阶段(3课时):学习编程方法,分组编写打地鼠游戏程序。

- 第四阶段(1课时):调试程序,展示成果,总结经验。

4. 教材关联:- 教材章节:第四章 单片机应用实例、第五章 C语言编程基础。

- 教学内容:实例分析与编程实践相结合,使学生更好地掌握单片机应用。

单片机课程设计报告-俄罗斯方块

单片机课程设计报告-俄罗斯方块
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
; <i> Set the top of the stack to the highest location.
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
四、调试过程
1、学号显示部分单独调试
这个在之前的很多实验中都有涉及,程序较为简单,语句也不复杂,本实验中才用的是并行动态显示,调试一次成功。
2、游戏程序调试相关
五、验收结果
下图为当时的整个实验装置:
实验中,游戏随机产生方块
按下控制键,方块旋转:
按下控制键,方块加速下落
方块下落到底部,最底层被填满:
最底层填满后,自动消去这一层:
三、
1.程序整体思路
单片机上的程序设计一般是一个大循环结构,对于俄罗斯方块的程序设计,首先产生一个伪随机数,其范围是0-6,分别对应俄罗斯方块中随机产生的七种方块,然后程序根据此数值所对应的图形模块装入RAM的固定区域内,紧接着将此图像写入LCD所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在显示屏上,如果没有控制键按下,图形将自动向下移动。如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,当图形最上层到达显示区顶部,则游戏结束,此时将清除显示缓冲的内容,游戏重新开始。
2.图形显示
QH12864T液晶显示器一共有128*64个像素点,本程序中每个像素点用一个坐标表示,左上角为(0,0),右下角为(128,64)。对于显示类的基本操作是任意点亮一个点,熄灭一个点,任意点亮n个点,灭掉n个点,如此一来游戏的第一个关键点就完成了。

打字游戏程序设计报告

打字游戏程序设计报告

1.1 设计目的 本次课程设计的目的主要是将课堂上所学的知识学以致用,通过程序的制作过程学习课外的新知识,并加强加深对旧知识的理解与掌握,并加强加深对旧知识的理解与掌握,最终使学生达到以最终使学生达到以下三点:下三点:1.使学生增进对汇编语言的认识,加强用汇编语言编程的能力。

2.使学生了解和掌握汇编语言程序设计过程、方法及其实现,为以后微机原理课程的深入学习打下良好基础。

原理课程的深入学习打下良好基础。

3. 3. 使学生进一步掌握屏幕输出显示的设计方法。

使学生进一步掌握屏幕输出显示的设计方法。

1.2 课程设计在教学计划中的地位和作用《微机计算机原理与接口技术》这门课是自动化和电子等专业重要的基础专业课程之一,要求我们要有实际的动手能力。

要求我们要有实际的动手能力。

由于我们在课堂上学到的大多都是由于我们在课堂上学到的大多都是理论知识,所以需要通过课程设计这个环节,把我们所学到的知识运用到实践,这也是课程设计的主要目的,其中包括提高汇编等语言的编程能力及对接口等硬件的理解与分析能力和设计接口电路的能力。

本次设计课题使我们在汇编等语言的编程方面得到了很大的提高,的编程方面得到了很大的提高,是我受益匪浅。

是我受益匪浅。

原本陌生的和不太熟悉的指令程序及各种定义,序及各种定义,现在都有了一些认识及更深的理解。

现在都有了一些认识及更深的理解。

现在都有了一些认识及更深的理解。

这对我们以后走向社会,这对我们以后走向社会,这对我们以后走向社会,更更快地适应工作奠定了很好的基础。

快地适应工作奠定了很好的基础。

第二章 打字游戏程序设计内容要求和设计思想2.1 设计内容要求要求设计的程序需包括:在游戏开始后,按回车键进入打字游戏;按要求设计的程序需包括:在游戏开始后,按回车键进入打字游戏;按ESC键返回主界面;按空格暂停;按大写字母E 程序结束。

程序结束。

2626个字母中的任意一字母从屏幕落下,在下落的过程中键入落下的字母,如果正确,字母消失,分数增加;如果不正确,字母继续下落。

课程设计打字游戏

课程设计打字游戏

汇编语言课程设计设计题目: 指法练习班级: 计算机04-4班学号: 20042390作者: 王丰指导老师: 郑利平日期: 2007.1.5汇编语言课程设计报告-----<打字游戏>一、课程设计目的课程设计使学生更进一步理解和掌握汇编语言知识、程序设计的方法和技巧,使学生能够使用汇编语言分析、设计中小型程序的能力。

通过课程设计,有助于学生更好的了解整个课程的知识体系,锻炼学生运用本课程的知识解决更复杂的实际问题的能力,从而为后续课程的学习、毕业设计以及将来的实际工作打好坚实的基础。

二、设计题目指法练习三、设计要求1、从屏幕上方以一定的时间间隔随机落下可显示字符,字符的出现位置亦是随机的;2、在多个字符下落的过程中可输入任意键,若键入与其中的任意一个字符相匹配的键,则该字符高亮显示并发出蜂鸣声,同时计分;3、按ESC键结束练习并显示命中率;4、再次按ESC键退出。

四、设计环境硬件:PC机,软件: masm5.0五、设计分析指法练习,是在屏幕上以一定的时间间隔随机的下落一写字符,我在程序中的设计方法是从屏幕的第一行开始显示一个字符,然后在用一个时间延时函数延时一段时间,再在此位置显示空格字符,延时后在同一列的下一行显示原字符,如此循环,中间如果有输入正确的字符,则,循环停止, 并同时将此字符高亮显示,方法是改变此字符的属性,并将score加1,然后光标移到第一行还是新的循环.若输入中间字符不正确,循环到21行时,则扬声器发出蜂鸣声,同时life减1.设计中要求每次下落的字符是随机的,我在程序中的设计方法是取系统时间1/100秒,然后将此时间模取26,将得到余数加上61,将此作为输出字符的ASCLL码,如此循环78次,将这些字符存入letter缓冲区,并在屏幕最上方显示出来.开始下落的字母的位置也是随机的,同样取系统时间,,由于一行最多只能有78个字符,所以当取的时间大于等于78时,应减去78,将得到的结果作为取字符的位置,此种随机虽然不是很严谨,但用在此程序中还是很不错的.题目中还要求计算命中率,由于在游戏开始的同时开始了记分,所以在结束游戏时,将得分和错误统计出来,很容易计算出命中率,这里就不做多余的叙述.在题目的要求的基础上,我还给游戏增加了几个难度,其实也很简单,就是控制字母下落的速度,方法是改变每次字符显示的时间间隔,这样从屏幕上看,字母下落就会有快慢.六、程序的模块程序设计时,我没有分模块,只有实现个别功能的几个子程序,分别是发声程序,延时程序,和命中率计算与显示程序,这在原代码中均有注释,在此就不在详细叙述.七、课程设计心得由于课程设计开始的比较早,所以有时间去准备.开始时在网上看了一些资料和例子,搞清楚了程序设计的基本原理.最开始不明白的地方就是如何让字符下落,后来发现就是不停的在屏幕的不同位置显示该字符,加以延时,看起来就像是字符不断的从上面掉下来.随机问题也是本程序的一个难点,看过资料后知道汇编中没有现成的完美的随机函数.所以我就想到取系统时间来制造随机数,因为时间时刻都在变化,而且打字的时间也不一定,结果游戏的随机性还不错,呵呵这学期汇编的学习,自己感觉还不错,平时也练习了不少.从汇编程序的学习中,我觉得自己突然一下子明白了一般程序设计的原理,看程序时,不再感觉茫然,自己写点小程序时,也知道该如何下手.算法上也学到了不少新的东西,总算劳有所获吧!本打算把程序的运行流程图画出来,无奈,最近考试太多,时间实在不够啊,只有在程序中直接注释了,其实程序的思路很清晰,相信大家多能看懂最后,感谢郑利平老师一学期来指导和帮助,也感谢我们班的桑磊同学在课程设计中给我解答疑问!八、源程序如下:;=======================================================================;打字游戏程序;=======================================================================init_game macro op1,op2,op3,op4,op5,op6 ;循环输出,用于初始化界面mov cx,0mov dh,op1 ;起行mov dl,op2 ;起列op6:mov ah,02hmov bh,00hint 10hpush cxmov ah,0ahmov al,op3 ;要显示的字符mov cx,01hmov bh,00hint 10hpop cxinc cxinc op4 ;指出循环输出的是行还是列cmp cx,op5 ;循环次数jne op6endm;=======================================================clean macro op1,op2,op3,op4 ;用于清屏,分别是起止的行和列mov ah,6mov bh,00010111bmov al,0mov ch,op1mov cl,op2mov dh,op3mov dl,op4int 10hmov ah,2mov bh,0mov dh,0mov dl,0int 10hendm;======================================================menu macro op1,op2,op3 ;用于屏幕上文字的输出mov cx,0mov ah,02hmov bh,00hmov dh,op1mov dl,op2int 10hlea dx,op3mov ah,9int 21hendm;=======================================================data segmentfgf db '===============================================$' ;分隔符menu1 db '1.start game$'menu2 db '2.select level$' ;主界面上显示的内容menu3 db '3.exit$'menu4 db 'select number of menu:$'menu5 db 'author: wangfeng$'menu6 db 'NO. : 20042390$'menu7 db '1.very easy$'menu8 db '2.normal$' ;难度的选择menu9 db '3.hard$'menu10 db '4.return$'menu11 db 'data : 2006.12.24$'meg1 db 'press any key to start the game...$' ;游戏开始之前的提示meg2 db 'press esc key return main menu$'meg3 db 'press space key for pause $'meg4 db 'when the game was paused,press ese to quit!$'meg5 db 'life:$' ;生命数meg6 db 'score:$' ;分数meg7 db 'hit the letter num:$'meg8 db ' miss letter num:$'meg9 db ' the shooting is:$'ma db 0mb db 0sped1 dw 0speed dw 3000d ;游戏的速度,也决定了游戏的难度letters db 78 dup(0) ;上方显示的字母life db 39hposition db 1 ;上方字母的位置用于控制落下的字母time_m db 0time_s db 0xmul db 13n db 26score1 db 0level db 1hang db 0line db 0fen1 db 0fen2 db 0fen3 db 0fen4 db 0fen5 db 0string db '100%$'error db 0data ends;============================================code segmentassume cs:code,ds:data;,ss:stackstart: mov ax,data mov ds,ax ;这里是几个数据的初始化 mov position,1 mov speed,3000 mov level,1 mov sped1,50000 mov error,0 mov score1,0 jiemian: mov ah,01h mov cx,00h or ch,00010000b int 10h ;置光标类型,用于隐藏光标 clean 0,0,24,79 ;下面这些是游戏的初始化 init_game 0,0,08h,dl,80,sk1 init_game 24,0,08h,dl,80,sk2 init_game 0,0,08h,dh,25,sk3 init_game 0,79,08h,dh,25,sk4 menu 5,15,fgf menu 7,25,menu1 ;界面显示 menu 9,25,menu2 menu 11,25,menu3 menu 13,15,fgf menu 15,25,menu4 menu 17,55,menu5 menu 19,55,menu6 menu 21,55,menu11 mov ah,2 mov bh,0 mov dh,15 mov dl,47 int 10h ;把光标放在合适的位置 mov ah,0ah mov al,' ' mov bh,00h mov cx,01h int 10h ;在选择时屏蔽其他的按键,使之不出现在屏幕上 mov ah,1 int 21h input: cmp al,'1' je begin ;当输入字符是1时, ;跳转到begin 开始游戏 cmp al,'2'je to_speed_c ;当输入字符是2时,跳转, ;由于不能直接跳转到 ;speed_c 故用了个转移 cmp al,'3' je to_exit cmp al,1bh je to_exit_d to_otherkey: jmp otherkeyto_exit: mov ah,1 int 21h cmp al,0dh jne to_otherkey jmp exitto_speed_c:jmp speed_cto_exit_d:jmp exit;=================================== begin:mov ah,1int 21hcmp al,0dhjne to_otherkeyclean 1,1,23,78play_message: ;显示有关游戏提示menu 10,18,meg1menu 12,18,meg2menu 14,18,meg3menu 16,18,meg4mov ah,07hint 21hcmp al,1bh;按任意键继续,;不把输入的字符显示在屏幕上je to_jmjmp playto_jm:jmp jiemianplay:clean 1,1,23,78mov life,39hmov ah,2mov bh,0mov dh,1mov dl,1int 10hmov bx,0lea si,lettersoutput_letters: ;显示上方字母mov ah,2chint 21h mov al,dlmov ah,0div nmov dl,ahadd dl,61hmov [si],dlmov ah,2int 21hmov cx,14987call waitfinc siinc bxcmp bx,78je nextjmp output_lettersnext:menu 23,70,meg5menu 23,30,meg6;生命数的相关显示push dxmov ah,2mov bh,0mov dh,23mov dl,76int 10hmov ah,0ahmov al,lifemov bh,0mov cx,1int 10hmov ah,2mov bh,0mov dh,23mov dl,43int 10hmov ah,0ahmov al,score1mov al,30hmov bh,0 mov cx,1 int 10h pop dx jmp game sub_p: sub position,78 cmp position,0 jne next3 inc position next3: jmp game_next game: lea si,letters mov ah,2ch ;伪随机算法,方法是读取1/100秒, int 21h mov al,dl mov position,al cmp position,0 jne next2 inc position next2: cmp position,78 ;和78比较,大于则减去78 ja sub_p game_next: add si,word ptr position dec si mov dl,position ;position 就代表的是列 mov ah,02h mov dh,1 mov bh,0 int 10h ;置光标位置 mov bl,12h temp: mov cx,0 nextrow: push cx mov cx,0 yanchi: ;延迟 push cx mov cx,0 yanchi1: add cx,1 cmp cx,sped1 ;延迟 jne yanchi1 push dx mov ah,06h mov dl,0ffh int 21h pop dxjz pass ;不输入则跳转pass cmp al," " je pause1 ;空格,暂停 jmp skip1 pause1: jmp pause skip1: cmp al,1bh je display;esc,返回到开始时的界面cmp al,[si] je to_disappear ;正确输入,字母消失pass: pop cxinc cx cmp cx,speed ;speed,字母下落速度 je print1 jmp yanchi print1: jmp print to_disappear:mov bh,0 mov ah,3 int 10h mov hang,dh mov line,dl mov bh,0 mov ah,9 mov cx,1 mov bl,1ch int 10h mov ah,2 mov bh,0 mov dh,hang mov dl,line int 10h mov dl,[si] mov ah,2 int 21h call delay0 jmp disappear ;跳到记分段 display: clean 1,1,23,78 call disp mov ah,1 int 21 cmp al,1bh je to_start1 to_start1: jmp start to_exit1: jmp exit pause: push dx mov ah,06h mov dl,0ffh int 21h pop dx cmp al,1bh ;暂停时输入大写的q,则退出游戏 je display cmp al," " ;再次按空格,游戏继续 jne pause jmp pass print: ;在字母处输入空格填 mov ah,0ah mov bh,0 mov al," " mov cx,1 int 10h mov ah,02h mov bh,0 inc dh int 10h ;光标下移一行mov ah,09hmov al,[si]mov bh,0 mov cx,1 int 10h ;输出字母 pop cx inc cx cmp cx,21 ;如果落到第21行还没有消失, ;则life 减一,字母消失 je to_print_next jmp nextrow ;如果没到21行,继续下落 to_print_next: push ax mov al,error inc almov error,al pop ax call sound1 jmp print_next ;change_0: ;jmp print_next disappear: ;正确输入后字母消失 pop cx pop cx mov ah,0ah mov bh,0 mov al," " mov cx,1 int 10h inc score1 ;此处代码是为了同步输出得分 ;和当前life 的剩余值 push ax push bx mov al,score1 mov ah,0 mov bl,10 div bl mov fen1,al mov fen2,ah pop bx pop ax mov ah,2 mov bh,0 mov dh,23 mov dl,43 int 10h mov ah,0ah mov bh,0 mov al," " mov cx,1 int 10h mov ah,0ah mov al,fen1 add al,30h mov bh,0 mov cx,1 int 10h mov ah,2 mov bh,0 mov dh,23 mov dl,44 int 10h mov ah,0ah mov bh,0 mov al," " mov cx,1 int 10hmov ah,0ah mov al,fen2add al,30h mov bh,0 mov cx,1 int 10h mov dh,hang ;输入正确后, ;将该字符在原位置高亮显示 mov dl,line mov bh,0 mov ah,2 int 10h mov ah,9 mov bh,0 mov al,' ' mov cx,1 mov bl,17h int 10hjmp hit to_over: jmp start print_next: ;life 减为0时,游戏结束 sub life,1 cmp life,30h je to_over mov ah,0ah mov al," " mov bh,0 mov cx,1 int 10h mov ah,02h mov dh,23 mov dl,76 mov bh,0 int 10h ;更新life mov ah,0ah mov al,life mov bh,0 mov cx,1 int 10h hit: ;重新把光标移到顶端 mov ah,02h mov bh,0 mov dh,1 mov dl,position int 10h mov ah,2ch int 21h mov al,dl mov ah,0 div n add ah,61h mov [si],ah ;重新在空格处设置一个字母 mov ah,0ah mov bh,0 mov cx,1 mov al,[si]int 10hjmp game speed_c: ;速度选择 mov ah,1 int 21h cmp al,0dh jne otherkey jmp speed_jm otherkey: ;隐藏非法的字符 push ax mov ah,2 mov bh,0 mov dh,15 mov dl,48 int 10hmov ah,0ahmov al," " mov bh,00h mov cx,01h int 10h mov ah,2 mov bh,0 mov dh,15 mov dl,47 int 10h pop ax mov dx,ax mov ah,2 int 21h jmp input speed_jm: ;难度选择的界面 clean 1,1,23,78 menu 6,15,fgf menu 8,30, menu7 menu 10,30,menu8menu 12,30,menu9 menu 14,30,menu10 menu 16,15,fgf menu 18,25,menu4 choose_speed: mov ah,2 mov bh,0 mov dh,18 mov dl,47 int 10h mov ah,1 int 21h choose_next: cmp al,'1' je speed1_1 jmp spe2 speed1_1: jmp speed1 spe2: cmp al,'2' je speed2_2 jmp spe3 speed2_2: jmp speed2 spe3: cmp al,'3' je speed3_3 jmp spe4 speed3_3: jmp speed3 spe4: cmp al,'4' je h_jm cmp al,1bh je h_jm_d h_jm: mov ah,1 int 21h cmp al,0dh jne otherkey1 jmp jiemian h_jm_d: jmp jiemian speed1: mov sped1,50000d jmp begin speed2: mov sped1,40000d jmp begin speed3: mov sped1,20000d jmp begin otherkey1: push ax mov ah,2 mov bh,0 mov dh,20 mov ah,2 mov bh,0 mov dh,15 mov dl,46 int 10h exit: ;退出游戏 mov ah,6 mov bh,7 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,80 int 10h mov ah,2 mov bh,0 mov dh,0 mov dl,0 int 10h ;清屏 mov ah,4ch int 21h waitf proc near push axwaitf1: in al,61h and al,10h cmp al,ah je waitf1 mov ah,al loop waitf1 pop ax ret waitf endp sound1 proc ;一个扬声器实验代码直接抄过来的呵呵 push cx push ax mov cx,1000h in al,61h and al,11111100b out 61h,al again: xor al,2 out 61h,al push cx mov cx,0ffffh continue: nop loop continue pop cx loop again pop ax pop cx sound1 endp ret delay0 proc push cx push ax mov cx,0ffffh delay1: nop mov ax,1000h delay2: dec ax jnz delay2 loop delay1 pop ax pop cx ret delay0 endp disp proc near ;这一段代码是为了显示打字结果的 menu 5, 15,fgf menu 7, 25,meg7 menu 9, 25,meg8 menu 11, 25,meg9 menu 13, 15,fgf push ax push bx mov al,score1 mov ah,0 mov bl,10 div bl mov fen3,al mov fen4,ah pop bx pop ax push ax push dx mov ah,2 mov bh,0 ;显示正确的得分 mov dl,45 mov dh,7 int 10h mov al,fen3 mov dl,al add dl,30hmov ah,2int 21hmov dl,fen4add dl,30hmov ah,2int 21hpop dxpop axpush axpush dxmov al,erroradd al,30hmov fen5,almov ah,2mov bh,0mov dl,45mov dh,9int 10hmov ah,2mov dl,fen5;显示错误的个数int 21hpop dxpop axpush axpush bxpush cxpush dxmov ah,2mov bh,0mov dl,44mov dh,11int 10hmov al,score1 mov dl,error add dl,alcmp al,dlje skipmov bl,10mul bldiv dlmov ma,al;命中率十位mov al,ahmul bldiv dlmov mb,al;命中率个位jmp next1skip:push dxlea dx,string ;如果错误为0,则命中率为100%mov ah,9int 21hpop dxjmp exit1next1:push dxmov dl,maadd dl,30hmov ah,2int 21hmov dl,mbadd dl,30hmov ah,2int 21hmov ah,2mov dl,25h ;输出'%' int 21hpop dxexit1:mov ah,1int 21hcmp al,1bh jne exit1pop dxpop cxpop bx pop ax ret disp endpcode endsend start。

单片机贪吃蛇课程设计报告模板

单片机贪吃蛇课程设计报告模板

电气与信息工程学院单片机课程设计报告一、设计任务及要求基本功能:制作一个8*8点阵的贪吃蛇游戏,系统以单片机的C语言的软件设计,系统通过LED点阵屏为载体显示数据,并用五个输入端表示五个控制键(上下左右及加速)。

系统硬件部分由STC89C52RC单片机,8*8点阵屏,5个按键,软件部分在keil环境下用C51语言编写,包括游戏初始化蛇的节数,以及障碍墙壁,游戏结束时自动复位。

具体要求:1、用四个按钮控制贪吃蛇的行径,一个按钮控制贪吃蛇的加速,蛇的初始长度为2点,设置墙壁。

2、蛇吃到长度为1点的食物时,自身长度增加1点。

2、速度按钮带有一次加速,按两下速度按钮蛇的行进速度回到初始值。

3、当蛇碰到墙壁或自己的身体时游戏结束。

4、用proteus设计,仿真基于STC89C52RC单片机的8x8点阵贪吃蛇的硬件电路。

5、游戏结束,系统自动复位。

二、硬件电路设计本系统以STC89C52RC为核心,设置12MHz的晶振,使得单片机有合理的运行速度。

LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示程序的运行情况,是模块化的显示组件,本设计采用8*8共阳红色点阵显示屏,用来显示贪吃蛇的游戏画面。

五个独立按键控制蛇的游走方向(上下左右)和加速减速的功能。

贪吃蛇是一款经典的小游戏,玩家通过按键操控贪吃蛇不断地吃食物,蛇身逐渐伸长,当蛇碰到蛇身和墙壁时游戏结束。

需要注意的是实际元件中,点阵的封装不尽相同,因此需要测试出每个引脚的功能,以便正确连线。

注意,每个像素点的额定电压在3v左右,电压过大将会彻底损坏。

三、系统软件设计软件方面采用了C51编写代码,代码编写模块如下图:核心代码主要为游戏处理、信息处理和按键处理。

编写游戏的功能代码,先定义游戏的数据结构和常量。

其中食物的数据结构采用结构体定义,两个unsigned char变量分别定义为食物的横纵坐标;蛇的身体定义为长度最大值为20的数组,游戏中贪吃蛇长度达到39,游戏通关结束。

C#课程设计报告-打字游戏

C#课程设计报告-打字游戏

课题名:C#课程设计题目:小小打字游戏学生姓名:XXXXXX 学号: 1008060255 班级:计科101班院系:计算机科学与信息学院专业年级:计算机科学与技术2012年12月 2 日一、需求分析软件名称:小小打字游戏(1)描述:使用VS2010开发环境,用C#语言编写一个打字游戏,游戏界面随机出现下落的A到Z的26个字母,当用户按下相应的键,游戏屏幕上正在下落的字母就会被消除,游戏分数将相应增加。

(2)系统功能:①、登录功能:启动软件,出现登录界面,用户输入账号密码,正确后方可进入游戏。

②、注册功能:不存在的用户,可以注册。

③、软件互斥:通过创建互斥变量,使打字游戏软件只能单独开启一个。

④、游戏控制:按F1开启游戏,F2暂停游戏,F3继续游戏,F4使用游戏积分兑换生命值。

⑤、游戏显示:游戏窗口,随机下落颜色不定的A到Z 26个字母,并根据游戏得分实时增加字母下落的速度。

⑥、游戏操作:按下键盘上的A~Z 26个字母键,游戏窗口上正在下落的对应字母被消除,并使游戏分数增加1。

⑦、数据保存和清除:使用数据库保存用户的游戏数据,并可调用数据库数据显示在游戏界面上显示,管理员账号可以清除游戏记录数据。

⑧、游戏界面信息显示:显示相应的游戏状态信息,暂停游戏提示,结束游戏提示即游戏排名。

需要存储的数据信息:1、游戏分数2、游戏等级3、用户4、密码5、游戏开始时间6、游戏结束时间二、系统设计(图表方式,要有说明部分)(1)新建程序项目:在VS2010上建立小小打字游戏项目。

(2)设计界面:①、如图1-1、即为用户登录界面:有三个控件(2个Label控件,1个Button控件),界面背景图片由Photoshop图片处理软件设计。

图1-1、用户登录界面②、图1-2、为注册用户界面,两个Label控件、1个Button控件。

图1-2、用户注册界面③、图1-3、为游戏主界面图1-3-1、游戏主界面游戏有菜单栏控件,有操作提示信息:F1、F2、F3、F4相应功能图3-1-2、游戏主界面,暂停游戏情况图3-1-3、游戏主界面,结束游戏显示情况图4-1、版本信息(3)功能模块设计1、系统模块2、操作流程图三、数据库设计(数据库类软件)GameUser 表:属性名类型长度可空备注ID int 否主键,自增ID UserName nvarchar 50 可用户名Password nchar 10 可密码GameInfo 表:属性名类型长度可空备注IDD int 否主键,自增IDUserID int 可用户ID,即GameUser表的ID值BeginTime datetime 可存储游戏开始时间OverTime datetime 可存储游戏结束时间GameLevel int 可游戏结束时达到的等级GameScores int 可游戏结束时的分数四、系统实现(1)类图(2)核心代码:程序配置文件:用于设置数据库连接字串Login窗体:存储字段Login窗体:注册按钮事件如果查寻用户名不存在,提示用户注册新账号:Register窗体类:MySqlConn类:(需要通过配置文件,获得数据库连接字串,故需要引用命名空间:using System.Configuration;)封装的数据库连接示例:MainFrm 主游戏窗体类:存储字段:菜单事件:其他事件(时钟事件,和键盘事件)窗体键盘事件详细代码:其他功能函数:具体核心功能代码:字母飘动下落函数:创建字母函数:myRandom类获取字母函数:Program类:在static void Main()函数中创建互斥体变量,避免游戏多开五、总结经过一学期的C#学习,我对C#有了进一步的认识和掌握。

单片机实验报告_拼字程序

单片机实验报告_拼字程序

单片机实验报告_拼字程序
一、实验目的
本实验旨在掌握单片机的输入输出口的配置和使用,熟悉单片机界面及操作。

通过实现拼字游戏,提高学生对单片机程序设计的理解和应用能力。

二、实验器材
1. 套装板:STC89C52RC开发板 1块
2. USB线 1根
3. 1602液晶屏 1块
4. DAC芯片 1块
5. 电脑软件:Keil、STC-ISP
三、实验内容
1. 通过数码管显示当前选择的字母
2. 用按键进行可选字母上、下翻页
3. 用1602液晶显示出已拼接的单词
4. 实现音效,为已拼接的单词输出音效
四、实验原理
1.外设连接
(1)数码管连接到P2口,实现显示当前选中字母
(2)LCD连接到P0口,实现显示出已拼接的单词
2.程序流程
(1)初始化
包括数码管、LCD、按键和DAC的初始化
显示当前选中的字母,通过一个计数器进行控制
(3)按键扫描
进行按键扫描并作出响应
(4)捕捉拼字
如果按键被按下,则捕捉当前选中的字母并加入已拼接单词
(5)显示已拼接单词
(6)音效输出
当单词拼接完成后,进行音效输出
五、实验过程
1.确认电路连接无误,上电后数码管和1602液晶能正常显示
2.在Keil中编写程序,进行调试,确认程序逻辑无误,并可实现数码管和1602液晶的显示工作
3.将程序下载入开发板中,接上DAC音效芯片,进行测试
4.测试完成后,将程序重新上传至单片机,并将开发板与电源断开
六、实验结果
实现了拼字游戏程序,能够选定字母,并根据按键操作进行字母切换、单词拼接、单词显示和音效输出。

单片机小游戏实训报告

单片机小游戏实训报告

一、实训目的通过本次单片机小游戏实训,旨在掌握单片机的基本原理和编程方法,提高动手实践能力,锻炼团队合作精神。

本次实训以设计一款基于单片机的简单游戏为主,通过对硬件电路的搭建和软件编程的实现,完成游戏功能的开发。

二、实训内容1. 游戏选题与规则本次实训设计一款基于单片机的贪吃蛇游戏。

游戏规则如下:(1)玩家通过四个方向键控制蛇的移动,蛇在地图上吃豆子,吃掉豆子后蛇身相应加长,速度加快。

(2)蛇运动过程中,若撞到墙壁或蛇身,则游戏结束,并自动复位。

(3)游戏目标:在限定时间内,获取最高分数。

2. 硬件电路搭建(1)单片机:选用STC89C52单片机作为游戏的核心控制单元。

(2)显示屏:选用88点阵屏作为游戏画面的显示载体。

(3)按键:选用4个独立按键,分别控制蛇的上下左右移动。

(4)电源:选用5V直流电源为电路供电。

3. 软件编程(1)编程环境:使用Keil C51进行软件编程。

(2)编程语言:采用C语言进行编程。

(3)主要功能模块:a. 初始化模块:初始化单片机、显示屏、按键等硬件资源。

b. 游戏主循环模块:实现蛇的移动、豆子的生成、分数计算等功能。

c. 显示模块:将蛇、豆子、分数等信息显示在88点阵屏上。

d. 检测模块:检测按键状态,控制蛇的移动。

e. 结束模块:游戏结束后,自动复位并显示最终分数。

三、实训过程1. 设计阶段(1)分析游戏规则,确定游戏功能模块。

(2)选择合适的硬件设备,绘制电路原理图。

(3)编写软件需求规格说明书。

2. 搭建电路阶段(1)根据电路原理图,搭建硬件电路。

(2)连接单片机、显示屏、按键等硬件设备。

3. 编程阶段(1)在Keil C51环境中编写程序。

(2)编译、调试程序,确保程序正常运行。

4. 调试阶段(1)检查硬件电路连接是否正确。

(2)调试程序,优化游戏性能。

(3)测试游戏功能,确保游戏流畅、稳定。

四、实训成果1. 成功设计并实现了一款基于单片机的贪吃蛇游戏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:打字小游戏学号姓名专业班级指导教师院(系、所)电气与电子工程学院华中科技大学教务处制课程设计目的:(1)熟悉单片机的工作原理和应用方法,掌握单片机编程的一些技巧(2)利用单片机及键盘、LED和发光二极管设计具有竞争性、趣味性的游戏。

课程设计内容本次课程设计的内容是编写一个打字游戏,此游戏的想法来源于当初开始学习计算机时玩过的金山打字游戏,即随机显示一些字母,要在限定的时间内敲中键盘上对应的字母,通过练习可以快速熟悉键盘。

我所设计的这个打字游戏基本规则和金山打字游戏类似,在LED上随机出现一个数(0~F),并且这个数会以一定的速度从最左边的LED“跑”到最右边的LED并消失,必须在它消失之前敲中键盘上对应的数字,循环十次最后显示敲中的次数。

最后我还设计了可以控制字“跑”的速度,可供对键盘熟悉程度水平不同的人练习使用。

课程设计原理1)随机数的产生:因为T1在不断计数,可将TIMER1寄存器中数读出来并取后四位,即:LDB CX,TIMER1AND CX,#000FH2)在8位LED上“跑”动:即每隔一段时间由下一位LED显示这个随机数,在本程序中我是利用T1 产生中断,在中断程序中移位,即LED显示的位选码加一,而段选码不变,直至最后一位LED。

而且可以设置T1中断的次数来控制随机数“跑”动的速度,如设置T1中断两次才使LED移到下一位。

3)扫描键盘:在执行完一些初始化语句之后,程序便不停地扫描键盘,并判断输入键值是否等于所显示的数,若相等则计数器加一,本次循环结束并转下一次循环。

扫描程序借用我们做过的实验中用的RD_KB。

4)显示结果:先通过循环控制,若已循环十次则将计数器的结果显示出来,这里需要将十位和个为分别显示在两位LED上,可通过二进制到十进制转换,即CLR 36HDIVU 34H,#0AH原34H单元中存有计数器的值,除10之后十位在34H单元,个位在36H单元。

再分别将十位和个位作为段选码的偏移量,即可在LED上显示相应的数字。

程序流程图调试过程按照上述原理,我编写好了原始程序,经调试运行,出现了以下几个小问题:1)能够看到随机数从左边“跑”到右边,但是“跑”的过程中始终能看到最后一位一直在显示这个随机数,这在最初的设想中是没有的,也不应该出现的。

经过单步调试,我找到了问题所在:在显示的同时程序也在不停地扫描,每次扫描都会给PC口赋值#0AH或#09H,由于显示管的位选信号来自于共用的PC口,也就相当于选择了数码管的最后一位,所以每扫描一次就在最后一位显示数字。

解决办法:在扫描之前将片选信号清零,这样即使选择最后一位也不会显示数字,扫描之后再将原来的段选码和位选码赋给PA口和PC口。

修改后的代码如下:LDB DH,#00HSTB DH,P8255A ;使段选码为零,即不显示SCALL RD_KB ;调用键盘扫描程序STB EL,P8255C ;EL存有之前的位选码STB DL,P8255A ;DL存有之前的段选码2)因为我设计的程序在显示结果时也在扫描键盘,以实现按不同的键跳转到不同的功能,但这同样也带来一个问题,如果最后出现的随机数是0或者1(我定义的跳转键),因为按键肯定会有延时,本应该显示结果的,但程序认为已经按了跳转键,所以就会自动跳转另外的子程序去了。

解决办法:在LED显示一轮之后加一段较长的延时,再去扫描键盘。

3)为了控制随机数“跑动”的速度,利用T1中断次数产生不同的延时来实现。

但是怎么去实现在不同的子程序中,设置不同的中断次数,之前一直都没想清楚。

后来仔细回顾了课本,通过写不同的中断程序,然后在不同的子程序中分别把它们的地址赋给中断向量,即可实现最初的想法。

ORG 2200HINT_T1: ;T1中断两次才进入移位PUSHFDJNZ 40H,RETUNINC FX ;位加1……RETORG 2300HINT_T1_2: ;T1中断即进入移位PUSHFINC FX ;位加1……RET至此,这个小游戏的基本功能已经基本实现。

应本次课程设计的要求,还需嵌入显示学号的子程序,这个在单片机综合实验中已经做过,直接借过来用。

此外,我还设计了一个欢迎界面,即开始运行程序后在LED上显示“HELLO”五个字母,而且这五个字母不停地闪烁,左右移动,类似霓虹灯的效果。

然后按0键选择显示学号,按1键进入打字游戏1,按2键进入打字游戏2。

课程设计小结这次课程设计,应用我们在书本上所学的原理和方法,设计了一个简单的打字小游戏程序,圆满完成了本次课程设计的任务,在这个过程中,也对单片机的原理、工作方法、编程技巧有了更深一层的了解。

在调试的过程中遇到了各种各样的问题,通过自己对相关原理的深入思考以及与和同学之间的讨论,最终得以解决。

在做课程设计时,我在图书馆以及网络上搜索,希望能找到相关的资料参考。

然而关于96单片机的实在太少,大多都是51单片机,不得不承认96单片机正在逐渐退出历史舞台这一趋势。

但是,我认为这并不影响我们做这次课程设计。

不管是96还是51,其基本原理是相通的,只是载体不同而已,而且通过做课程设计,将所学的理论知识应用到实践中去,提升我们发现问题并解决问题的能力,这才是课程设计的意义所在。

程序清单;--------------------单片机课程设计---打字小游戏---(陆云U200812036)---------------- ;---------------------------------------------------------------------------------------------------------------C8255 EQU 0C006H ;8255命令口地址P8255A EQU 0C000H ;8255 PA口地址P8255B EQU 0C002H ;8255 PB口地址P8255C EQU 0C004H ;8255 PC口地址;--------------------------------------------------------------------------------------------------------------AX EQU 1CHAL EQU 1CHAH EQU 1DHBX EQU 1EHBL EQU 1EHBH EQU 1FHCX EQU 20HCL EQU 20HCH EQU 21HDX EQU 22HDL EQU 22HDH EQU 23HEL EQU 24HEX EQU 24HFX EQU 28H;---------------------------------------------------------------------------------------------------------ORG 2080HLD SP,#0FCH ;设置堆栈指针LDB AL,#82H ;置8255工作方式,PB口输入,PA,PC口输出STB AL,C8255[0]CLR EX;-----------------------------------显示欢迎界面“HELLO”子程序-------------------------------L1: SCALL HELLOJBC AL,4,XUEHAOINC EXCMP EX,#04HJNE L1L2: DEC EXSCALL HELLOJBC AL,4,XUEHAOCMP EX,#00HJNE L2SJMP L1HELLO:CLR CXCLR FXADD CX,EXLOOP1_2:LDB BL,WEI[CX] ;置LED位码至C口STB BL,P8255CLDB BL,DUAN2[FX] ;置字形段码至A口STB BL,P8255ASCALL DELAY2INC CXINC FX ;偏移量加1,指向下一位LEDCMP FX,#05H ;判断是否已显示最后一位JNE LOOP1_2SCALL RD_KBRET;---------------------------------------显示学号子程序--------------------------------------------- XUEHAO:CLR AX ;偏移量清零LOOP1:LDB BL,WEI[AX] ;置LED位码至C口STB BL,P8255CLDB BL,DUAN[AX] ;置字形段码至A口STB BL,P8255ASCALL DELAYINC AX ;偏移量加1,指向下一位LEDCMP AX,#08H ;判断是否已显示最后一位JNE LOOP1SCALL RD_KB ;调用键盘扫描程序JBS AL,4,XUEHAO ;若无键盘输入,继续循环显示SJMP BIJIAO ;有输入,转判断输入的键值;-----------------------------------判断键值并跳转----------------------------------------------- BIJIAO: ;判断输入的键值CMP AX,#01HJE P1CMP AX,#02HJE P2SJMP XUEHAO;-----------------------------------------打字游戏1------------------------------------------------- P1:LDB INT_MASK,#01HLDB IOC1,#04HLD AX,#2200HST AX,2000H[0]CLRB INT_PENDINGCLRB 30H ;循环次数清零CLRB 34H ;打对次数清零LDB 40H,#02HSJMP LP1;-------------------------------------打字游戏2(升级版)------------------------------------ P2:LDB INT_MASK,#01HLDB IOC1,#04HLD AX,#2300HST AX,2000H[0]CLRB INT_PENDINGCLRB 30H ;循环次数清零CLRB 34H ;打对次数清零SJMP LP1LP1:CMPB 30H,#0AHJE RUSULTEICLR FXLDB EL,WEI[FX] ;置初始位STB EL,P8255C ;置LED位码至C口LDB CX,TIMER1AND CX,#000FH ;产生随机数LDB DL,DATA[CX] ;置字形段码至A口STB DL,P8255ALP1_1:CMPB FX,#08HJE LP1LDB DH,#00HSTB DH,P8255A ;使段选码为零,即不显示SCALL RD_KB ;调用键盘扫描程序STB EL,P8255CSTB DL,P8255AJBS AL,4,LP1_1 ;若无输入,继续扫描CMPB AL,CL ;比较输入值与显示的值JNE LP1_1DIINCB 34H ;打对次数加1LDB DH,#18H ;熄灭LEDSTB DH,P8255CINCB 30H ;循环次数加1SCALL DELAYSJMP LP1;------------------------------------------------显示结果-------------------------------------------- RUSULT:CLR 36HDIVU 34H,#0AHDISPLAY:LDB BL,#28H ;显示十位STB BL,P8255CLDB BL,DATA[34H]STB BL,P8255ASCALL DELAYLDB BL,#08H ;显示个位STB BL,P8255CLDB BL,DATA[36H]STB BL,P8255ASCALL DELAYSCALL DELAYSCALL RD_KB ;调用键盘扫描程序JBS AL,4,DISPLAYCMPB AL,#00HJE NEXT0CMPB AL,#01HJE NEXT1CMPB AL,#02HJE NEXT2SJMP DISPLAYNEXT0: SJMP XUEHAONEXT1: SJMP P1NEXT2: SJMP P2;--------------------------------------------T1中断程序-------------------------------------- ORG 2200HINT_T1: ;T1中断两次才进入移位PUSHFDJNZ 40H,RETUNINC FX ;位加1CMPB FX,#08H ;是否已到最后一位JE NEXTLDB EL,WEI[FX] ;置LED位码至C口STB EL,P8255CLDB 40H,#02HSJMP RETUNNEXT:DILDB EL,#18H ;熄灭LEDINCB 30H ;循环次数加1 RETUN:POPFRETORG 2300HINT_T1_2: ;T1中断即进入移位PUSHFINC FX ;位加1CMPB FX,#08HJE NEXT_2LDB EL,WEI[FX] ;置LED位码至C口STB EL,P8255CSJMP RETUN_2NEXT_2:DILDB EL,#18H ;熄灭LEDSTB EL,P8255CINCB 30H ;循环次数加1 RETUN_2:POPFRET;-------------------------------------------延时子程序-------------------------------------------- DELAY: LD DX,#0300HDELAY1: DEC DXJNE DELAY1RETDELAY2: LD DX,#01500HDELAY2_1: DEC DXJNE DELAY2_1RET;--------------------------------------------扫描键盘程序--------------------------------------- RD_KB:LDB BL,#0AH ;键盘扫描第一行STB BL,P8255C[0]SKIPSKIPLDB AL,P8255B[0] ;读键值XORB AL,#0FFHJNE KEYVAL ;判键是否按下LDB BL,#09H ;扫描第二行STB BL,P8255C[0]SKIPSKIPLDB AL,P8255B[0]XORB AL,#0FFHJE NONKEYKEYVAL: ;计算键码ANDB BL,#01HSHL BL,#03HLDB AH,ALLDB AL,#0FFHSHIFT: INCB ALSHRB AH,#01HJNC SHIFTORB AL,BLLJMP KBEXITNONKEY: LD AL,#10HKBEXIT: RET;--------------------------------------数据区-------------------------------------------------------- WEI: DB 0E8H,0C8H,0A8H,88H,68H,48H,28H,08HDUAN: DB 3FH,3FH,7FH,06H,5BH,3FH,4FH,7DH ;0,0,8,1,2,0,3,6 DATA: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,F DUAN2:DB 76H,79H,38H,38H,3FH ;H,E,E,L,O;--------------------------------------------------------------------------------------------------------- END。

相关文档
最新文档