单片机课程设计代码

合集下载

单片机(汇编语言)秒表课程设计设计

单片机(汇编语言)秒表课程设计设计

题目名称:秒表电路设计姓名:班级:学号:指导教师:日期:2016年7月13日《单片机原理及接口技术课程设计》教学大纲课程代码:课程名称:单片机原理及接口技术课程设计周数: 2 学分:1.0学分一、课程设计的性质、任务与目的单片机原理及接口技术课程设计是在学生学习完理论课和实验课的基础上开设的,通过完成一个涉及MCS-51或其他系列单片机多种资源应用并具有综合功能的设计与编程应用,使学生能够将课堂上学到的理论知识与实际应用结合起来,同时在软件编程、仿真调试及相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的设计开发工作打下一定的基础。

本课程设计的主要目的如下:1、增进对单片机的感性认识,加深对单片机理论知识的理解,掌握单片机内部功能模块(如定时/计数器、中断、片内外存贮器、I/O口、串行口等)的应用;2、掌握单片机应用系统的软硬件设计过程及实现方法,为以后设计和实现单片机应用系统打下良好基础;3、提高综合应用所学理论知识独立分析和解决实际问题的能力。

二、本课程设计的基本理论本课程设计的基本理论是单片机原理及接口技术的基本理论,主要包括单片机的硬件结构原理、指令系统、汇编语言、中断系统、定时/计数器、串行接口、I/O接口等。

在学习掌握单片机原理及接口技术课程的前提下,利用实验室提供的单片机实验条件或基于仿真软件,采用汇编语言或C51编程,设计实现一个具体的单片机应用系统项目,熟悉单片机系统设计开发的完整过程。

三、课程设计的方式与基本要求课程设计的方式:每个班级学生按2~3人分为一组,以组为单位进行课程设计(也可一人独立进行),课程设计的题目从教师给定的题目中选取,也可以是指导教师审核通过的学生自选题目。

基本要求:每组选定题目后,按题目要求,首先进行方案论证,通过查阅资料、集体讨论,确定设计方案;然后进行具体的硬件和软件设计;完成设计后,进行硬件/软件调试;最后撰写课程设计报告。

单片机c语言课程设计

单片机c语言课程设计

单片机c语言课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理和结构,理解C语言在单片机编程中的应用。

2. 培养学生运用C语言进行单片机程序设计和调试的能力。

3. 使学生了解单片机外围设备的接口技术,并能结合实际需求进行简单系统设计。

技能目标:1. 培养学生运用Keil等开发工具进行单片机C语言编程,完成程序设计、编译、下载和调试。

2. 培养学生分析问题和解决问题的能力,能够针对实际应用场景设计单片机控制系统。

3. 提高学生的动手实践能力,通过课程设计,独立完成一个具有实际应用价值的单片机控制系统。

情感态度价值观目标:1. 培养学生积极的学习态度,激发对单片机及嵌入式系统开发的兴趣。

2. 培养学生的团队合作意识,学会在项目中进行有效沟通和协作。

3. 增强学生的创新意识,鼓励他们在课程设计中勇于尝试新思路、新技术。

课程性质分析:本课程为单片机C语言课程设计,侧重于实践操作和实际应用,旨在帮助学生将所学理论知识与实际工程相结合,提高解决实际问题的能力。

学生特点分析:学生已具备一定的单片机原理和C语言基础,具有一定的编程和动手能力。

在此基础上,通过课程设计,提高学生的综合应用能力和创新能力。

教学要求:1. 结合课本内容,注重理论与实践相结合,强化学生的动手实践能力。

2. 以项目为导向,引导学生主动探索,培养学生的问题分析和解决能力。

3. 注重团队合作,培养学生的沟通能力和协作精神。

4. 关注学生的个体差异,实施差异化教学,提高全体学生的学习效果。

二、教学内容1. 单片机基础理论:回顾51单片机的结构、原理及其外围设备的工作原理,重点复习I/O口编程、定时器、中断系统等内容。

教材章节:第一章至第三章2. C语言编程基础:巩固C语言基本语法,包括数据类型、运算符、控制语句、函数等,结合单片机编程需求进行讲解。

教材章节:第四章至第六章3. 单片机C语言编程实践:学习使用Keil开发工具进行单片机C语言编程,掌握程序设计、编译、下载和调试的全过程。

单片机课程设计超声波测距设计代码注释

单片机课程设计超声波测距设计代码注释

尊敬的读者:感谢您对本篇文章的关注和阅读。

在本篇文章中,我将为您介绍单片机课程设计中超声波测距设计代码的注释。

希望这些注释能够帮助您更好地理解超声波测距的原理和代码实现。

注释一:引入头文件```c#include <reg52.h>#include <intrins.h>```这里引入了reg52.h和intrins.h两个头文件,reg52.h是51单片机的特殊寄存器及位字段定义,intrins.h包含了一系列嵌入汇编的内置函数,用于单片机的延时等操作。

注释二:定义IO口```csbit Trig = P1^0;sbit Echo = P1^1;```Trig表示超声波发射端的控制引脚,Echo表示超声波接收端的输入引脚。

注释三:延时函数定义```cvoid DelayUs2x(unsigned char t){while (--t);}void DelayMs(unsigned char t){while(t--){DelayUs2x(245);DelayUs2x(245);}}```这里定义了微秒级和毫秒级的延时函数,用于超声波测距模块的操作时序控制。

注释四:超声波测距函数```cunsigned int distance() {unsigned int long ms; Trig = 0;_nop_();_nop_();Trig = 1;DelayUs2x(10);Trig = 0;while(!Echo);ms = 0;while(Echo){DelayUs2x(1);ms++;if(ms > 5000)return 0;}return ms;}```这段代码是超声波测距的核心算法,首先通过Trig引脚发送一个10us的高电平脉冲,然后在Echo引脚接收超声波回波,并计算回波的时间,最后将时间转换成距离值返回。

注释五:主函数```cvoid m本人n(){unsigned int dis;while(1){dis = distance();if(dis){dis = dis * 1.7 / 58;}DelayMs(500);}}```在主函数中,不断调用distance函数获取距离值,然后根据超声波的传播速度将时间转换成距离,并进行延时500ms后再次进行测距。

单片机课程教案

单片机课程教案

单片机课程教案一、课程概述单片机原理及应用是一门涉及微处理器、数字电路和计算机接口技术的综合性课程。

本课程的目标是使学生掌握单片机的原理和应用,了解单片机在嵌入式系统设计中的地位和作用,为学生进一步深入学习和应用单片机打下坚实的基础。

二、课程目标1、理解单片机的内部结构和工作原理。

2、掌握单片机的基本操作和编程方法。

3、熟悉单片机在嵌入式系统中的应用和设计方法。

4、培养学生的创新能力和实践操作能力。

三、课程内容第一章:单片机概述1、1单片机的基本概念及发展历程2、2单片机的特点和应用领域3、3单片机的主要产品和发展趋势第二章:单片机的基本结构和工作原理2、1单片机的内部结构和主要部件功能介绍21、2单片机的引脚和信号说明211、3单片机的存储器和寄存器介绍2111、4单片机的时钟系统和定时器/计数器介绍第三章:单片机的编程语言和开发环境3、1单片机的编程语言概述和特点31、2 C语言在单片机编程中的应用311、3 Keil C51开发环境和程序设计流程介绍3111、4程序调试和下载方法说明第四章:单片机的应用实例和实验指导4、1单片机在LED闪烁和流水灯控制中的应用实例41、2单片机在按键输入和数码管显示中的应用实例411、3单片机在A/D和D/A转换中的应用实例4111、4单片机在电机控制和红外线遥控中的应用实例本文5单片机的实验指导和实验报告要求说明第五章:单片机的发展趋势和应用领域的扩展本文1单片机在物联网和智能家居中的应用扩展本文2单片机在汽车电子和医疗设备中的应用扩展本文3单片机在工业控制和智能制造中的应用扩展本文4单片机在人工智能和机器人技术中的应用扩展第六章:课程总结和答疑解惑本文1课程总结和学习方法分享本文2答疑解惑和常见问题解答1、3学生自我评估和改进建议收集四、教学方法与手段本课程采用理论教学和实践操作相结合的方法,以案例分析和程序示范为主要手段,通过课堂讲解、小组讨论、实验指导等多种形式,使学生更好地理解和掌握单片机的原理和应用。

单片机课程设计密码锁程序和仿真图

单片机课程设计密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。

给单片机课程设计1

给单片机课程设计1

电子信息系课程设计方案
一.课程设计名称:单片机课程设计
二.课程编号:031421
三.课程性质:(实践教学)必修课
四.开课专业:电子信息科学与技术、通信工程、自动化、微电子五.开课班级:11级1-14班
六.学生人数:411人
七.课程总学时数:80学时(2周)
八.开课学期:2013-2014学年第1学期
九.开课具体时间:
1.第1轮:1-8班,第12周-第14周周六、周日1-11节,15周周六
1-11节,1-4班15周周二9-11节,9-12班15周周一9-11节。

2.第2轮:9-14班,第15周周日1-11节,第16、17周周一、二、
三、五9-11节,周六、周日1-11节。

开课地点:
第1轮
1. 实验楼321(上机)、425(焊接),1、2班。

2. 实验楼329(上机)、328(焊接),3、4班。

3. 实验楼330(上机)、331(焊接),5、6班。

4. 实验楼429(上机)、426(焊接),7、8班。

第2轮
1. 实验楼429(上机)、426(焊接),9、10班。

2.实验楼329(上机)、328(焊接),11、12班。

3. 实验楼330(上机)、331(焊接),13、14班。

十.指导教师名单
第1轮
第2轮
十一. 排课课表
(说明:排课课表应按照以下示例列出参与课程设计的每位老师的具体授课时间和地点。

请大家注意:课程设计的排课不允许与该老师所带的其他理论课及实验课的课程时间冲突)
(下列时间请各位课程设计负责人及指导教师签字确认)
课程设计负责人:
系内审核:
日期:年月日。

单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码

单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码

单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。

功能要求:a)计时并显示(LED)。

由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。

b)时间调整功能。

利用4个独立按钮,实现时钟调整功能。

这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。

c)定闹功能。

利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。

d)秒表功能。

最小时间单位0.01秒。

二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。

a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。

b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。

注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。

S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。

电路采用两个滤波电容,给板子一个更加稳定的工作电源。

LED为电源的指示灯,通电后LED灯亮。

2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。

有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。

如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。

低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。

电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。

数码管的阴级由P0口经过电阻限流连接。

例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。

PIC单片机课程设计 - 三位倒计时器(含全部汇编程序清单)

PIC单片机课程设计 - 三位倒计时器(含全部汇编程序清单)

课程设计报告课程名称:单片机原理与接口技术课程设计设计题目:三位倒计时器院系:机电工程学院班级:2012级电气工程及其自动化专业姓名:XXX学号:2012XXXX指导教师:XXXX设计时间:2014年X月X日出勤实物报告总分目录前言 (1)第一章设计方案 (1)1.1 设计内容及要求 (1)1.1.1 设计内容 (1)1.1.2设计要求 (1)1.1.3功能设计 (2)1.2硬件设计 (2)1.2.1 矩阵键盘电路设计 (2)1.2.2数码管电路设计 (3)1.2.3 LED及蜂鸣器电路设计 (4)1.2.4单片机主电路设计 (4)1.2.5上电电路的设计 (5)1.2.6总电路图 (5)1.3总体方案 (6)第二章软件设计 (7)2.1 倒计时部分 (7)2.1.1 键盘扫描子程序 (8)2.1.2 0到9按键功能子程序和键盘显示子程序 (9)2.1.3 一位转多位十进制子程序 (12)2.1.4 TMR0中断服务子程序 (13)2.1.5 倒计时显示子程序 (15)2.2 附加功能部分 (15)2.2.1 暂停和继续 (16)2.2.2 计数功能 (17)2.2.3 复位和归零 (17)2.3 结束提示部分 (18)2.4 程序部分总结 (18)第三章实物照片 (19)3.1 实验板照片 (19)3.2 脱机运行照片 (19)第四章问题与体会 (21)结论 (22)参考文献 (23)附录:程序清单 (24)前言此次课程设计的内容为三位数的倒计时器的设计。

目前倒计时器的发展已经相当先进,我做这次设计的主要目的是想更进一步了解基本电路的设计流程,以提高自己的设计理念,使自己的动手动脑能力有更进一步提高。

通过解决现实生活中的问题,巩固和加深单片机课程中所学的理论知识和实验能力,加深对单片机软硬件知识的理解,以获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。

本次设计注重对单片机工作原理以及键盘控制及显示原理的理解,能够提高自己的动手能力和设计能力,以培养自己的创新能力,做到理论和实践相结合。

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

陈新 2014/7/21 17:32:03QQ可以找到历史记录的陈新 17:33:15无痕的回忆 17:01:52LED_LOOP: MOV R1, #251 ;1s的显示延时(好奇怪,居然不准)LED_LOOP_1: MOV R4, #14 ;使用了寄存器R1,R4(估计可以使用堆栈临时释放)LED_LOOP_2: LCALL DISPLAY_MOVEDJNZ R4, LED_LOOP_2DJNZ R1, LED_LOOP_1RET无痕的回忆 23:10:36ORG 0000HAJMP MAINORG 0030HHC595_SCK BIT P0.4HC595_RCK BIT P0.5HC595_RST BIT P0.6HC595_DAT BIT P0.7MAIN: MOV A, #00HMOV P0, ACLR HC595_RSTLOOP0: MOV R0, #0LOOP1: MOV R1, #100LOOP2: MOV R4, #10LOOP3: LCALL DISPLAYDJNZ R4, LOOP3DJNZ R1, LOOP2INC R0LJMP LOOP1DELEY0: MOV R6, #4 ;1ms延时的子程序DELEY1: MOV R7, #123DELEY2: DJNZ R7, DELEY2DJNZ R6, DELEY1NOPRETDISPLAY: MOV A, R0 MOV B, #100DIV ABMOV B, #10DIV AB;MOV A, #0LCALL SHOW_NUM MOV A, P0ANL A, #0F0HORL A, #1MOV P0, A ;延时LCALL DELEY0 ;延时LCALL DELEY0MOV A, R0 ;有问题MOV B, #100DIV AB;MOV A, #7LCALL SHOW_NUM MOV A, P0ANL A, #0F0HORL A, #2MOV P0, A ;延时LCALL DELEY0 ;延时LCALL DELEY0MOV A, R0MOV B, #100DIV ABXCH A, BMOV B, #10DIV AB;MOV A, #7LCALL SHOW_NUM MOV A, P0ANL A, #0F0HORL A, #4MOV P0, ALCALL DELEY0 ;延时LCALL DELEY0 ;延时MOV A, R0MOV B, #10DIV AB;MOV A, #7LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #8MOV P0, ALCALL DELEY0 ;延时LCALL DELEY0RETSHOW_NUM: MOV DPTR, #SEGMOVC A, @A+DPTRLCALL SEND_BYTERETSEND_BYTE: MOV R2, #8 ;注意这个循环次数控制,有误差则会影响数码管显示MOV R6, #01HSEND_LOOP: MOV R3, AANL A, R6JZ ZEROJNZ NZEROZERO: CLR HC595_DATAJMP NEXTNZERO: SETB HC595_DATNEXT: SETB HC595_SCKCLR HC595_SCKMOV A, R6RL AMOV R6, AMOV A, R3DJNZ R2, SEND_LOOPCLR HC595_RCKSETB HC595_RCKRETSEG: DB 0FCHDB 60HDB 0DAHDB 0F2HDB 66HDB 0BEHDB 0E0HDB 0FEHDB 0F6HEND无痕的回忆 23:10:04int8u tab_abc[] = {0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e};罐头 17:36:46还有那个循环的呢陈新 18:18:36已经发给你了啊DISPLAY: MOV A, KEY ;将KEY转移给ALCALL SHOW_NUMMOV P0, #0FFH ;打开所有的数码管即设置为静态显示MOV P0, ALCALL DELAY_1MS ;延时注意到在动态显示中,点亮每位数码管都需要2秒钟LCALL DELAY_1MS ;延时。

LCALL DELAY_1MS ;延时。

RETDISPLAY: MOV A,KEYMOV B, #100DIV ABMOV B, #10DIV AB;MOV A, #0LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #1MOV P0, A ;延时LCALL DELAY_1MS ;延时LCALL DELAY_1MSMOV A, KEY ;有问题MOV B, #100DIV AB;MOV A, #7LCALL SHOW_NUMANL A, #0F0HORL A, #2MOV P0, A ;延时LCALL DELAY_1MS ;延时LCALL DELAY_1MSMOV A, KEYMOV B, #100DIV ABXCH A, BMOV B, #10DIV AB;MOV A, #7LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #4MOV P0, ALCALL DELAY_1MS;延时LCALL DELAY_1MS;延时MOV A, KEYMOV B, #10DIV ABXCH A, B;MOV A, #7LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #8MOV P0, ALCALL DELAY_1MS ;延时LCALL DELAY_1MSRETDISPLAY: MOV A, KEY ;将KEY转移给ALCALL SHOW_NUMMOV A, P0 ;打开所有的数码管即设置为静态显示ANL A,#0F0H;ORL A, #15;MOV P0, ALCALL DELAY_1MS ;延时注意到在动态显示中,点亮每位数码管都需要2秒钟LCALL DELAY_1MS ;延时。

RETDISPLAY: MOV A, KEY ;将KEY转移给A; LCALL SHOW_NUMMOV DPTR, #SEGMOVC A, @A+DPTRMOV P0, ALCALL DELAY_1MS ;延时注意到在动态显示中,点亮每位数码管都需要2秒钟LCALL DELAY_1MS ;延时。

RETSEG: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH7.26课程设计最终版代码;---------------------------------------------------------------------;---------------------------------------------------------------------;************华南理工大学电子与信息学院信息工程2班**************;************ ************** ;************ 第二组************** ;************ ************** ;************ 高文冠刘翠玲王志健**************;************ ************** ;************ 单片机课程设计**************;---------------------------------------------------------------------;---------------------------------------------------------------------; --------------------------------------------------------------------;分配各地址;---------------------------------------------------------------------KEY EQU 40HAJMP STARTORG 0003H ; 入口地址AJMP JINT0 ;外部中断0入口ORG 0013H ;AJMP JINT1 ; 外部中断1入口地址ORG 0030H ;; --------------------------------------------------------------------;定义这个实验中所需要的管脚,其中HCHC595是八位移位寄存器,BEEP是蜂鸣器;---------------------------------------------------------------------HC595_SCK BIT P0.4HC595_RCK BIT P0.5HC595_RST BIT P0.6HC595_DAT BIT P0.7BEEP BIT P1.3 ;定义蜂鸣器的管脚; --------------------------------------------------------------------;程序以及初始化硬件代码,主要是对中断以及一些端口进行初始化;---------------------------------------------------------------------START: MOV A,#00H ;先将数码管的所有段均置0,即都不选; SETB BEEP ;关闭蜂鸣器MOV P0, ACLR HC595_RSTMOV SP,#60H ;堆栈地址为60HSETB EA ;允许全局中断SETB EX0 ; 允许外部中断0SETB EX1 ; 允许外部中断1SETB PX1 ;设外部中断1为高优先级SETB IT1 ; 设外部中断1边沿触发CLR IT0 ; 设外部中断0低电平触发; --------------------------------------------------------------------;判断是否按键按下,并且赋予键值的键盘扫描代码;---------------------------------------------------------------------GWG0: NOPMOV P2,#0FFH ; 判第0行是否有键按下CLR P2.0 ; 将P2.0清零MOV A,P2ANL A,#0F0H ; 屏蔽低4位,即消除行线的影响XRL A,#0F0HJZ NOKEY0 ;A为0,转向NOKEY0LCALL DELAY_10MS ; 延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NOKEY0 ; A为0,转向NOKEY0,表示第一行没有按键按下MOV A,P2 ; 判哪一个键按下ANL A,#0F0HCJNE A,#0E0H,NEXT1MOV KEY,#0 ; 按下的键值是0LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ;继续检测NEXT1: CJNE A,#0D0H,NEXT2MOV KEY,#1 ; 按下的键值是1LCALL DISPLAYLJMP GWG0 ;继续检测NEXT2: CJNE A,#0B0H,NEXT3MOV KEY,#2 ; 按下的键值是2LCALL DISPLAYLJMP GWG0 ;继续检测NEXT3: CJNE A,#70H,NOKEY0MOV KEY,#3 ;按下的键值是3LCALL DISPLAYLJMP GWG0 ;继续检测NOKEY0: MOV P2,#0FFH ; 判第1行是否有键按下CLR P2.1 ; 将P2.1清零MOV A,P2ANL A,#0F0H ;屏蔽低4位,即行线的影响XRL A,#0F0HJZ NOKEY1 ;A为0,转向NOKEY1LCALL DELAY_10MS ;延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NOKEY1 ;A为0,转向NOKEY1MOV A,P2 ;判断哪个按键按下ANL A,#0F0HCJNE A,#0E0H,NEXT5MOV KEY,#4 ;按下的键值是4LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ; 继续检测NEXT5: CJNE A,#0D0H,NEXT6MOV KEY,#5 ; 按下的键值是5LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT6: CJNE A,#0B0H,NEXT7MOV KEY,#6 ;按下的键值是6LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT7: CJNE A,#70H,NOKEY1MOV KEY,#7 ;按下的键值是7LCALL DISPLAYLJMP GWG0 ; 继续检测NOKEY1: MOV P2,#0FFH ;判第2行是否有键按下CLR P2.2 ;将P2.2清零MOV A,P2ANL A,#0F0H ;屏蔽掉低四位,即消除行线的影响XRL A,#0F0HJZ NOKEY2 ;A为0,转向NOKEY2LCALL DELAY_10MS ;延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NOKEY2 ;A为0,转向NOKEY2MOV A,P2 ;判哪一个键按下ANL A,#0F0HCJNE A,#0E0H,NEXT9MOV KEY,#8 ;按下的键是8LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ;继续检测NEXT9: CJNE A,#0D0H,NEXT10MOV KEY,#9 ;按下的键值是9LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT10: CJNE A,#0B0H,NEXT11MOV KEY,#10 ;按下的键值是10LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT11: CJNE A,#70H,NOKEY2MOV KEY,#11 ;按下的键值是11LCALL DISPLAYLJMP GWG0 ; 继续检测NOKEY2: MOV P2,#0FFH ;判第2行是否有键按下CLR P2.3 ;将P2.3清零MOV A,#P2ANL A,#0F0H ; 屏蔽高4位XRL A,#0F0HJZ NEXT16 ; A为0,转向NEXT16LCALL DELAY_10MS ; 延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NEXT16 ;A为0,转向NEXT16MOV A,P2 ;判哪一个键按下ANL A,#0F0HCJNE A,#0E0H,NEXT13MOV KEY,#12 ;按下的键值是12LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ;继续检测NEXT13: CJNE A,#0D0H,NEXT14MOV KEY,#13 ;按下的键值是13LCALL DISPLAYLJMP GWG0 ;继续检测NEXT14: CJNE A,#0B0H,NEXT15MOV KEY,#14 ;按下的键值是14LCALL DISPLAYLJMP GWG0 ;继续检测NEXT15: CJNE A,#70H,NEXT16MOV KEY,#15 ;按下的键值是15LCALL DISPLAYLJMP GWG0 ;继续检测NEXT16:LJMP GWG0; --------------------------------------------------------------------;外部中断0服务程序,即实现功能3闪烁显示ERR-和拓展功能蜂鸣器播放音乐; --------------------------------------------------------------------JINT0: NOPLCALL SMG_ERROR_1s ;显示ERR-LCALL DELAY_1S ;延时MOV A,#00H ;熄灭所有数码管,达到闪烁的效果MOV P0, ALCALL DELAY_1S ;延时LCALL SMG_ERROR_1s ;第二次显示ERR-LCALL DELAY_1S ;延时1sMOV P0,#00H ;再次熄灭所有数码管LCALL DELAY_1S ;延时1sLCALL SMG_ERROR_1s ;第三次显示ERR-LCALL DELAY_1S ;延时1sMOV P0,#00H ;对P0端口和R4寄存器进行清0MOV R4,#0RETI; --------------------------------------------------------------------; 外部中断1服务程序,即实现功能4,跑马灯; --------------------------------------------------------------------JINT1: MOV R1,#10 ;控制跑马灯的次数为10次JJHH: MOV P0,#0FFH ;将LED全部置1,MOV A,#0FEH ;点亮第一个LEDMOV R4,#8 ;控制左移次数为8次,即依次点亮8个LEDLOOP_PMD:MOV P0, ALCALL DELAY_1S ;在动态显示中,点亮每位数码管都需要2MSRL A ;对A左移进行左移,实现流水灯的效果DJNZ R4,LOOP_PMD;R4不为0,则对A继续进行左移,直到所有的LED都被点亮为止DJNZ R1,JJHH ;R1不为0,则继续进行跑马灯显示,总共10次LCALL DELAY_1SLCALL DELAY_1SRETI; --------------------------------------------------------------------;根据按键在数码管上和LED上显示键值,即实现功能一、二; --------------------------------------------------------------------DISPLAY:LCALL DISPLAY_SMG ;转向显示程序LCALL DISPLAY_LED ;转向显示程序MOV P0, #00H ;将数码管的所有位均置0,即都不选CLR HC595_RSTRET; --------------------------------------------------------------------;根据按键在数码管上显示键值,采用动态显示的方式; --------------------------------------------------------------------DISPLAY_SMG: MOV R1,#8DISPLAY_SMG_1:MOV R4,#255 ;使用了寄存器R4DISPLAY_SMG_2:MOV A, KEY ;将KEY转移给ALCALL SHOW_NUM_SMGMOV A,P0 ;打开所有的数码管即静态显示模式ANL A,#0F0H;ORL A,#8MOV P0,ALCALL DELAY_1MS ;在动态显示中,点亮每位数码管都需要2MSLCALL DELAY_1MS ;延时。

相关文档
最新文档