不错,学习了.
就我以前的经验来了,最好的学单片机方法是:
1.编程结构----这是最重要的.
好的编程结构,它能使你调试非常方便,差的编程结构,使你很累.
比如,我的编程结构是这样的:
;**************程序开始*****************
code .section 'code'
org 000h
jmp reset
org 004h ;外部中断0
jmp ext0_interrupt
org 008h ;定时器0中断
jmp t0_isr
org 0ch ;定时器1中断
jmp t1_isr
org 10h ;A/D中断,没用到,返回
reti
reset:
snz STATUS.4 ;PD位(位4)=0,则是系统上电或执行CLR WDT, 执行HALT则置1.
jmp INITIAL ;是上电,则执行初始化操作
mov a,00000111b
mov wdts,a
mov A,00000000B ;晶振采用内部的RC(4MHZ)---HIRC,定时器timer0
mov CTRL0,A
mov a,10000101b ;允许WDT中断---WDT时钟来源于内部的RC振荡器,下降沿触发中断
mov CTRL1,A
mov a,11111111b
mov PAC,A
.
. ;其它I/O内容
.
jmp OKWORK ;执行halt指令后,还要判断是WDT是在sleep模式溢出(STATUS.5=1)还是正常模式溢出(STATUS.5不定)
INITIAL:
mov a,00000111b
mov wdts,a
mov A,00000000B ;晶振采用内部的RC(4MHZ)---HIRC,定时器timer0
mov CTRL0,A
mov a,10000101b ;允许WDT中断---WDT时钟来源于内部的RC振荡器,下降沿触发中断
mov CTRL1,A
mov a,11111111b
mov PAC,A
mov a,11111111b
mov PAPU,A
mov a,00101011b
mov PAWK,a
mov a,11111111b
mov PA,A
.
. ;其它I/O内容(注意:与上面略有区别)
.
OKWORK:
snz status.5 ;PD位(位5)=0,则是系统上电或执行CLR WDT, 执行HALT则置1.
jmp inital_ram ;为0,则执行初始化
jmp sleep_man ;为1,则进入sleep状态
inital_ram:
mov a,40h ;清ram变量
mov mp0,a
clrram_loop:
clr iar0
siz mp0
jmp clrram_loop ;clr ram
mov a,256-125 ;125uS中断一次(4MZH,分频率为4)
mov tmr0,a
mov a,92h
mov tmr0c,a
mov a,0ffh
mov tmr1,a
mov a,01011000b
mov tmr1c,a
mov a,00001111b ;开外中断,定时中断,全局中断
mov intc0,a
clr intc1
main:
mov a,t_125us
sub a,64
snz c ;到了8mS吗
jmp main ;没到,则跳到main
main1:
clr t_125us ;到了,则清t_125us变量
snz halt_b ;halt_b 等于1则进入睡眠状态
jmp $+2 ;为0则正常执行指令
jmp sleep_man ;睡眠管理
clr wdt ;喂狗
call ic1620_init ;HT1621初始化
call ic1620_drive ;HT1621驱动
call dis_translate ;LCD的段码转换
call key_scan_man ;按键扫描管理
call led_out_man ;按键led灯输出管理
call open_inspection_man ;马达开门行程开关检测管理
call close_inspection_man ;马达关门行程开关检测管理
call voltage_chk ;电池电压检测管理
call time_man ;时间管理
call motor_man ;马达驱动管理(开门)
call buz_work ;蜂鸣器管理
call baojing_man ;报警输出管理
call HM_inspect_man ;换码开关管理
call shuiyin_man ;水银开关检测管理
call key_deal_man ;按键处理管理
call disp_man ;显示管理
call door_man ;门行程开关管理
call auto_man ;自动锁门管理(关门)
call orange_key_led_man ;橙色键灯管理
call blue_key_led_man ;蓝色键灯管理
jmp main
按键扫描,蜂鸣器管理等子程序,一般项目,我基本上copy过来,不用修改.
子程序一个个调好(有的子程序是独立的,故易调好.有的子程序要依靠的其它子程序才能调好.如下面举过例子,其中的变量lock_time来源于按键处理管理子程序.
;******************************************
;*********************马达驱动(开门)管理***
motor_man:
sz lock_time ;有马达驱动信号吗?
jmp lock_On_operation ;有,则ON马达
clr dt2 ;没有,则关闭马达
clr f_magnet
ret
lock_on_operation:
sz position_open
jmp off_lock_operation
set dt2 ;驱动马达
ret
off_lock_operation:
clr dt2
clr f_magnet
ret
2.选中最适合的单片机类型.----- 之前我了解过pic,C51,合泰等,都花一点时间弄了一下(含买仿真器等等),最后比较后,才选中合泰MCU.为啥?
a.仿真器最方便容易使用.
b.性价比高.
c.品质不错.
d.易买到
e.学习材料多. |