本程序利用PIC18单片机实现了对EEPROM的读写。应用背景是”汽车里程表”,简单介绍下程序功能和流程。
单片机接受来自RA4管脚的计数脉冲信号,应用中这个脉冲信号通常由一个传感器来产生,计数脉冲被设定为上升沿触发。计数器溢出时,需要更新一个用于存储当前里程的RAM寄存器单元COUNT,可以理解为车轮转了一定圈数后,里程表的增加一定的里程数。
RB0管脚用来接收一个外部中断信号,接收到中断信号后,在中断服务程序中将COUNT的值即当前里程数保存至EEPROM的00H单元。这样可以配合外部电路实现当单片机掉电时自动保存里程表数值的功能,即汽车熄火时保存里程表,以减少对EEPROM的读写次数。
单片机启动时,首先应该到EEPROM的相应单元读取里程表的当前值,并在此基础上进行累加。
程序中为了调试方便,还将COUNT的数值同步地通过8个LED以二进制形式较直观地显示了出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | list P = 18F452 #include P18F452.INC TMR0B EQU D'253' COUNT EQU 0x10H ORG 0000H ;PIC上电时从0000h单元开始执行 GOTO MAIN ;跳转到主程序 ORG 0008H GOTO INT0_ISR ;中断向量入口 ORG 0030H ;主程序定位 MAIN CLRF TRISD ;设定D口方向为输出 CLRF PORTD ;设定C口方向为输出 BSF TRISA, 4 ; 使用RA4做为计数输入 BSF INTCON, GIE ;开全局中断 BCF INTCON, INT0IF ;清INT0中断标志 BSF INTCON, INT0IE ; 开INT0中断 BSF TRISB, INT0 ; 设定RB0即INT0脚为接收(输入)状态 MOVLW 68H MOVWF T0CON ; 设定计数器TMR0为8位计数,上升沿触发,分频比1:1 MOVLW 0x00 MOVWF EEADR ; 装载EEPROM的地址00h CALL READ_EE ; 读入EEPROM中00h单元的原始数据,即计数初值,保存到WREG MOVWF COUNT MOVWF PORTD ; 输出到PORTD(连接了8个LED) LOOP BCF INTCON, T0IF ; 清TMR0中断标志 MOVLW TMR0B MOVWF TMR0L ; 装入计数初值 253 BSF T0CON, TMR0ON ; 启动计数器 TEST BTFSS INTCON, T0IF ; 检测TMR0是否溢出 GOTO TEST INCF COUNT, F ; 计数加一 MOVFF COUNT, PORTD ; 输出,显示 GOTO LOOP WIRT_EE ; 写EEPROM BCF EECON1, EEPGD BCF EECON1, CFGS ; 设定EECON1控制寄存器 BSF EECON1, WREN ; EEPROM写使能 BCF INTCON, GIE ; 写EEPROM时需要关闭一切中断 MOVLW 0x55h ; MOVWF EECON2 MOVLW 0xAAh MOVWF EECON2 BSF EECON1, WR ; 经典的五指令序列,将EEDATA写入EEPROM BSF INTCON, GIE ; 开全局中断 BCF EECON1, WREN ; 提前关闭写使能 RETURN READ_EE ; 读EEPROM BCF EECON1, EEPGD BCF EECON1, CFGS BSF EECON1, RD NOP MOVF EEDATA, W ; 将读出的结果写入W并返回, RETURN INT0_ISR ; 外部中断int0服务程序,可以利用外部电路, ; 实现掉电时将当前计数值写入EEPROM BTFSS INTCON, INT0IF ; 重新测试溢出位,防止干扰信号触发中断 RETFIE BCF INTCON, INT0IF MOVLW 0x00h MOVWF EEADR MOVFF COUNT, EEDATA CALL WIRT_EE RETFIE ; 中断返回 END |
662e438d

No Comments Now!
Be the first to comment on this entry.