本程序利用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

Tags: ,.
Home

No Comments Now!

Be the first to comment on this entry.

Leave a comment

Name(required)
Mail (required),(will not be published)
  10 + 5 = ?
Please leave these two fields as-is:
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
URLs must be fully qualified (eg: http://www.dutor.net),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.