N=Fi÷2÷Fr N:计数值;
Fi:内部计时一次为1us,故其频率为1MHZ; Fr:要产生的频率。
其计数值的求法如下:
T=65536-N=65536-Fi÷2÷Fr
表3-1是各按键音符的频率与计数值T的对照表。
表3-1 各按键音符频率与计数值T的对照表
键值 0 1 2 3 4 5 6 7 音符 低3M 低4FA 低5SO 低6LA 低7SI 中1D0 中2RE 中3M 频率(HZ) 330 349 392 440 494 523 587 659 简谱码(T值) 64021 64103 64260 64400 64524 64580 64684 64777 键值 8 9 A B C D E F 音符 中4FA 中5SO 中6LA 中7SI 高1D0 高2RE 高3M 高4FA 频率(HZ) 698 784 880 988 946 1175 1318 1397 简谱码(T值) 64820 64898 64968 65030 65058 65110 65157 65178 4单片机软件设计
软件的设计是我毕业设计的另一个重要方面。它的好坏直接关系毕业设计的成功与否。我等软
件是用汇编完成的,需要能熟练的掌握汇编语言,还要熟悉AT89C51单片机。
程序流程图是编写软件的重要前提,它是在图表上直观的体现拟设计的目的及过程。也是编译的重要依据,按照流程图一步一步编写程序,单片机软件主程序流程图如图4-1所示。
第11页,共37页
开始 LCD初始化 设置串口初始化 收到数据? 否 否 检测按键输入 是 读入键值 是 转换成键码 串口发送键码 LCD显示并发声 接收数据送LCD显示 图4-1主程序流程图
4.1 CM1601软件子程序设计
LCD1601是通用的点阵型液晶模块,分4位和8位数据传输方式。提供5X7点阵+光标和5X10
点阵+光标的显示模式。除带有驱动IC外,还自带液晶显示控制IC,其本身就是一个能够接受指令,自动控制液晶显示的单片微机子系统。因此,通过软件编程,就可以实现对LCM1601的操作。编程时要求CPU每一次访问都要先对忙标志BF进行识别,当BF=0时,即LDC允许CPU访问时,再进行下一步的操作。操作程序如下: 4.2.1写指令
ENABLE:
MOV CLR SETB CLR NOP SETB
P1,#0FFH RS RW E E
第12页,共37页
;令P1=FFH
;RS=0,R/W=1,读BUSY FLAG地址计数器
JB CLR CLR CLR CALL SETB RET
P1.7,ENABLE ;BUSY FLAG=0? RS ;RS=0,R/W=0写入指令组 RW E
DELAY E
4.2.2写数据 WRITE1: MOV A3:
MOV MOVC CALL INC CJNE RET MOV SETB CLR CLR CALL
R1,#00H A,R1
A,@A+DPTR WRITE2 R1
A,#00H,A3 P1,A RS RW E DELAY
;显示TABLE表的值 ;至TABLE取码 ;显示至LCD
;是否取到“00H”结束码? ;显示数据送至P1
;RS=1,R/W=0写入数据寄存器显示
WRITE2:
SETB E RET
4.2.3 LCD1601初始化
MOV CALL MOV CALL MOV CALL MOV CALL MOV CALL
P1,#01H ENABLE P1,#38H ENABLE P1,#08H ENABLE P1,#06H
;清除屏幕
;功能设定(8位,2行,5×7点矩阵) ;显示器ON,光标ON,闪烁ON ;光标右移
ENABLE
P1,#80H ;令光标回到第一行第一个字位置 ENABLE
4.2串口通信子程序设计
AT89C51的串行口是全双工的UART,它可同时发送和接收数据,是使用特殊寄存器内的SBUF寄存器及SCON串行控制寄存器,如表4-1所示。
表4-1 SCON串行控制寄存器
RI:接收中断标志位。在模式0下,当第8位结束时,硬件会将其设为1;在其他模式下,在
停止位的开始时有硬件设定,次位必须由软件清除。
第13页,共37页
TI:发送中断标志位。在模式0下,当第8位结束时,硬件会将其设为1;在其他模式下,在
停止位的开始时由硬件设定,次位必由软件清除。
RB8:在模式2或3时,发送的第9位放入次位。在模式1时,若SM2=0,则RB8为接收到的停
止位。模式0时,RB8没作用。
TB8:在模式2或3时,发送时的第9位数据位由软件控制。
REN:由软件设定或清除,以决定是否接收串行输入数据,REN=1,接收;REN=0,发送。 SM2:当串行口为模式2或3时,使能多处理器通信的功能。在模式2或3时,如果SM2=1,则
当接收到第9位数据为0时,RI不动作。在模式1时,若SM2=1,当接收到的停止位不正确时,RI也不动作。在模式0时,SM2必须为0。
SM1:串行口模式选择。 SM0:串行口模式选择。
UART共有四种工作方式,MODE0可发送或接收8位的数据;MODE1可发送或接收10的数据;MODE2K
可发送或接收11的数据;MODE3与 MODE2的功能几乎完全一样,不同的是MODE2的发送速率固定,而MODE3是可变的。现在就本文中用到的MODE1作一重点介绍。 MODE1其设定如下:
MOV JBC MOV JBC
SCON,#00000000B TI,LOOP
;发送数据工作方式
;发送是否完毕?是则跳至LOOP,并清除TI=0 ;接收数据工作方式
;接收是否完毕?是则跳至LOOP,并清除RI=0
SCON,#00010000B RI,LOOP
MODE0KE可发送或接收11位的数据,此10个位分别是1个起始位、8个数据位和1个停止位。
MODE1发送数据的速度(称为波特率)是可变的,由TIMER1或TIMER2控制且最好工作在MODE2(自动载入模式),这样只要设定TH1一次即可。当UART接收(RXD引脚)到一个字节的数据后,会使SCON寄存器内的RI位设定为1,CPU只要检查RI=1就可知道UART已接收到数据。若数据通过UART输出时(TXD引脚),在8个位输出完毕后,SCON寄存器内的TI位会被设为1,CPU只要检查到TI=1就可知道可以再发送下一个字节。
控制波特率的寄存器为PCON,如表4-2所示。说明如下: PCON:电源控制寄存器(POWER CONTROL REGISTER)。
表 4-2 电源控制寄存器
SOMD:双倍波特率位。当串行工作于模式1、2或3时,如使用TIMER1做波特率发生器,且SMOD=1
则波特率为双倍。
—:保留位。
GF1:一般用途,对于AT89系列,GF1为通用标志位。 GF0:一般用途,对于AT89系列,GF0为通用标志位。
第14页,共37页
PD:电源下降位,对于AT89系列,PD为1时进入掉电状态。 IDL:IDLE模式位,对于AT89系列,IDL为1是进入空闲工作方式。 注意:PD和IDLE同时为1时,PD较优先。 其设定方式如下: (1) 设定波特率:
MOV ANL 或 ORL MOV SETB
TMOD,#00100000B PCON,#01111110B
;设定TIMER1的MODE2 ;设SMOD=0
PCON,#10000000B TH1,#0FDH TR1
;设SMOD=1
;设定TIMER1的计数值 ;启动TIMER1
(2)设定UART工作方式
SCON,#01010000B RI,LOOP2
;MODE1做接收,REN=1
MOV JBC 或 MOV JBC
SCON,#0100000B TI,LOOP2
;MODE做发送,REN=0
波特率的计算:
(1) MODE0的波特率=振荡器频率÷12 振荡频率=12MHZ
波特率=1MHZ
(2) MODE2的波特率=(2/64)×振荡频率 振荡频率=12MHZ
SMOD=0 SMOD=1
BAUD=187.5KHZ BAUD=375KHZ
(3) MODE1和MODE3:利用TIMER工作在MODE2模式(自动载入)产生的波特率为
(2/32)×[振荡频率/(12×(256-TH1))]
常用的各种波特率如表4-2-3所示。
第15页,共37页