Archive for ‘尚未分类’ Category

November 24, 2009

  本程序利用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
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时需要关闭一切中断
Tags: ,. 162 views
November 18, 2009

  使用PIC18单片机的ADC转换模块对RA0口输入的模拟电压信号进行转换,然后通过PORTD端口输出,而这里与PORTD对应引脚相连接的是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
list P = 18F452 ;指明单片机型号为PIC18F452
#include P18F452.INC ;包含一个头文件,其中定义了一些端口及一些特殊寄存器的地址
 
	org	0000h  	;PIC上电时从0000h单元开始执行
	goto	main  	;跳转到主程序
	ORG	0008H  	;中断向量入口
	BTFSS	PIR1, ADIF 	; AD转换完成中断
	RETFIE
	GOTO	AD_ISR
 
	ORG	0030H  	;主程序定位
MAIN
	CLRF	TRISD  	;设定D口方向为输出
	CLRF 	PORTD 	;设定C口方向为输出
	BSF 	TRISA, 0 	; 使用AN0输入
	MOVLW	81H 	;FOSC/32, AN0, 开启
	MOVWF	ADCON0
	MOVLW	0EH 	;左对齐,AN0为模拟输入
	MOVWF	ADCON1 	;VDD & VSS为参考电压
	BCF 	INTCON, TMR0IF
	BCF 	PIR1, ADIF 	;清AD中断标志位
	BSF 	PIE1, ADIE 	;开AD中断
	BSF 	INTCON, PEIE 	;开外围中断
	BSF  	NTCON, GIE 	;开总中断
	MOVLW 	C7H 	;TMR0 8位,分频比为1:256
	MOVWF	T0CON
LOOP
	CALL	DELAY
	BSF  	DCON0, GO 	;开启 A/D转换
	GOTO	LOOP
 
DELAY
 
	BTFSS  	NTCON, TMR0IF 	; 等待延时,采样保持
	GOTO  	DELAY
	BCF  	NTCON, TMR0IF
	RETURN
 
AD_ISR ;AD转换完成时调用的中断服务程序,将转换结果输出
	ORG 	0200H
	MOVFF	ADRESH, PORTD 	;显示转换结果
	BCF 	PIR1, ADIF 	;清AD中断标志位
	RETFIE
END 	;程序结束
Tags: ,. 92 views
November 12, 2009

海明码的目的是能够纠正一位误码。假设信息码共有 n 位,海明码共有 h 位,那么总共的码长为 n + h 位。为能检测出 n + h 位编码中其中一位的错误,海明码必须能够表示至少 n + h + 1 种状态,其中 n + h 种表示 n + h 位编码中有一位错误,另外还需要一种来表示整个编码正确无误。则海明码的长度需要满足下列关系:

Tags: . 161 views
November 4, 2009

  PIC的汇编实在诡异,有点被颠覆的感觉,原来汇编指令还可以这么来设计,原来汇编指令怎么设计都可以。最OOXX的一条指令就一个实现短转移的指令叫做BRA,意为BRAanch,看到这条指令的时候,我都诧异了,奶罩能做什么?哇塞!居然还能跳转!?奶罩居然可以无条件跳转?!Orz……另外PIC指令把单词缩写运用的淋漓尽致,譬如指令BTFSS,是一条位测试加条件跳转指令:BTFSS = Bit + Test + FileRegister + Skip + Set,用法:BTFSS R1, 0003h, 寄存器R1的第3位为1时跳过下一条指令。真是震撼!

  最后附上PIC18的中断体系硬件结构图,出自陈育斌老师的手笔:

Tags: ,. 190 views
October 27, 2009

  图示是PIC 18单片机中定时/计数器的结构图,PIC18是一种8位的单片机,但它的定时/计数器(的寄存器)却是16位的,所以为其装初值的时候就要分高低字节分别装载。于是问题就来了,由于定时计数器一般是连续工作,需要经常进行重装,如果对一个正在工作的定时计数器进行重装的话,就会产生高低字节不同步的状态,这是一种潜在的错误,尽管这种错误发生的概率很小。为了防止这种错误的发生,PIC单片机设计者采用了上图所示的双缓存结构。其中,TMR0H’和TMR0L组成了一个真正的定时计数器,而TMR0H是一个临时寄存器只有TMR0L的写信号有效时它才能被装入TMR0H’。当需要重装定时器时,首先应该将16位定时/计数的初值的高8位装入TMR0H临时寄存器,然后在向TMR0L写入低8位时由于TMR0L写信号有效,TMR0H也被同步地装入TMR0H’。这样,定时计算器就可以正确的工作,这就是硬件的双缓冲。

Tags: ,. 14 views
October 15, 2009

  下面的图片是一个LED显示屏,显示的这个等式明显是错误的,原因是某个显示屏的像点坏了,你能找出来吗?我找了10分钟,最终还是没看出来。
break dot
  答案其实并不简单……坏点……并不都是该亮的没亮,还有可能是不该亮的却亮了……

Tags: ,,. 8 views

sunset

Tags: . 12 views
September 5, 2009

  操作系统为每一个进程维护着一个虚拟的地址空间,这个地址空间的大小通常取决于系统的地址线数目,比如在32位系统中,虚拟地址空间的返回就是0×00000000~0xFFFFFFFF,大小共4G。通常操作系统会划分出一部分来专门供内核使用,而不允许用户进程直接访问。Linux内核占用4G中高地址的1G,即0XC0000000~0XFFFFFFFF,windows内核通常占用高地址的2G空间,但也可配置成1G。进程的代码、数据以及共享库等资源终究是要放在物理内存中才能被访问的,操作系统在建立用户进程时,会为其建立各自独立的虚拟地址空间,然后将各自的数据段、代码段、BSS段等映射到这个地址空间,并为其初始化堆、栈等必须的资源。另外,操作系统还将虚拟空间和物理空间都划分成大小相等的页,把进程数据所在虚拟地址空间的各个虚拟页面映射到其真正被加载的物理页面,这种映射是全相联方式的,即任何一个虚页可以被映射到任何一个实页。

Tags: ,. 10 views
September 4, 2009

  上PIC课讲到信号监测时,老师做过这样一个比喻:说同学们,10分钟后咱们到教室外面集合,对于“查询式”同学,他会不停地数数,直到600,“中断式“会定一个闹表,当然啦,我可以该干嘛干嘛,大家都走了我再走,多省资源啊哈哈!

  话说今儿晚上在运动常跑步,遇到一查询式的哥们儿。我跑第一圈从他身边经过,冲我问:
  - 几点啦?
  - ……八点半……
  - 三十几?
  - ……三十四……
  - 四十四?四十四还是三十四?
  - …………我无语……继续跑……
  又问:
  -哎哥们儿,几点了?
  -三十五!

  若干圈之后,
  -嗨美女,几点了?
  -没带表!

  第八圈,
  -A,几点了?
  -9点。
  -哦……

  啊然后这哥们儿从跑道边栏杆上摘下一个包,把手机掏出来,走出运动场……

Tags: ,. 5 views
August 17, 2009
Linux Air

对其它所有航空公司都不满的员工决定离开他们自己的航空公司。他们开始自己建造飞机,机票柜台,以及自己铺设飞机跑道。他们只用很少的费用给你提供可打印的机票,但你完全可以自己下载下来打印机票。

当你登机的时候,会有人递给你一个座位,四个螺栓,一个扳手和一本“安装座位-HOWTO.html”手册。一但安装好了,可随意调整或更改的座位可能让你相当地舒服,从飞机离开到目的地,其几乎不会发生一个错误,而且,飞机过程中的飞行餐非常不错。你会想去告诉选乘别的航空公司的乘客你那完美的经历,但你所能得到的回答是,“乘座飞机还要必需要去安装自己的座位?”。

Tags: . 6 views
Page 2 of 41234