- A+
单片机程序设计范文第1篇
1 鼠标信号发送协议与过程
鼠标是一个功能高度集中的小型机电一体化系统。它首先将直线移转换成角度位移,再转变成数字量,然后与按钮状态统一编码,通过RS-232串口发出。鼠标工作所需功率从RS-232串行接口的控制线上窃取(PS/2、USB接口鼠标除外)。当鼠标被拖动超过一个最小距离或某一按钮被按下时,它按照规定的协议将移动距离和按钮状态通过一次或几次信息发送到机;主机上的鼠标驱动程序将信息变换成鼠标位置和按钮状态供其它程序模块调用。每发生一次移动或按钮状态变化,鼠标向上发送一次信息。通常一般鼠标的分辨率为400DPI。理论上即沿着某一方向每拖动一英寸(一般速度),会产生400次信息发送过程。,如果拖动较快,则信息发送次数送减少,但所反映的总的移动距离仍然是400步。
各种串行接口鼠标在物理层普遍采用标准的串行通信协议,波特率为1200bps。帧格式为7个数据位、2个停止位,无奇偶校验位。上层协议则在此基础上以十六进制数形式直接发更新鼠标信息,包括:初始化报告:移动方向、距离、按钮状态。其一般形式如表1所示。
表1 鼠标信息发送格式
序 号名 称字串形式长 度意 义说 明1初始化报告4DH('M')1字节声明初始化结束加电时发送一次2移动、按钮P1、P2、P33字节反映按钮状态、移动方向和距离移动或按钮操作时发送
上述P1、P2、P3三个参数说明:
P1_D7D6固定值01;D1D0=11本次鼠标移动包含左右移动分量;D3D2=11本次鼠标移动包含上下移动分量;D4=1目前鼠标右键呈按下状态;D5=1目前鼠标左键呈按下状态(D4D5=00则键呈释放状态)。
P2_D7D6固定值00;其余六位表示一个有符号二进制数,反映左右移动量,大于0为向右移动,小于0为向左移动。
P3_D7D6固定值00;其余六位表示一个有符号二进制数,反映上下移动量,大于0为向下移动,小于0为向上移动。
例如:[6CH 02H 3AH](P1=6CH,P2=02H,P3=3AH)反馈出鼠标向右移动了2个单位,向上移动了6个单位,目前左键按下。
2 鼠标接口程序设计
80C196系列单片机内设RS-232收发器,但需要配置接口芯片实现电平转换。考虑到鼠标从串口窃取功率,接口芯片必须具有一定的驱动能力,而不能要用简单的准RS-232电平转换器。这里采用MAX232E作为接口芯片。
图1中左侧为80C196单片机,P2.0(TXD)、P2.1(RXD)通过MAX232E形成满足鼠标要求的串行接口,包括生成标准RS-232C电平和提供电源供应。图1中最右边为9针或24针标准串行接插件。由于鼠标的电源供应采用功率窃取方案,由DTR/RTS提供,这里为DTR加限流电阻防止对鼠标造成伤害。RTS由MAX232E垢信号发送端提供,通过80C196的P2.0控制MAX232E的10脚(对应的输出脚为7脚)电平高低以改变7脚电位,使鼠标可以接收来自RTS的控制命令,以实现鼠标安装与否的检测。MAX232E的11脚(对应的输入脚为14脚)设备高电平以保证14脚电位为负RS-232电位,满足鼠标发送信号时的电平要求。
从链路层看,80C196串行接口的四种工作方式均不满足鼠标的帧格式要求;但其工作方式1(1位起始位、8位数据位、1位停止位)的总传送位数与鼠标(1位起始位、7个数据位、2个停止位)相同,均为10位。接收过程中80C196收到7个数据位后,将2个停止位中的第一个作为数据位装入接收缓冲器的最高位,由于停止位在物理层是高电平,作为数据被接收后相当于逻辑“0”;剩下的第二个停止位给好为80C196提供了有效的停止位。利用80C196的工作方式1完全可以保证正确接收鼠标信息。
单片机起动后,通过鼠标驱动模块对鼠标进行初始化,即通过P2.0使RTS电平翻转一次而令鼠标发送初始化报告,以确认鼠标是否安装。之后,鼠标即可随着拖动或按钮操作向单片机发送动作信息,经接口模块释放即可反应鼠标位置和按钮状态。
鼠标接口模块主要包括按钮状态识别和位置识别两个部分。80C196将根据接收到的鼠标信息不断刷新鼠标信息缓冲区。由于鼠标事件间隔不确定,采用扫描方式但会浪费CPU时间,还可能因来不及处理而丢失信息。有效的处理方法是采用中断方式接收,应用模块通过软件接口获得鼠标信息。完整的鼠标接口程序流程图如图2所示。在初始化阶段,首先检查鼠标是否存在,根据结果设置标志位,以备以后取鼠标信息时判断用;根据需要设定鼠标初始化位置、按钮原始状态;最后设置串行接口参数(帧格式等)并开放鼠标中断。鼠标发送信息时,第三个字节为一个完整的信息报告。但80C196每接收到一个字节,就产生一次中断,然后根据当前字节是否大于40H确定其性质。若是信息报告的首字节,则还要进一步通过有效性检验后保存;若不是首字节,则必须经过一系列检验后保存起来。收到三个字节后立即进行命令分析和执行。具体处理过程可参看源程序。用户模块通过特定接口模块(图2(b))获得鼠标当前位置和按钮状,并可通过进位标志C=0/1判断鼠标是否安装。
下面是图2、3程序流程图如图对应的程序清单。该程序要求80C196单片机的工作频率为12MHz;如果采有其它工作频率,通过修改串行口的波特率设置参数以及延时程序的时间常数即可。
;
;8098特殊功能寄存器预定义
R0 EQU 00H:Word
SBUD EQU 07H:Byte
INT_MASK EQU 08H:Byte
INT_PEND EQU 09H:Byte
BAUD_RT EQU 0EH:Byte
IOP2 EQU 10H:Byte
SP_CON EQU 11H:Byte
SP_STAT EQU 11H:Byte
IOC1 EQU 16H:Byte
SP EQU 18H:Word
单片机程序设计范文第2篇
关键词:单片机 程序编制 模块执行 结构设置
中图分类号:TP368 文献标识码:A 文章编号:1007-9416(2014)05-0094-01
目前单片机的应用十分广泛,在众多行业中都担负起系统控制的任务,而单片机的功能实现则多数依靠应用程序的控制,所以针对单片机的程序编制问题就成为单片机应用的基础性问题,如何选择合适的编写结构以及方法等成为了研究的重点内容。
1 单片机程序结构设计的特征
单片机的程序编制应当从程序开发的语言入手,并针对不同的功能选择不同的程序结构,这样才能为程序编制打下良好的基础,因此在实际的操作中如何选择程序的结构模式就成为了编程的要务。随着计算机技术的成熟以及单片机的技术发展,结构化的程序设计方式被提出并应用。其主要是将程序编写纳入到模块模式下,利用结构标准化、模块化等来实现对程序的编制,利用模块化结构来简化编程的复杂程度。此类设计中是的是可重复利用性,可移植的标准性。简化程序的编制过程提高模块的利用率。从而降低出错的概率,提高单片机的应用效果。可以按照不同的单片机功能选择不同的模块,将各个模块的功能突出应用到系统中,并在特定的工作环境中解决特殊的问题。总是对软件结构的合理配置,理顺模块之间的关系,从而从宏观上完成对编程流程和结构的控制。从而实现对复杂问题的简化,提高单片机的编程效率,并提高对复杂问题的解决能力。
2 单片机的开发语言选择
在单片机的程序编制中C语言因为在应用上的优势而被广泛采用,方便的应用库函数容易实现复杂数据的结构。但是C语言不能在时序控制上获得优势,速度型算法上不易达到单片机的要求。但是随着C语言被纳入到编程范围后,其汇编混合编程的模式已经可以帮助弥补其语言上的缺点。随着单片机的调试技术的发展,单片机已经适应了C语言程序控制,从而为高级语言进入到编程中带来了可能。
3 单片机编程的常用程序结构
为了方便进行单片机的程序编制,通常可以将其程序划分为多种结构以此适应不同的功能需求。具体结构如下。
3.1 基本程序结构
其结构包括了初始化程序和工作程序两个部分,初始化程序负责在单片机上电后的复位,首先执行初始化程序,程序只要在工作前执行一次即可。初始化程序运行对个各种端口和变量、定时器、ADC等进行全面的检测和初始化。如果需要可以建立不同的初始化分支,对不同的终端进行检测和初始化,根据不同的条件来选择不同的初始化方式,比如冷启动和热启动的选择。主程序则是一个循环程序,这所执行的是单片机的工作内容,实现具体的功能,如检测、控制、通讯、人机交互等等。各个功能都是有子程序进行控制,主程序是控制调用这些程序的指挥者,以此方便模块化的程序编制和应用。
3.2 模块结构
在单机片程序中主程序负责的是模块调度工作,将实现功能的各个子程序进行合理调度,此时被调度的程序就是模块。这样的模块中所附加的是一定的功能性,采用模块化的程序结构可以方便程序多种功能的集成,即在不增加主程序难度的同时添加或者减少模块可以实现系统功能的改变,以此实现程序的优化,方便维护与降低出错率。
3.3 模块控制机制
调度主程序时不是所有的模块都被应用,所以模块在一段时间内应被控制,不是所有的循环中都需要所有模块参与。或者某些模块的执行不是经常性的而是在满足某些条件后才被执行。为了解决这个问题,可以给模块设定一个标志,模块在执行前应判断自身的标志位,只有标志位是可用的状态下才能执行相关的操作。如果标志位不可用则应进行返回程序,不执行对应的模块功能。
3.4 优先调用机制
主程序在调用模块的时候应有先后之别,因为模块运行的优先级将限制其应用,如果没有优先限制某些重要模块不能相应或者不及时。因此在调用中主程序应可以对模块的优先级进行分析与选择,按照不同的处理事件来区分模块的优先级。对模块功能的标志进行检测,对优先级较高的模块进行调用,然后查询后续功能模块并异常类推。如果出现不可用的情况则进行新一轮的检测并从优先级较高的模块开始。
3.5 前后台结构
前后台的结构是一种中断机制的引入,即按照实时性事件与突发事件进行差异化对待,实时性较高的事件被前置,让其在中断中响应,将实时性较低的事件和任务纳入到主要程序中,如显示刷新、扫描等等。形成一个以中断为界限的前后台执行程序结构。前后台的程序应按照大多数任务需求进行功能调度。在使用中应注意前后台任务结构的时候,尽可能减少中断服务程序的执行时间。可以在中断服务程序中设置一些标志,然后由后台程序检测标志来进行进一步处理。这样可以很大程度上避免前台程序和后台程序互相抢夺处理器资源,造成某些低优先级任务阻塞。目前随着单片机的发展,有些单片机的中断资源大为丰富,已经可以将所有的任务都可以通过中断来实现,这样我们就可以让中断承担全部工作,废除后台程序,除了只保留必要的初始化程序外就进人低功耗模式等待中断来处理其他任务。
4 结语
上述对单片机的程序编制结构进行了分析,从基础的结构类型出发分析了多种模式框架下,单片机程序执行的差异。同时说明多种结构不是独立存在的,而应在具体问题的解决中进行选择,选择合理而准确的程序结构,有利于单片机功能的实现,也可提高调度机制的合理性,从而有效的指挥单片机完成各种功能。
参考文献
[1]王玲.提高单片机程序设计有效性的策略探究[J].考试(综合版),2012(01):15-16.
[2]刘杰.论单片机程序设计[J].现代商贸工业,2011(07):156-157.
单片机程序设计范文第3篇
;定义中文LCD液晶128X64的地址
W_C_GLCDXDATA0E000H
W_D_GLCDXDATA0E001H
R_B_GLCDXDATA0E002H
R_D_GLCDXDATA0E003H
;-------------------------------------------------------
TIMER0DATA30H;延时时间的初值
TIMER1DATA31H;调用延时子程序的次数
DATA1DATA32H;点阵显示的变量1
DATA2DATA33H;点阵显示的变量2
XDATA34H;X方向的位置
YDATA35H;Y方向的位置
COUNTERDATA36H;计数器
NDATA37H;行数变量
D1DATA38H;点变量1
D2DATA39H;点变量1
ADDRDATA3AH;起始的显示位置
ADDR1DATA3BH;起始的显示位置临时变量
N1DATA3CH;行数的临时变量
;*******************************************************
;*主程序开始
;*******************************************************
ORG0000H
AJMPSTART
ORG0030H
START:CLRP1.0
SETBP1.1
MOVSP,#60H
LCALLINITIAL_GLCD;调用LCD初始化
LCALLKAIJI;显示开机画面
LCALLDELAY500
LCALLDELAY500
LCALLDELAY500
LCALLTISHI;显示主界面
LCALLINI_8279
;------------------------------------------
;判断是否继续
;------------------------------------------
KEY_A:MOVDPTR,#8101H;8101H为8279命令
MOVXA,@DPTR;读状态字
ANLA,#07H;判断低三位是否为0
CJNEA,#00H,LP1;不为0(有键按下)则跳转
SJMPKEY_A;为0(没键按下)则继续查询
LP1:MOVDPTR,#8100H;8100H为8279数据口
MOVXA,@DPTR;读键值
CJNEA,#0DBH,KEY_A;判断是否按D键
AJMPK1
K1:LCALLYUZHI;阈值设定
LCALLcelianjieguo;结果显示界面
LCALLCELIANGJIEGUO;结果显示
AJMP$
;*******************************************************
;*主程序开始
;*******************************************************
;=======================================================
;各界面显示内容
;=======================================================
DHbr1:DB"欢迎使用"
DHbr2:DB"半桥电子秤"
DHbr3:DB"设计人:xxx"
DHbr4:DB"时间:xxxx"
DHbr5:DB"****************"
DHbr6:DB"设置报警上限"
DHbr7:DB"确定"
DHbr8:DB"请按D键"
DHbr9:DB""
DHbr10:DB"报警上限重量:"
DHbr11:DB".g"
DHbr12:DB"确定(E)"
CELIANG1:DB"电子秤"
CELIANG2:DB"重量是:"
CELIANG3:DB".g"
CELIANG4:DB"返回(F)"
;=======================================================
;开机界面子程序
;=======================================================
KAIJI:MOVADDR1,#00H;第一行显示
MOVN1,#08H;数量8个
MOVDPTR,#DHbr1;需要显示的汉字位置
CALLDHZ;调用汉字子序
MOVADDR1,#10H;第二行显示
MOVN1,#08H
MOVDPTR,#DHbr2
CALLDHZ
MOVADDR1,#08H;第三行显示
MOVN1,#08H
MOVDPTR,#DHbr3
CALLDHZ
MOVADDR1,#18H;第四行显示
MOVN1,#08H
MOVDPTR,#DHbr4
CALLDHZ
RET
;=======================================================
;提示界面子程序
;=======================================================
TISHI:LCALLCLEAR_GLCD;清除LCD显示屏幕
MOVADDR1,#00H
MOVN1,#08H
MOVDPTR,#DHbr5
CALLDHZ
MOVADDR1,#10H
MOVN1,#08H
MOVDPTR,#DHbr6
CALLDHZ
MOVADDR1,#08H
MOVN1,#08H
MOVDPTR,#DHbr7
CALLDHZ
MOVADDR1,#18H
MOVN1,#08H
MOVDPTR,#DHbr8
CALLDHZ
RET
;=======================================================
;阈值设定界面子程序
;=======================================================
SHEDING:LCALLCLEAR_GLCD
MOVADDR1,#00H
MOVN1,#08H
MOVDPTR,#DHbr9
CALLDHZ
MOVADDR1,#10H
MOVN1,#08H
MOVDPTR,#DHbr10
CALLDHZ
MOVADDR1,#08H
MOVN1,#08H
MOVDPTR,#DHbr11
CALLDHZ
MOVADDR1,#18H
MOVN1,#08H
MOVDPTR,#DHbr12
CALLDHZ
RET
;=======================================================
;测量界面子程序
;=======================================================
celianjieguo:LCALLCLEAR_GLCD
MOVADDR1,#00H
MOVN1,#08H
MOVDPTR,#CELIANG1
CALLDHZ
MOVADDR1,#10H
MOVN1,#08H
MOVDPTR,#CELIANG2
CALLDHZ
MOVADDR1,#08H
MOVN1,#08
MOVDPTR,#CELIANG3
CALLDHZ
MOVADDR1,#18H
MOVN1,#08
MOVDPTR,#CELIANG4
CALLDHZ
RET
;=======================================================
;8279初始化子程序
;=======================================================
INI_8279:MOVDPTR,#8101H
MOVA,#00H
MOVX@DPTR,A
MOVA,#32H
MOVX@DPTR,A
MOVA,#0DFH
MOVX@DPTR,A
RET
;=======================================================
;键盘设定阈值子程序
;=======================================================
YUZHI:LCALLSHEDING
MOV44H,#00H;44H单元存按键次数,先清0
;******************键盘按键存储空间*******
MOV55H,#00H;存入四次按键值
MOV56H,#00H
MOV57H,#00H
MOV58H,#00H
MOV50H,#00H;存阈值百位
MOV51H,#00H;存阈值十位和个位
MOV52H,#00H;存阈值小数位
;*************************************************************
KEY_09:MOVDPTR,#8101H;判断是否有键按下
MOVXA,@DPTR
ANLA,#07H
CJNEA,#00H,LPP1
AJMPKEY_09
;-------------------------------------------
;各个键的处理
;------------------------------------------
LPP1:MOVDPTR,#8100H
MOVXA,@DPTR
B0:CJNEA,#0D8H,B1
AJMPKK0
B1:CJNEA,#0D0H,B2
AJMPKK1
B2:CJNEA,#0D1H,B3
AJMPKK2
B3:CJNEA,#0D2H,B4
AJMPKK3
B4:CJNEA,#0C8H,B5
AJMPKK4
B5:CJNEA,#0C9H,B6
AJMPKK5
B6:CJNEA,#0CAH,B7
AJMPKK6
B7:CJNEA,#0C0H,B8
AJMPKK7
B8:CJNEA,#0C1H,B9
AJMPKK8
B9:CJNEA,#0C2H,BE
AJMPKK9
BE:CJNEA,#0DAH,YUZHI
AJMPKKE
KK0:MOV5BH,#00H;5BH存键值
AJMPCOUNT_1
KK1:MOV5BH,#01H
AJMPCOUNT_1
KK2:MOV5BH,#02H
AJMPCOUNT_1
KK3:MOV5BH,#03H
AJMPCOUNT_1
KK4:MOV5BH,#04H
AJMPCOUNT_1
KK5:MOV5BH,#05H
AJMPCOUNT_1
KK6:MOV5BH,#06H
AJMPCOUNT_1
KK7:MOV5BH,#07H
AJMPCOUNT_1
KK8:MOV5BH,#08H
AJMPCOUNT_1
KK9:MOV5BH,#09H
AJMPCOUNT_1
KKE:AJMPEND_P
COUNT_1:MOVA,44H;44H存按键次数
INCA
MOV44H,A
CJNEA,#05H,CW1;按键次数是否达到4次
AJMPYUZHI;五次按键则重设阈值
CW1:ADDA,#54H;键盘按键存储空间
MOVR0,A
CW2:CLRA
MOVA,5BH
MOV@R0,A
LCALLPRO_SHOW
AJMPKEY_09
RET
;=========================================
;各次报警值按键处理子程序
;=========================================
PRO_SHOW:NOP
PR_1:CLRA;一次按键
MOVA,44H
CJNEA,#01H,PR_2
MOVR0,#55H
MOVA,@R0
SUBBA,#05H
JNCSS
MOV51H,55H
MOVA,55H
MOVADDR1,#0AH
LCALLSHUZIXIANSHI
SJMPEND_P
PR_2:CLRA;二次按键
MOVA,44H
CJNEA,#02H,PR_3
CLRA
MOVA,55H
SWAPA
ADDA,56H
MOV51H,A
MOVA,55H
MOVADDR1,#09H
LCALLSHUZIXIANSHI
MOVA,56H
MOVADDR1,#0AH
LCALLSHUZIXIANSHI
AJMPEND_P
PR_3:CLRA;三次按键
MOVA,44H
CJNEA,#03H,PR_4
CLRA
MOV50H,55H
MOVA,56H
SWAPA
ADDA,57H
MOV51H,A
MOVA,55H
MOVADDR1,#08H
LCALLSHUZIXIANSHI
MOVA,56H
MOVADDR1,#09H
LCALLSHUZIXIANSHI
MOVA,57H
MOVADDR1,#0AH
LCALLSHUZIXIANSHI
SJMPEND_P
PR_4:CLRA;四次按键
MOVA,58H
SWAPA
MOV52H,A
SWAPA
MOVADDR1,#0CH
LCALLSHUZIXIANSHI
SJMPEND_P
END_P:RET
SS:LJMPYUZHI
;=============================================================
;结果显示子程序
;=============================================================
CELIANGJIEGUO:LCALLADC0809;调用0809采样程序
LCALLZHH;调用转换程序
MOVADDR1,#08H;采数据送LCD显示
MOVA,40H
LCALLSHUZIXIANSHI
MOVADDR1,#09H
MOVA,41H
SWAPA
LCALLSHUZIXIANSHI
MOVADDR1,#0AH
MOVA,41H
LCALLSHUZIXIANSHI
MOVADDR1,#0CH
MOVA,43H
SWAPA
LCALLSHUZIXIANSHI
CALLDELAY500;调用延时
CALLBJ;判断是否超过阈值,超过则报警
;------------------------------------------
;F键判断是否返回提示界面
;------------------------------------------
KEY_F:MOVDPTR,#8101H
MOVXA,@DPTR
ANLA,#07H
CJNEA,#00H,LP2
SJMPCELIANGJIEGUO
LP2:MOVDPTR,#8100H
MOVXA,@DPTR
CJNEA,#0D9H,CELIANGJIEGUO;判断是否按F键
SETBP1.1
CLRP1.0
AJMPK1
;=======================================================
;报警子程序
;=======================================================
BJ:MOVR1,#50H
MOVA,@R1
CLRC
SUBBA,40H
JCWARNING
JZCOMP1
SETBP1.1
CLRP1.0
RET
COMP1:INCR1
MOVA,@R1
CLRC
SUBBA,41H
JCWARNING
JZCOMP2
SETBP1.1
CLRP1.0
RET
COMP2:INCR1
MOVA,@R1
CLRC
SUBBA,43H
JCWARNING
SETBP1.1
CLRP1.0
RET
WARNING:CLRP1.1
SETBP1.0
RET
;=======================================================
;0809采样程序
ADC0809:PUSHDPL
PUSHDPH
PUSHACC
MOVDPTR,#W_D_0809;AD0809的启动地址
MOVA,#00H
MOVX@DPTR,A;0通道
LCALLDELAY01;延时100US
MOVXA,@DPTR;读出A/D的结果
MOV3FH,A;暂存
POPACC
POPDPH
POPDPL
RET
;=======================================================
;转换子程序:3FH的内容(A/D采样的结果)*(5V/256(FFH))=十进制结果;40H,41H.例如:3FH=0FFH,那么程序执行后:40H=04H,41H=99H既4.99V
;=======================================================
ZHH:PUSHPSW
PUSHACC
SETBRS0
MOVA,#4eH
MOVB,3FH
MULAB
MOVR6,B
MOVR7,A
HB2:CLRA
MOVR3,A
MOVR4,A
MOVR5,A
MOVR2,#10H
HB3:MOVA,R7
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R5
ADDCA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
MOVR3,A
DJNZR2,HB3
MOV40H,R3
MOV41H,R4
MOV43H,R5
POPACC
POPPSW
RET
;=======================================================
;点阵式LCD(128X64)模块显示部分子程序;以下是公共的程序:
;=======================================================
;LCD初始化子程序
;=========================================
INITIAL_GLCD:PUSHACC
MOVA,#30H;功能设定
CALLCOMMAND_GLCD
MOVA,#30H;功能设定
CALLCOMMAND_GLCD
MOVA,#30H;功能设定
CALLCOMMAND_GLCD
MOVA,#06H;显示器控制:游标不显示;
CALLCOMMAND_GLCD
MOVA,#01H;清除显示器
CALLCOMMAND_GLCD
MOVA,#0CH;进入模式设定
CALLCOMMAND_GLCD
POPACC
RET
;=========================================
;汉字显示子程序(16X16点阵)
;=========================================
DHZ:MOVADDR,ADDR1;开始行位置
MOVB,N1;显示数量
DHZ1:MOVA,ADDR;
ORLA,#80H;送显示地址
LCALLCOMMAND_GLCD;调写命令子程序
DHZ2:CLRA
MOVCA,@A+DPTR;查找汉字的高位码
INCDPTR
LCALLWRITE_GLCD;送显示
CLRA
MOVCA,@A+DPTR;查找汉字的低位码
INCDPTR
LCALLWRITE_GLCD;送显示
DJNZB,DHZ2
RET
;=========================================
;数字显示子程序
;=========================================
SHUZIXIANSHI:MOV42H,A
MOVADDR,ADDR1;开始行位置
MOVA,ADDR;
ORLA,#80H;送显示地址
LCALLCOMMAND_GLCD
MOVA,42H
;------------------------------------------
;将ACC内容,以十六进制值显示
;------------------------------------------
HEX_LCD:PUSHDPH
PUSHDPL
PUSHACC
ANLA,#0FH
MOVDPTR,#ASCII_CODE;DPTR指到ASCII_CODE
MOVCA,@A+DPTR;取得ASCII码
CALLWRITE_GLCD;写到LCD
POPACC
POPDPL
POPDPH
RET
ASCII_CODE:DB''''0123456789ABCDEF''''
;=========================================
;检查LCD忙碌标志
;=========================================
CHKBUSY_GLCD:PUSHDPH
PUSHDPL
PUSHACC
MOVDPTR,#R_B_GLCD
CHK:MOVXA,@DPTR
JBACC.7,CHK;判别是不是忙?
POPACC
POPDPL
POPDPH
RET
;=========================================
;写命令到GLCD
;=========================================
COMMAND_GLCD:PUSHDPH
PUSHDPL
CALLCHKBUSY_GLCD;判别是不是忙?
MOVDPTR,#W_C_GLCD
MOVX@DPTR,A;写入命令
POPDPL
POPDPH
RET
;=========================================
;写资料到GLCD
;=========================================
WRITE_GLCD:PUSHDPH
PUSHDPL
CALLCHKBUSY_GLCD;判别是不是忙?
MOVDPTR,#W_D_GLCD;写入数据
MOVX@DPTR,A
POPDPL
POPDPH
RET
;=========================================
;清除LCD的显示幕
;=========================================
CLEAR_GLCD:PUSHACC
MOVA,#01H;清除显示器
CALLCOMMAND_GLCD
POPACC
RET
;=======================================================
;延时子程序
;=======================================================
DELAY:PUSHTIMER1;延时TIMER1*1msfor12MHz
PUSHTIMER0
DELAY1:MOVTIMER0,#250;时间为4*1μS
DELAY2:NOP;1个周期
NOP;1个周期
DJNZTIMER0,DELAY2;2个周期
DJNZTIMER1,DELAY1
POPTIMER0
POPTIMER1
RET
NOP
;------------------------------------------
;延时1ms
;------------------------------------------
DELAY01:NOP
PUSHTIMER1
MOVTIMER1,#01H
LCALLDELAY
POPTIMER1
RET
NOP
;------------------------------------------
;延时500ms
;------------------------------------------
DELAY500:NOP
PUSHTIMER1
MOVTIMER1,#250
LCALLDELAY
LCALLDELAY
POPTIMER1
单片机程序设计范文第4篇
关键词:C语言;高职;单片机
中图分类号:G642 文献标识码:B
“C语言程序设计”是高职高专电子专业的专业必修课。传统教学以理论为主,以学科本位的逻辑体系来设计课程的教学内容。课程内容没有与高职电子专业的其他课程有机衔接,不符合高职高专技能培养的特点。学生在学习C语言之后,不能用之有效地解决实际问题,学生的学习积极性难以调动,因此有必要对该课程进行改革。
1 现状分析
目前高等学校都把“C语言程序设计”作为理工科非计算机专业的计算机基础教育课程,属于计算机基础教育课程的一部分。但课程设置并没有考虑与其他专业课程之间的关系,没有针对高职应用电子技术的专业特点,成了非计算机专业学生的“计算机通识教育”课程。
虽然许多学校对“C语言程序设计”课程从教学内容、教学手段、教学方法等方面进行了大胆的改革,把逻辑与编程解题思路(算法)放在主体地位,讲解如何分析问题和解决问题;但是受“在学校里牢固掌握基础知识,毕业后在实践中积累经验”这种传统的教学理念的影响,把培养学生阅读程序、设计程序的能力,分析问题、、解决问题的能力和逻辑思维能力作为教学目标。课堂上学到的也只是用C语言解决一些数学问题,所学内容和实际应用相脱节,认识不到“C语言程序设计”和自己专业之间的关系,学生在学习C语言之后,不能用C语言编写为本专业服务的应用软件。特别对高职高专电子专业学生来说,C语言的知识成了他们专业知识结构中的一个“孤岛”。
2 改革的必要性
C语言是影响深远的、传统的、优秀的面向过程的结构化程序设计语言。C语言功能丰富、表达能力强、使用灵活方便、应用面广、代码转换质量高。C语言方便进行模块化软件设计,还可以实现C语言和汇编语言的混合编程。C语言既具有高级语言的优点,又具有低级语言的许多特点,能像汇编语言那样直接利用CPU的硬件特性进行程序设计。既可以编写应用软件,又可以编写系统软件。和汇编语言相比,C高级语言程序设计快、可读性、可移植性和可维护性好。一般情况下,完成同样的任务,使用C高级语言比用汇编语言可提高工作效率5-10倍,在调试阶段更容易体会到这一点,因此C语言特别适合单片机的开发。嵌入式系统中使用的嵌入式操作系统绝大部分也都是以C高级语言为基础的,很多直接将源代码提供给使用者。目前在单片机应用领域,C高级语言越来越受到人们的重视。用C语言进行单片机程序设计已经成为单片机开发的一个主流,是单片机开发与应用的必然趋势。
单片机课程是应用电子技术及相关专业的一门重要的专业主干课,在专业基础课和其他专业课方面起着重要的桥梁作用。它涉及到的基础理论知识较广,应用范围广,是一门实践性、工程性很强的技术课程,在电子技术及相关专业课程中群中占有十分重要的地位。电子专业的学生普遍将单片机用于课程设计、毕业设计和电子产品设计大赛等许多实践环节。单片机应用也是学生将来在电子类公司或电子行业工作的最基本的技能。“单片机原理与应用”课程都是基于汇编语言的,高职高专学生很难应用汇编语言去搞程序设计,学生学到的单片机知识不能得到应用。
高等职业教育的培养目标是:培养既有一定理论基础又有较强实践能力,在生产服务第一线工作高层次的实用型、技术型人才,它不同于一般本科院校的学术型、工程型人才的培养目标。就高职应用电子技术专业而言,它培养强电弱电相结合,以弱电为主,并能熟练应用电气技术、计算机技术和控制技术等现代科学技术,具有较强实践能力的技术管理人才。强调应用性、实用性是高职教育的特色,教学内容突出基础理论知识的应用和实践能力培养的原则,以应用为目的,以“必需、够用”为度,加强针对性和实用性。
因此,高职应用电子专业的“C语言程序设计课程”应不同于本科相应专业,也应不同于高职其他专业。“C语言程序设计”课程的开设应紧扣本专业的特点,为本专业的培养目标服务。如果将“C语言程序设计”变成“单片机C语言程序设计”,学生通过本课程的学习掌握单片机C语言程序设计方法,达到独立利用C语言编写单片机应用程序的目的。将C语言“知识孤岛”和单片机“知识孤岛”连接起来,结合所学其他专业知识,使学生学会应用单片机开发电子系统的基本方法。如果学生以后需要用C语言或其他高级语言开发通用计算机系统的应用软件或系统软件,有了“单片机C语言程序设计”的基础,可以触类旁通,很容易掌握其他高级程序设计语言。这也符合从特殊到一般,再从一般到特殊的认知规律。
3 课程改革设想:
3.1 课程内容的改革
把“C语言程序设计”置换为“单片机C语言程序设计”,放在“单片机原理与应用”课程之后开设,将“计算机基础教育”课程变成“单片机开发技能”课程。课程内容适用于C高级语言的初学者,包括数据类型、运算符和表达式、数组、指针和函数、程序的顺序结构、选择结构和循环结构、程序设计基本知识和单片机的C编程等内容。对C语言中较难或单片机程序不常使用的内容,比如多维数组、指向指针的指针、链表等进行删减。相关例题应本着“深入浅出,突出实用”的指导思想,难度应与高职高专学生的基础相适应,算法不要过于复杂。单片机的C语言编程部分主要应包括中断、定时器/计数器、串行口、键盘和显示等相关应用,适当包含少量可编程芯片的应用。所选内容应体现先进性、实用性和技能培养的特点,抛弃一些过时或不实用的内容,把提高学生的职业技能放在突出的重要位置。整门课程应将单片机和C语言有机结合起来,强调知识点在单片机程序设计中的应用,体现“单片机C语言”的特色,避免把课程内容分为“C语言程序设计”和“单片机C编程”两部分。
3.2 编译开发环境
以80C51系列为基础,开发环境选择德国KeilSoftware公司的Keil uVision集成开发环境(当前版本是uVision3)。这是一个基于Windows的开发平台,集成了编辑器、项目管理器、Cx51编译器、Ax51宏汇编器、BL51/Lx51连接定位器和调试器,用户群极为庞大,符合教学特点的典型性。其中Cx51是专为80C51单片机设计的C语言编译器,生成的程序代码运行速度高,存储空间小。KeiluVision还提供了强大的项目管理功能,可以十分方便地进行结构化多模块程序设计,特别是Keil提供的纯软件模拟仿真功能(也支持硬件目标板在线仿真),非常适合教学使用。Keil调试器支持断点管理和程序代码的多种 执行方式(全速、单步、执行到指定行等)。在调试状态下有寄存器窗口、存储器窗口、观察窗口和命令窗口,用于程序执调试过程中显示单片机寄存器、存储器、局部变量和观察点的状态和输入各种调试命令。Keil uVision的集成功能(Peripherals)菜单可以打开中断系统、I/O接口、串行口、定时器计数器等状态窗口,通过这些状态窗口可以观察软件仿真结果。
Keil uVision可以与PROTEUS整合构建单片机虚拟实验室。PROTEUS是目前世界上最先进最完善的嵌入式系统设计与仿真平台,可以实现数字电路、模拟电路及微控制器与外设组成的混合电路系统仿真、软件仿真、系统协同仿真和PCB设计等全部功能。由于PROTEUS软件包逼真、真实的协同仿真功能,得到了包括剑桥在内的众多大学用户的认可,作为电子学或嵌入式系统的课程教学、实验和水平考试平台。Keil uVision与PROTEUS通过设置联机调试单片机系统,在PROTEUS中完成单片机系统的电路原理图绘制后,在Keil uVision集成开发环境中进行程序设计、项目的创建、编译链接和调试,同时可在PROTEUS查看直观的结果(如键盘输入和LCD显示等)。
3.3 教学方式的改革
高职教学应该是基础和技能的教学同步进行,甚至先教技能再教理论,在不断实践中掌握技能,在技能学习中提高基础理论。在高级语言程序设计教学中,不能期望高职学生对每一个算法都理解。一些太复杂的算法、单片机应用系统中常用芯片的驱动程序,可以以函数库或软件包的形式直接提供给学生,供学生在程序设计中调用,降低理论教学难度。
确立以学生为中心的教学理念。从学生实际出发,以学生为本,采用多样化、层次化的教学方法,贯彻循序渐进、深入浅出的原则。学生没有高级语言程序设计的基础,在“单片机C语言程序设计”教学中要注意分散难点,缩小台阶。在内容体例的设计上以实用为主,抛弃过多的语法细节和非通用的或实际用途很少的语言特性,理出重点和教学主线;采用一体化教学方法,以程序样例为主实施教学。淡化语法教学,以程序设计带动基本语法的学习。
上机实验是掌握单片机C语言程序设计的必要手段。不能简单地认为上机实验只是辅的教学。程序设计的能力是在实际动手实践中练就的,通过上机操作和验证可进一步加深各种语句的理解,提高学生的编程能力。通过Keilu Vision与PROTEUS组成的联机调试环境,熟练使用Keilu Vision和PROTEUS软件对学生的深入学习有巨大的帮助。
单片机程序设计范文第5篇
【关键词】AT89C51单片机;室内;环境监测
在我们日常生活中,我们长时间处在室内环境中。因此,打造一个良好的室内环境,是人们身体健康的重要的保障。所以,激发了笔者对基于单片机的室内环境监测系统的研究与应用,可以为为室内环境建设提供一定的参考数据。而AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器。可在室内环境监测系统作为核心处理器。本文基于单片机的室内环境监测系统的研究与应用进行探讨。
1方案设计
一个产品的设计首要原则就是可靠性,因此在电子元器件购买时需要选择性价比高的。单片机具备体积小、功耗低和可靠性高等特点。室内环境监测系统设计应该具备以下这几种基本功能,温度检测,湿度检测和CO浓度检测。利用温度传感器将检测到的数据传输给单片机,通过单片机处理后,显示。利用湿度传感器将检测的数据传输给单片机,通过单片机处理后,显示。利用气敏传感器检测CO浓度传输给单片机,单片机处理后,显示。
2硬件设计
在室内环境监测系统中选用AT89C51单片机作为系统的微控制器,实现系统的设计的各项任务。在该设计中,P0I/O口作为LCD液晶屏的数据口,P2I/O口中的P2.0、P2.1、P2.2作为控制信号的输出口,分别接到LCD的RS、R/W、E控制端,P1.0I/O和P1.1I/O口姐温湿度传感器的SHT11的SCK和DATA。P1.3到P1.5I/O口分别接ADC0831的控制端。根据明确的电路设计,使用Protel软件完成成对这些元器件的PCB封装制作、布局、布线等工作。在布线的而过程中一定需要细心与耐性,因为一个小小的失误将使PCB制作失败。PCB制作完成后,将是焊接,当锡球至于一个加热的环境中,锡球回流分为三个阶段,预热、回流、冷却。这样硬件电路就设制完成了。
3软件设计
本系统采用C51语言设计,单片机的C51语言是由C语言发展而来,单片机C51语言兼备高级语言与低级语言的优点。KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。与汇编相比,C51语言在功能上、可读性、可移植性具备明显的优势。因此,软件结构采用模块化设计,由主程序、SHT11数据采集程序和数据处理程序,ADC0832数据采集程序和数据处理程序,LCD显示程序等模块组成。主程序负责系统初始化,协调各个部分的子程序。SHT11数据采集程序和数据处理程序负责采集数据,进行数据加工。ADC0832数据采集程序和数据处理程序负责数据采集和数据处理。LCD显示程序负责把单片机处理的数据显示出来。
4结语
在本设计中,硬件与软件设计都采用模块化和层次化设计,AT89C51单片机处理信息、采集信息和显示信息。以AT89C51单片机为微控制器设计分析了可用于对室内环境进行监测系统。该系统使用传感器技术等单片机控制技术实现了对家居环境的温湿度、煤气浓度与甲醛浓度的采集与显示等功能。
参考文献
[1]于波.基于单片机的室内环境监测系统设计[D].中国海洋大学,2011.
[2]黎冠,马婕,卜祥丽.STM32单片机在室内环境监测系统中的应用[J].自动化仪表,2014(07).
[3]李卓实.室内环境监测及控制系统[D].哈尔滨工业大学,2011.