||
在坛子里呆了近5、6年了,蒙各位大虾关照,获益不少。最近公司招了几个应届毕业生,打算培养成程序员,看了他们刚写的程序,感想颇多。回想几年前自己刚涉及单片机领域,也和他们一样,从编程角度来说,不知如何下手,心中所有无非就是从书本上检来的几个程序片断,有幸碰到几个经验丰富的师兄给予指点,至今印象尤深。谈点个人感受,希望对刚出校或刚涉及的朋友有所帮助。同时拜托各位大虾不要啪的太厉害
个人觉得,从编程角度来讲,养成一个良好的编程习惯尤为重要。特别是asm编程,由于其可读性差,而考虑到开发效率,诼行诼断写注释也不是可取之去。为了提高编程效率,尤其是从后期维护、完善工作等角度来考虑,一个好的文件头是程序成功的基石。文件头的要求可根据各自的工作习惯、需求来定,但有几点必须考虑:程序主替款架、功能,程序修改记录等,尤其修改记录尤为重要,因为程序修改过程中容易顾此失彼,有一个详细的修改记录,就是以后追查bug的保证。
下面贴两个个人所做项目的文件头,仅供参考:
;====================================================
;SUMMARY:
;本程序为68HC08JL3开发,配接09NV遥控器
;掉电记忆功能
;支持TCL挂壁式分体机/落地式分体机
;导风电机控制:挂壁式分体机为步进电机/落地式分体机为同步电机
;室内电机控制:PG电机/抽头电机选择
;显示模式控制:3LED/3LED+2个8选择
;多款机型跳线:步进角度预留,PG风速预留
;====================================================
;INFORMATION:
;COPYRIGHT: K&LWEI ELECTRONIC TECHNOLOGICAL CO.,LTD
;MICROCOMPUTER: MOTOROLA 68HC08JL3
;TIME: 2003-8-1
;DESIGNER: XIAOCAN
;EXAMINATIONER: PANMEIHONG
;====================================================
;signal deal:
;蜂鸣器发声 PWM方式:(空闲时buzzer.ptd置为低电平,保护三极管)
; TIME_INT FREQUENCY==250uS
; OVERFLOW FREQUENCY==125uS
; 占空比 50%
;PG驱动 PWM方式:(溢出中断不切换电平)
; 高位在中断中计数,TCH1L=低位计数+TCNTL
;红外接收/过零检测/风机反馈均采用查询方式
; 增强抗干扰能力
;93C46采用机型校验码$10
;====================================================
; 68HC08JL3
; ------------------------
; 遥控接收 rader | 1 /IRQ /RST 28 | RESET
; ? | |
; run||164位选(个位)| 2 PTA0 PTA5 27 | 过零检测zero||内风机高
; | |
; | 3 VSS PTD4 26 | 蜂鸣器BUZZER
; | | 显示跳线
; | 4 OSC1 PTD5 25 | 内风机驱动ifan||内风机中
; | |
; | 5 OSC2 PTD2 24 | 步进rock4
; | | PG/抽头跳线 jfan
; tim||led显示扩展 | 6 PTA1 PTA4 23 | 内风机反馈fback||内风机低
; | |
;? | 7 VDD PTD3 22 | 步进rock3/按键 key
; | | (无步进则加下拉电阻)
; sleep||164clk | 8 PTA2 PTB0 21 | 外风机驱动ofan
; | |
; 164/93C46数据线 data | 9 PTA3 PTB1 20 | 四通阀s4
; ?| | 冷暖跳线jhotcol
; IPT 热敏线 AD2 | 10 PTB7 PTD1 19 | 步进rock2||室外保护
; | |
; RT 热敏线 AD1 | 11 PTB6 PTB2 18 | 电加热heater
; | | 辅电跳线jheat
; OPT 热敏线 AD3 | 12 PTB5 PTB3 17 | 压机press
; | |
; 164位选(十位) | 13 PTD7 PTD0 16 | 步进rock1||风摆
; | | 机体跳线jsort
; 93C46 cs | 14 PTD6 PTB4 15 | 93C46 sk
; 缩时跳线 jtim ------------------------ A/D阻值跳线选择
;
;I/O口方案:
;内风机3,步进/按键(风摆,室外保护)4,蜂鸣器1,压机1,四通阀1,电加热1
;外风机1,遥控1,热敏线3,93C46 3,显示 5 (数据线共用)
;跳线方案:
;1------- 分体jsort/冷暖jhotcol/电加热jheat
;1------- PG jfan/数码管jdisk/缩时jtim
;机体选择: PTD0
;机型选择: PTB4 A/D阻值跳线选择(输入时SK为高阻态)
;显示方案选择:
;显示方案1: 位选十位/位选个位/led扩展/164 clk/164 data(与93C46数据线共用)
;显示方案2: led0/pta1/tim||led1/pta2/sleep||led2/pta0/run
*===================================================
;软件评估:
;RECODE:
;8.14 AD跳线读取之后必须关闭AD通道,保证93C46准确读取
; 热敏线首次采样之前,外设输出和显示屏蔽
; 当I/O置PWM模式时,I/O口电平不受指令控制
;8.15 记忆模式与遥控操作模式一致时不再重新初试化,(记忆radsave6,但关机清)
; 初试化时LED记忆原有模式--置高LED
;8.19 Output compare or PWM
; BUZZER: clear output on compare,and disable TOV on low of soundon
; INFAN: set output on compare,and disable TOV on zero_clos
; 内风机导通时间2ms,防止风机过热,及过零抖动
;8.20 步进停摆时,四象全零,防止步进发热
;8.25 可控硅触发最大时间应在过零之后2ms,同时保证导通时间>1ms
; 自检和有93C46但不选择情况下上电防止maindog溢出
; 微风档由jfan判断,抽头无微风档
*===================================================
;tcl03-02x 二次送样
;8.26 显示闪烁:设定温度发生变化时闪烁|定时记忆位为0时闪烁
; 单冷机型应急无2次按键转制冷操作
;tcl03-03x
;8.29 防冻结保护判断条件--压机开5MIN
; 单冷机型无设定温度显示,自动模式选择送风
; 制冷除湿模式切换不必重新进行模式初始
*===================================================
;93C46 参数设定:
*---------------------------------------------------------------------------
;序号 参数名称 数值 写入值 备注
;$00-$04: 工作状态记忆位 0
;$05 制热风速设定-高 1200 120 风速/10
;$06 制热风速设定-低 1000 100 风速/10
;$07 制冷风速设定-高 1200 120 风速/10
;$08 制冷风速设定-低 1000 100 风速/10
;$09 风摆全开时角度A 120 120
;$0a 风摆初始角度B 85 85
;$0b 风摆限制角度D 30 30
;$0c 进入防冻结保护温度值 0度 67 A/D值
;$0d 除霜初始设定时间 6min 6
;$0e 除霜最大修补正值 6min 6
;$0f 除霜进入OPT温差·IPT 8度 8
;$10 除霜进入OPT温度E -8度 51 A/D值
;$11 校验标志位 16 16
*===================================================
;附:写入值必须转换成16进制
*===================================================
;(无93C46或不选择93C46的情况下)硬件机型选择:
;0 47K 23E,25F
;1 30K 32E,35E,32F,35F
;2 19.5K 预留
;3 12.8K 预留
;4 10K 预留
;5 7.5K 预留
;6 5.6K 预留
;7 4.7K 预留
;8 3.3K 预留
;9 2.7K 预留
;====================================================
;以上电阻均为金膜电阻
*===================================================
;summary:
;本程序为intel80c196开发,扩展wsi psd320
;eeprom 24c16,差分mc3486/7,reset max705,communication max491,lcd 1602
;支持485半双工通讯,带16x2 lcd显示
;70L/12L兼容控制,3个等待控制
;======================================================
;information:
;copyright: nengchuang science and technology co.ltd
;microcomputer: intel 80c196;wsi psd302
;time: 2004-5-4
;designer: xiaocan
;examinationer:
;version: v1.0
;======================================================
;通讯模块:所用命令字为3、4、5、11、12、16、20、28、36、37
;初始化eeprom24c16模块seteep:
; 流程:先将数据送入首址为100h的临时缓冲区--psd302::rs0(e000h)--eeprom
; 将要操作的数据先放入psd302 ram--rso,再写ram区数据到eeprom
;写ram缓冲区数据入eeprom模块weep:
; write-operate-code: 1010xxx0 waite dumn=0 (x:no attention)
; read--operate-code: 1010xxx1 waite dumn=0
;读eeprom数据入ram缓冲模块reep:
; gx: ram buffer start-address bl: read-byte length
;读eeprom中控制板的工作参并初始化控制板子程序
; 波特率设置(fch:fcl==11059200==00a8 c000h) 5ms|| /16/190h(原为200)
; 其他方式:波特率=xtal1频率/16(b+1)
;参数修改处理子程序
; tansition ascii code to hex code
; dirr0+7||8 10||11 13||14 20||21 23||24 26||27 29
; year month day hour minute second qx-d
;总线周期为晶振两分频 11059200/2 ;t=0.18084us
;setcos 由显示日历时钟到显示其它参数的处理子程序。
; parameter 4620h==46h--f功能标志 20h--空格标志(无显示)
; 25h--2ch eh\fl\fh\gl\gh\hl\hh\ail 为显示数据修改缓冲(存放ascii码)
;keykd 显示参数处理子程序。
; lcd1602-function set 001 dl n f 00 dl=1 8bit data-bus (0:4bit data-bus)
;显示板与转接板地址处理:显示板:高四位为0,d3=1
; 转接板:高四位为8、4、2、1,d3=0
; 显示板位选顺序:port 204 16 35
; 显示板段码顺序:01234567---egdafbc.
; 转接板1的led的行地址:a7=1,y2||;读附加板1的yx的行输出的地址 :a7=1,y3
; 互换,adledh1==y3;adzjb1h1==y2
;**************************************************************
;程序编写
;5.8 集中取表:led显示为该取表信息和故障信息位
; 点亮该取表位led,同时保持故障位显示
; 是否已挂表由遥信命令返回,但同步刷新ramqb,保证取表后led熄灭
; ramled显示: 0点亮;故障信息:1正常
;5.19 待机模式:检测到变位,led循环取反(ramled),每0.5s定时清ramled,保证
; 变位恢复后,led恢复
; 变位延时报警:warndlt ,如warndlt 时间内,没有收到后台确认命令 ,
; 则报警处理 warndlt caculate: 100ms scan 每次按变位数累加
;5.20 ;通讯返回格式 0 1 2 3 4 5--- lrc
; address program-flag 0 data lrc
;5.23 通讯模块,未进发送中断,不开 ENABLE-RX
;**************************************************************
;程序修改:
;5.31 增加左右面挂表统计
;6.7 1、屏蔽位无响应
; 2、LCD故障显示按门顺序
;6.8 通讯时头码初始化标志修改,未完成为1
; 返回头码中去掉开入量标志
;6.10 如有命令未处理标志,且该命令为控制命令,则必须重发该命令
; 命令处理模块改为20MS时钟级
; 修改11号命令
;6.11 远程参数修改 keykc有待修改
;6.14 KEYKC模块修改,从第二位开始判断
;6.15 为区分核对表位模式和待机模式,核对表位下蜂鸣器短鸣一声,指示灯点亮而不闪烁
; 检查灯和核对表位完成发长声
; 修改取表命令处理模块,检查灯/取消、检查开关/取消 LCD显示
;6.16 屏蔽键盘错标志
;6.21 非法操作首先显示最低位地址,当该故障排除后显示次地址
;6.23 3号命令修改
;6.24 修改库位数统计,RAMYZ为门处理,RAMGZ1依照转接板顺序
;6.25 库位数统计----按YXSTORY来处理(RAMYZ为非及时信息)
;6.28 写参数修改标志
; HDBW虚拟跳跃
;============================================
;7.12 70L/12L兼容处理
;7.14 1、核对表位数码管提示显示“-”
; 2、添加核对表位操作正在进行标志
;7.15 修改发声记数
;7.16 挂表过程中同时有变位(0--1//1--0)发生时容错处理
;7.19 预留参数修改
; 检查LED时,LED禁止复位
;7.20 挂表发单声
; 修改LCD状态显示
;7.21 通讯数据容错处理
; 手动发送 ----赋值SBUF,手动激活发送--TI=1
;7.26 单双面屏蔽处理
;7.29 核对表位时故障自动记录(不记录常亮故障)
; 通讯期间实时时钟调整
;8.2 放表等待时间初始化:F-TIM=20,初始化密码:FFH
; 默认取表初始值===2S===20
; 增加LED老化功能
;8.3 LED复位显示时下行处理
;8.4 取表模式修改==区分正常取表和带非法报警情况下报警
;========================================
;8.18 LED老化取消时LCD显示复位.24小时处理
; 虚拟取表数
;========================================
;05.2.22 参数范围限制
; re_baudn波特率修正 19200/9600/2400/1200
; KCOM4单双面,KCOM5左面行3/4,
; KCOM6右面行3/4,KCOM11地址1-127(0)
;05.4.24 dbit4.4=上次挂表无效
;======================================================
;在不能变的ram参数中,必须是rambz3为第一个。
;======================================================
;********* 子程序目录: *****************
;1.test 校验工作参数子程序。 ok
;2.progrm 主程序。 ok
;3.setcos 由显示日历时钟到显示其它参数的处理子程序。 ok
;4.inttm1 定时器1的中断服务子程序。 ok
;5.comtx 串行口的发送(中断)子程序。 ok
;6.comrx 串行口的接收(中断)子程序。 ok
;8.diryk 遥控或定值设置时lcd显示下传和接收转接板的地址-点号-h/t(值)子程序。 ok
;9.nt5ms 5ms中断子程序:显示数码管。 ok
;10.wram 写数据入eeprom时先写入ram缓冲的子程序。 ok
;11.reep 读eeprom数据入ram缓冲的子程序。 ok
;12.weep 写ram缓冲区数据入eeprom的子程序。 ok
;13.keykd 显示参数处理子程序。 ok
;14.seteep 初始化并写入eeprom子程序。 parameter ok
;15.setram 读eeprom中控制板的工作参并初始化控制板子程序 ok
;16.keyke 修改参数时的移位子程序。 ok
;17.setdir 设置lcd子程序。 ok
;18.dirlcd 显示ram缓冲区中参数的子程序。 ok
;09.dirlod 装载显示参数子程序。 ok
;20.keycn 键盘扫描及处理子程序。 ok
;21.keykc 参数修改处理子程序。 ok
;22.dircn 显示参数刷新子程序。 ok
;23.dircn1 刷新显示(调)参数子程序。 ok
;24.mainp 命令处理子程序 ok
;25.readyx 读遥信:电表挂位的状态 和刷新库位数. ok
;---------------------------------------------------------------
;testrm 检查psd ram 是否读写正常
;======================================================
;**********************mjbj-主程序 ********************
;intel196ram :20--1ffh
;占用地址:20h--
;堆栈初始指针:fch
;中断频率 2.5ms
;**********************************************************************
;psd302系列有16k bit 位的sram===2k x 8
;ram剩余:e285h--e7cch (e285h为tcom通讯发送字节最大增量
;**********************************************************************