1、南京工程学院自动化学院本科毕业设计(论文)第 1 章 引 言水位检测和显示仪表装置在工业上有着广泛的应用。本设计采用的是一种低成本的数码管显示驱动方案。在对成本较敏感的小型系统中,该方案有着一定的参考价值。1.1 设计背景键盘和显示器是单片机系统中人机对话不可缺少的一部分。在许多智能仪表的设计中,多用 LED 数码管来显示。这是因为 LED 数码管驱动简单,成本较低并且能适应恶劣的环境。用于数码管显示驱动的芯片有很多种,常见的有MAX7219、MAX7221、ZLG7290、IMC7218B 以及 8279 等。这些专用芯片使用方便、功能教强,但价格偏高。本设计中采用的循环扫描的方式,充分利用
2、单片机快速的处理能力对各显示单元分时选通,只需普通的串行移位芯片,就可以达到显示驱动的目的。这种方法对单片机的 CPU 占用率相对较高,不适宜于 CPU 任务繁忙的场合,但是对那些功能相对简单,CPU 相对空闲的中小型系统非常实用,能够大大降低系统成本。1.2 系统主要功能该装置对偏离零点的水位进行检测,然后将带符号的水位值(低于或高于零点)用数码管显示出来,并通过双色发光二极管 LED 阵列对水位高度进行模拟显示。整个装置主要包含水位检测和显示两个部分,现将每部分功能说明如下:(1)水位检测:在0mm、10mm、25mm、50mm、80mm、120mm、160mm、240mm 共 15 点基
3、础上,检测水位偏离零点的大小。(2)水位显示:将上一步检测结果用数码显示出来,显示值以比实际水位小的最近点为准,例如:水位实际高度为 35mm,则数码管显示 25mm。同时,用 15 个竖直排列的双色 LED 阵列直观的模拟当前水位高度,当水位没有达到某点相应的 LED显示红色,达到或超过则显示绿色。当水位低于-240mm 时报警灯显示绿色,高于+240mm 时报警灯显示红色,当水位恢复正常值时报警灯熄灭。第 2 章 硬件设计基本原理与实现方法2.1 水位检测与数据采集南京工程学院自动化学院本科毕业设计(论文) 11本设计采用电接点水位检测方法,在每一个预定水位检测点处,将两个电极安装在容器壁
4、,使其一端能够与没过该点的水充分接触,另一端引出到容器外面同检测电路相连,两个电极等高度并间隔一定距离。当水位没有达到该检定点时,两个电极间电阻为无穷大;而一旦水位上升到该点高度,则两个电极同时没于水中,由于水的导电性,两个电极导通。通过检测两个电极是否导通就可以检测水位的高度了。对 15 个检测点相应有 15 个检测通道,本设计运用了两片 8 通道的多路开关CD4051,对各通道循环检测来实现数据采集。CD4051 是一种双向 8 通道的多路开关,可以 8 路选通输入,1 路输出;也可 1路输入,8 路选通输出。通过 3 为数据位 A、B、C 进行通道选择。禁止输入输出端INH 可以禁止和允
5、许工作。CD4051 具有低接通电阻和低关断电流的特点,其引脚定义如图 2.1 所示,真值表如表 2.1 所示。IN/OUTVDD 1 0 3 A B C16 15 14 13 12 11 10 901 2 3 4 5 6 7 84 6 OUT/IN 7 5 INH VEE VSS IN/OUT IN/OUT图 2.1 CD4051 引脚图表 2.1 CD4051 真值表输入状态选通通道INHIBIT C B A0 0 0 0 01 0 0 0 12 0 0 1 0南京工程学院自动化学院本科毕业设计(论文) 223 0 0 1 14 0 1 0 05 0 1 0 16 0 1 1 07 0 1
6、 1 1NONE 1 * * *尽管水位检测原理简单,但应用时却不能仅仅用每路的通断来判断水位是否没过该路的电极。实际上,水的电阻因水中所含成分不同有很大的差异,例如蒸馏水就不导电,就不能用这种方法来检测,而本设计所应用的场合经试验测得水阻在几K 到几十 K 不等;另一方面,空气电阻也不是无穷大,也跟其成分有关,例如饱和蒸汽的阻值就大概在 1M 欧左右。所以,不能通过判断单片机的数据采集引脚输入电平高低来判断水位是否到达某点,否则,对介于高、低电平之间的电平状态就无法做出判断,而这种情况是可能存在的。一个可靠的方法是对输入引脚的数据进行采样,然后将采样结果与一个阈值进行比较,从而得出正确的结论
7、。根据这个原理设计的水位检测电路如图 2.2 所示。从图中可以看出,通过 RD0RD3 口进行采样通道地址译码,在不同时刻选通 16 个通道中的 1 个。当水位上升到某一对电极高度时,相应通道的采样电压将会较低;若水位没有上升到电极高度,那么上拉电阻将会把采样值钳位到+5V 。RA0 口作为 A/D 采样通道输入口。RDA?iodesINBCOUTH9PLEV图 2.2 水位检测电路原理图2.2 数码管与 LED 显示模拟水位高度由 15 个双色发光二极管(LED)来完成,共分为 4 组。在某一特定时刻,每组 LED 与一个数码管一起被选通( 4 组 LED 对应 4 个数码管) ,两个 8位
8、的移位寄存器 741S164 级联,将单片机送出的 2 个字节串行数据转化为 16 位并行数据,分别送选通的 LED 和数码管。在不同时刻,系统对 4 组 LED 和数码管快速地循环扫描,就完成了面板显示的功能。南京工程学院自动化学院本科毕业设计(论文) 332.2.1 相关芯片简介显示部分用到的芯片包括移位寄存器 74LS164、数据缓冲器 74LS244 以及多路开关 CD4051。下面就 74LS164 和 74LS244 作简单介绍。 (1)移位寄存器 74LS164。74LS164 引脚定义如图 2.3 所示,起真值表如表 2.2所示,其功能是将外部输入的串行数据转化为 8 位的并行
9、数据输出具有锁寸功能。A、B 端为串行数据输入端,QA QH,CLK 为外部时钟输入端,CLR 为清零端。74LS164 在高电平输出时,为并行数据输出端其输出最大电流为 0.4mA;低电平输出时,其输出最大电流为 8mA,不足以驱动数码管或发光二极管正常工作,所以在本设计中外加数据缓冲器以增大驱动能力。图 2.3 74LS164 引脚图表 2.2 74LS164 真值表输入 输出CLEAR CLOCK A B QA QB QHL X X X L L LH L X X QA0 QB0 QH0H H H H QAn QGnH L X L QAn QGnH X L L QAn QGn注 QA0、
10、QB0、Q H0 为在稳态输入条件建立之前 QA 、Q B 和 QH 相应的电平;Q An 、Q Gn 为南京工程学院自动化学院本科毕业设计(论文) 44在最近的时钟转换前 QA 或 QG 的电平,表示移 1 位。(2)数据缓冲器 74LS244。74LS244 缓冲器常用作三态缓冲或总线驱动, +5V供点,其高电平时输出最大电流可达 15mA,低电平输出时最大电流可达 24mA,足以驱动数码管和 LED 工作。 74LS244 共 8 个输入输出通道,通过门控端 G1 和 G2 来选择其通断,其功能原理及引脚如图 2.4 所示。图 2.4 74LS244 内部结构及引脚图从图中可以看出,当引
11、脚 1G 为低电平时,输入通道 1A1A4 与输出通道1Y11Y4 连通;当引脚 1G 为高电平时则截止。同理引脚 2G 控制着输入通道2A12A4 与输出通道 2Y12Y4 的通断。2.2.2 显示部分工作原理首先介绍一下双色二极管的功能和用法。如图 2.5 所示,1 个双色二极管有 3 个引脚,引脚 1、2 均为信号“+”端,引脚 3 为 GND 端(信号“”端) 。引脚电平(TTL 电平)与 LED 显示颜色如表 1.6 所示。表 1.5 双色二极管功能表引脚 1 引脚 2 二极管状态0 0 熄灭0 1 绿色1 0 红色1 1 混合色图 2.5 双色二极管外观图南京工程学院自动化学院本科
12、毕业设计(论文) 55数码管及 LED 显示电路如图 2.6 所示,RC5 口作为串行数据的同步时钟端,与74LS164 的数据输入端相连;RC3 口作为串行数据的同步时钟端,与 74LS164 的同步时钟输出端均与 SPI 方式时端口一样;实际应用中,若不用 SPI 方式,而用模拟数据串行口时,可以用任何普通 I/O 端口代替) 。两片移位寄存器 74LS164 的并行数据输出端则分别与两片数据缓冲器 74LS244 的输入端相连,RD7 口作为数据缓冲器74LS244 的门控信号输出端,控制 74LS244 的通断。 IN7643210ABCOUTH9DE8GYVSLWRKQFPfgedc
13、bapy mr-图 2.6 数码管和 LED 显示电路每 4 个双色二极管和 1 个数码管一组,二极管的 8 个信号“+”端分别与第一片74LS244 的 8 位数据输出端相连,数码管的 8 位数据输入端分别与第二片 74LS244的 8 位数据输入端相连,每组二极管和数码管的 GND 端都与 CD4051 的 1 个输入通道相连,CD4051 的输出端与系统的“地”相连。 RE0RE1 口作为地址译码输出端口,用于多路开关 CD4051 的 4 路通道选择,每一时刻只有一组共 4 个二极管和 1个数码管被选通,其 GND 端同系统的“地”构成通路,其他的二极管与数码管则不能构成通路。每向 7
14、4LS164 传送完两个字节共 16 位数据,通过 RD7 口使 74LS244,将数据送到二极管和数码管的输入口,然后通过 RE0RE1 口打开一条通道,则被选通的数码管和二极管就会按照接收的数据进行相应的显示。不断地发送新数据并利用CD4051 循环的扫描 4 个通道,则所有的二极管和数码管 就会持续的发光显示。另外由一个双色二极管作为报警灯,RD5 口与二极管的引脚 1 相连,RD4 口与南京工程学院自动化学院本科毕业设计(论文) 66二极管的引脚 2 相连。2.3 工作过程将检测部分的 15 个电极置于要检测的水中,2 片多路开关 CD4051 对 15 个通道进行循环检测,当水位到达
15、某一电极高度时,由于水的导电性,该通道的采样电压就减小,通过 CD4051 将检测到的信号发送到 PIC 单片机,然后由 PIC 单片机向74LS164 传送数据,通过 RD7 口使 74LS244,将数据送到二极管和数码管的输入口,然后通过 RE0RE1 口打开一条通道,则被选通的数码管就会按照接收的数据进行相应的显示,被选通的二极管则会发光。不断地发送新数据并利用 CD4051 循环的扫描 4 个通道,则所有的二极管和数码管就会持续的发光显示。另外,PIC 单片机还控制着报警灯,单片机根据检测信号来控制 RD4 和 RD5 两个引脚的电平,从而控制报警灯显示不同的颜色,实现报警的功能。第
16、3 章 系统的软件设计本系统的软件的核心是两个不断循环执行的中断程序:TMR0 中断用于驱动数码管和 LED 显示:TMR1 中断用于采集水位值并且将采集结果送缓冲寄存器供显示部分读取,同时对采集结果进行简单的分析,判断其是否超过水位上限或下限,若南京工程学院自动化学院本科毕业设计(论文) 77超过则点亮相应的报警灯。整个软件部分大体可分为初始化程序、TMR1 中断服务程序、数据转化子程序、TIMR0 中断服务程序 4 个部分,以下分别加以描述。31 初始化程序初始化程序位于主程序开始部分,主要对 3 个部分进行初始化:I/0 端口、TMR1 和 TMR0 各部分初始化步骤如下描述,不再给出流
17、程图。1.I/O 端口方向控制寄存器A/D 输入端口 RA0 设置为输入方式,串行时钟及串行数据输出端口 RC,采样通道地址译码端口 RD、显示部分地址译码及报警输出端口 RE 均设置为输出方式。2. TIMR1 初始化 TIMR1 初始化步骤如下:将第一位外设中断标志寄存器 PIR1 中的中断标志位 TMR1IF 清零。将第一位外设中断屏蔽寄存器 PIE1 中的中断允许位 TMR1IE 置位。通过 TMR1 中断控制器 I1CON 设置时钟及分频比等给 TMR1 计数器 TMR1H、TMR1L 赋初值。将中断控制寄存器 INTCON 中的全局中断屏蔽位 GIE 置位。将外设中断屏蔽位 PEI
18、E 置位。3. TIMR0 初始化 TIMR0 初始化步骤如下:通过选项寄存器 OPTIONREG 设置 TMR0 的分频比及时钟。将 INTCON 寄存器中的 TMR0 中断标志位清零并将中断屏蔽位置位。给 TMR0 计数器赋初值。32 TMR1 中断服务程序设计系统的水位值刷新时间为 1s,即单片机每秒钟对采样通道一遍 A/D 转换。软件上则设定 TMR1 定时器每秒产生一次中断,执行数据采样程序,从最高水位采样通道向下执行,并不断将每次采样结果与系统设定的门限值比较,当检测到水位超过某一对电极时,则退出采样程序。接下来判断水位是否越限,若是则点亮相应的报警灯,否则使报警灯灭。然后调用数据
19、转换子程序,将水位采样结果转化为相应数码管和 LED 显示段码值,存入显示数据缓冲寄存器。由于 PIC 单片机的中断矢量只有一个,而本设计用到两个中断,故而在中断服务程序入口处,需要对中断源进行判断,这是通过判断相应的中断标志寄存器俩实现的。设置 TMR1 定时器分频比为 1:8,采用内部时钟源,系统采用 2M 晶振。那么南京工程学院自动化学院本科毕业设计(论文) 88TMR1 的时钟脉冲周期为 2 s,由于分频比为 1: 8,则每 16 s 计数一次,1s 需要计数 62500 次,即从计时开始到 62500 个计数周期后,TMR1 寄存器达到上限65536 并产生溢出,所以 TMR1 寄存
20、器初始值为 65536-62500=3036,即0BDCH。TMR1 中断服务程序流程图如图 3.7 所示。图 3.7 TMR1 中断服务程序流程图33 数据转换子程序在进行水位检测后,会产生一个水位的高度值(设为 HEIGHT) ,但它并不是一个真实的水位值,只是一个标志水位高度的通道号,其值为 015 中的某个数,分别表示没有水以及 15 种水位高度共 16 种情况。故而需要将其转化为 LED 和数码管的实际显示段码值。表 3.6 列出了高度值 HEIGHT、LED 段码值 LED1LED4 和数码管显示数据 SEG1SEG4d 的对应关系,表 3.7 则为数码管的七段码值与显示符号对应关
21、系。南京工程学院自动化学院本科毕业设计(论文) 99表 3.6 高度值与显示段码对照表HEIGHT LED1 LED2 LED3 LED4 SEG1 SEG2 SEG3 SEG40 OFOH OFOH OF0H OF0H 1 0E1H 0F0H 0F0H 0F0H 2 4 62 0C3H 0FOH 0F0H 0F0H 1 6 03 87H 0F0H 0F0H 0F0H 1 2 04 0FH 0F0H 0F0H 0F0H 8 05 0FH 0E1H 0F0H 0F0H 5 06 0FH 0C3H 0F0H 0F0H 2 07 0FH 87H 0F0H 0F0H 1 08 0FH 0FH 0FOH
22、 0F0H 09 0FH 0FH 0E1H 0F0H 1 010 0FH 0FH 0C3H 0F0H 2 511 0FH 0FH 87H 0F0H 5 012 0FH 0FH 0FH 0F0H 8 013 0FH 0FH 0FH 0E1H 1 2 014 0FH 0FH 0FH 0C3H 1 6 015 0FH 0FH 0FH 87H 2 4 0注 空白处表示不显示任何数据。表 3.7 数码管七段码显示符号 共阳极七段码 共阴极七段码 显示符号 共阳极七段码 共阴极七段码0 0C0H 3FH 6 82H 7DH1 0F9H 06H 7 0F8H 07H2 0A4H 5BH 8 80H 7FH3
23、 0B0H 4FH 9 90H 6FH4 99H 66H 0BFH 40H5 92H 6DH 全灭 FFH 00H有 3 种方法对 LED 和数码管显示缓冲寄存器写入数据:第一钟是采用查表方法,将各个高度值对应的数据预先存入一块缓冲区内,通过对指令指针赋值来访问特定数据单元,返回转换后的数值;第二种是采用逐个比较的方法,将采样结果与南京工程学院自动化学院本科毕业设计(论文) 1010015 的数逐个比较,若相等则向缓冲区赋相应的值;第三种方法是根据表的特征来赋值,例如当 HEIGHT8 时,LED1 的值为 0FFH,SEG2 没有显示。很显然,第二种、三种方法比较费时间,第一种方法虽然程序代
24、码量较大,但执行起来速度快,本设计采用第一种方法,具体可参见查表子程序的程序代码。34 TMR0 中断服务程序TMR0 中断用于数码管及 LED 显示,每次中断将两个字节的数据串行发送至移位寄存器,后经 74LS244 驱动 1 组 LED 和 1 个数码管发光。由于每个 LED 或数码管两次被选通的时间最大不能超过 100ms(利用人的视觉暂留现象,否则就会出现闪烁) ,加之 TMR1 中断可能占用的时间,所以每次 TMR0 中断溢出时间不能太长;另一方面,TMR0 中断溢出时间又不能太短,必须保证串行发送完毕。综合这两个方面因素,将TMR0 溢出时间设为 10ms。TMR1 寄存器初始值计
25、算方法与 TMR1 初始值计算方法类似,只是分频比设为1:128,计算结果为 0D9H。图 3.8 所示为 TMR0 中断服务程序流程图。南京工程学院自动化学院本科毕业设计(论文) 1111图 3.8 TMR0 中断服务程序流程图35 程序清单及注释;*;水位检测仪 程序清单;程序文件名为: Leval_TEST.ASM;*LIST P=16F877INCLUDE P16F877.INCSTATUS EQU 03H ;定义状态寄存器地址南京工程学院自动化学院本科毕业设计(论文) 1212PCL EQU 02H ;定义程序计数器低 8 位指针地址PORTA EQU 05H ;定义端口 RA 的数
26、据寄存器地址PORTC EQU 07H ;定义端口 RC 的数据寄存器地址PORTD EQU 08H ;定义端口 RC 的数据寄存器地址PORTE EQU 09H ;定义端口 RC 的数据寄存器地址TRISA EQU 85H ;定义端口 RA 的方向控制寄存器地址TRISD EQU 87H ;定义端口 RC 的方向控制寄存器地址TRISE EQU 88H ;定义端口 RC 的方向控制寄存器地址INTCON EQU 89H ;定义中断控制寄存器地址T1CON EQU 10H ;定义 TMR1 中断控制寄存器TMR0 EQU 01H ;定义 TMR0 寄存器地址PIR1 EQU 0CH ;定义第一
27、外设中断标志寄存器地址PIE1 EQU 8CH ;定义第一外设中断屏蔽寄存器地址ADRESH EQU 1EH ;定义 ADC 结果寄存器高子节地址ADCON0 EQU 1FH ;定义 ADC 控制寄存器 0 地址ADCON1 EQU 9FH ;定义 ADC 控制寄存器 1 地址T1CON EQU 10H ;定义 TMR1 控制寄存器地址TMR1L EQU 0EH ;定义 TMR1 低字节地址TMR1H EQU 0FH ;定义 TMR1 高字节地址SSPBUF EQU 13H ;定义 SPI 收发缓冲寄存器地址SSPCON EQU 14H ;定义同步控制串口寄存器地址SSPSR EQU 94H
28、;定义同步串口状态寄存器地址;=变量=TEMP EQU 20H ;定义暂存寄存器HEIGHT EQU 22H ;定义采样结果寄存器,用以标志水位高度SELECTCOUNT EQU 23H ;定义翻转计数器,用以标志选通的显示通道ADCOUNT EQU 24H ;定义翻转计数器,用以标志选通的采样通道TXLED EQU 25H ;LED 数据串行发送暂存寄存器TXDATA EQU 6H ;数码管数据串行发送暂寄存器LED1 EQU 29H ;发光二极管显示数据寄存器 1LED2 EQU 30H ;发光二极管显示数据寄存器 2LED3 EQU 31H ;发光二极管显示数据寄存器 3LED4 EQU
29、 32H ;发光二极管显示数据寄存器 4南京工程学院自动化学院本科毕业设计(论文) 1313SEG1 EQU 33H ;数码管显示数据寄存器 1SEG2 EQU 34H ;数码管显示数据寄存器 2SEG3 EQU 35H ;数码管显示数据寄存器 3SEG4 EQU 36H ;数码管显示数据寄存器 4;=常量=TMR1LB EQU 0DCH ;定义 TMR1 低字节寄存器初始值(定时 1s)TMR1HB EQU 0BH ;定义 TMR1 高字节寄存器初始值TMR0B EQU 0D9H ;定义 TMR0 寄存器初始值(定时 10ms)GATEVALUE EQU 07FH ;定义采样结果门槛值,用以
30、区分水和空气阻值;*复位矢量和中断矢量*ORG 000HNOP GOTO MAIN ORG 004H;*中断服务程序*BTFSC PIR1,0 ;检测是否是 TMR1 中断GOTO TMR1INT ;是,则转 TMR1 中断BTFSC INTCON,2 ;否,检测是否是 TMR0 中断 GOTO TMR0INT ;是,则转 TMR0 中断REFIE ;否,中断返回;=TMR1 中断服务程序=TMR1INT BCF PIR1,0 ;清 TMR1 中断标志位 BCF STATUS,5 MOVLW 0FHMOVWF ADCOUNT ;通道数送翻转计数器TESTLOOP DECF ADCOUNT,0
31、IORLW OFOH ;屏蔽高 4 位ANDWF PORTD,1 ;输出到 CD4051 通道译码端,以选通某一采样通道BSF STATUS,5 南京工程学院自动化学院本科毕业设计(论文) 1414MOVLW 41H MOVWF ADCON0 ;选择系统时钟 8 分频,通道 0,关闭 AD 启位NOP ;等待采样值稳定NOP ;等待采样值稳定NOP ;等待采样值稳定BSF ADCON0,2 ;启动 AD 采样ADLOOP NOP BTFSC ADCON0,2 ;检测采样是否结束GOTO ADLOOP ;否,继续检测MOVF ADRESH,0 ;是,读取采样结果高 8 位MOVWF HEIGHT
32、 ;将当前通道数送 HEIGHTDECFSZ ADCOUNT,1 ;当前通道数减 1 后是否为 0GOTO TMR1NEXT2 ;退出采样循环TMR1NEXT1 MOVF TEMPSUBWF GATEVALUE,0 ;门限值减去采样结果BTFSC STATUS,0 ;检测是否产生借位GOTO TESTLOOP ;否,继续进行下一个通道采样TMR1NEXT2 BCF PORTD,4 ;是,熄灯下限报警灯BCF PORTD,5 ;熄灯下限报警灯BCF STATUS,0 ;清借位标志位MOVLW 15H SUBWF HEIGHT ;采样结果与上限值比较BTFSS STATUS,0 ;检测借位标志位是
33、否为 1GOTO TMR1NEXT3 ;否,转下限检测BSF PORTD,5 ;是,点亮下限报警灯TMR1NEXT3 BCF STATUS,2 ;清零标志位是否为 1MOVLW 00H SUBWF HEIGHT ;采样结果与下限比较BTFSS STATUS,2 ;检测零标志位是否为 1GOTO TMR1NEXT4 ;否,转采样结果转换BFS PORTD,4 ;是,点亮下限报警灯TMR1NEXT4 CALL ADRESCON ;调转采样结果转换子程序MOVLW 04H 南京工程学院自动化学院本科毕业设计(论文) 1515MOVWF SELECTCOUNT ;将显示通道选择翻转计数器赋初值MOVL
34、W TMR1LB MOVWF TMR1L ;写入 TMR1 寄存器低字节数MOVLF TMR1HB MOVWF TMR1H ;写入 TMR1 寄存器高字节数RETFIE ;中断返回;=TMR0 中断服务程序=TMROINT BCF INTCON,2 ;清 TMR0 中断标志位BCF STATUS,0DECF SELECTCOUNT,0MOVWF TEMP ;将翻转计数器内容减 1 送 TEMP 寄存器RLF TEMP,0 ;TEMP 寄存器内容乘以 2,作为查询显示数据;的偏移地址量ADDWF PCL,1 ;将地址偏移量与程序计数器值叠加MOVF LED1 GOTO TMR0NEXT1MOVF
35、 LED2GOTO TMR0NEXT1MOVF LED3GOTO TMR0NEXT1MOVF LED4TMR0NEXT1 MOVWF TXLED ;将本次显示的 LED 数据送 LED 发送寄存器RLF TEMP ;TEMP 寄存器内容乘以 2,作为查询显示数据;的地址偏移量ADDWF PCL,1 ;将地址偏移量与程序计数器值叠加MOVF SEG1 GOTO TMR0NEXT2MOVF SEG2GOTO TMR0NEXT2MOVF SEG3GOTO TMR0NEXT2MOVF SEG4南京工程学院自动化学院本科毕业设计(论文) 1616TMR0NEXT2 MOVWF TXDATA ;将本次显示
36、的数码管数据送数码管发送;寄存器BCF PORTD,7 ;清 74LS244 使能位,暂时禁止数据输出;显示BSF STATUS,5 CLRF SSPSTAT ;SPI 方式清 SMP 位,CKE 位和 BF 位,在;脉冲上沿移位输出数据跳MOVLW 30H MOVWF SSPCON ;允许串口工作,时钟频率为系统时钟1/4MOVF TXLED,0 ;将第一个待发送的字节送缓冲寄存器CALL SPITX ;调发送完成查询子程序DECF SELECTCOUNT,0 ;通道寄存器减 1MOVWF PORTE ;选通待显示的通道BSF PORTD,7 ;置 74LS244 使能位,允许数据输出显示D
37、ECFSZ SELECTCOUNT,1 ;通道寄存器减 1,并检测是否为 0GOTO TMR0NEXT3 ;否,转 TMR0NEXT3MOVLW 04H ;是,重新对通道寄存器赋初值MOVWF SELECTCOUNT TMR0NEXT3 MOVLW TMR0BMOVWF TMR0 ;TMR1 寄存器赋初值RETFIE ;中断返回;*主程序*MAIN BSF STATUS,5MOVLW 01HMOVWF TRISA ;置 RA0 口为输入方式MOVLW 00HMOVWF TRISC ;置 RC 口为输出方式MOVWF TRISC ;置 RD 口为输出方式MOVWF TRISC ;置 RE 口为输
38、出方式;=TMR0 初始化=南京工程学院自动化学院本科毕业设计(论文) 1717MOVLW 07HMOVWF OPTIONREG ;分频器给 TMR0,分频比 1:128,选用;系统时钟BCF STATUS,5MOVLW 0E0HMOVWF INTCON ;开全局中断,允许响应 TMR0 及第二梯;队中断;请求(TMR1 中断) ,TM0 中断标志清零MOVLW TMR0BMOVWF TMR0 ;TMR0 寄存器赋初值;=TMR1 初始化=BSF STATUS,5MOVLW 01H MOVWF PIE1 ;允许 TMR1 中断BCF STATUS,5MOVLW 00HMOVWF PIR1 ;T
39、MR1 中断标志位清零MOVLW 30H MOVWF T1CON ;分频比为 1:8,选用内部时钟源MOVLW TMR1LBMOVWF TMR1L ;TMR1 寄存器低字节赋初值BSF T1CON,0 ;启动 TMR1 定时MOVLW 04H MOVWF SELECTCOUNT ;显示通道寄存器赋初值MOVWF MAINLOOP;*SPI 发送完成查询子程*SPITX MOVWF SSPBUFBCF STATUS,6SPILOOP BSF STATUS,5BTFSS SSPSTAT,BF ;查询发送是否完成GOTO SPILOOP ;否,继续查询BCF STATUS,5 ;是,选择 BANK0
40、MOVF SSPBUF ;将缓冲器的数据读出,不管数据是否南京工程学院自动化学院本科毕业设计(论文) 1818;有用RETURN ;子程序返回;*数据转换子程序*ADRESCON;=LED1 赋初值=MOVF HEIGHT,0CALL LED1CONMOVWF LED1;=LED2 赋初值=MOVF HEIGHT,0CALL LED2CONMOVWF LED2;=LED3 赋初值=MOVF HEIGHT,0CALL LED4CONMOVWF LED4; =LED4 赋初值=MOVF HEIGHT,0CALL LED4CONMOVWF LED4;=SEG1 赋初值=MOVF HEIGHT,0CALL SEG1CONMOVWF SEG1;=SEG2 赋初值=MOVF HEIGHT,0CALL SEG2CON南京工程学院自动化学院本科毕业设计(论文) 1919MOVWF SEG2; =SEG3 赋初值=MOVF HEIGHT,0CA