mk7a11p mcu的电子壶源程序 供大家参考
单片机源程序如下:
- #include "mk7a11p.inc" ;编译该文档需包含"mk7a11p.inc"文件
- ;------------------------------------------------------------------
- ;芯片型号(mk7a11p)
- ;------------------------------------------------------------------
- ;配置寄存器设置说明(CONFIG)
- ;1-----------FOSC=RC ;LS,NS,HS,RC
- ;2-----------INRC=ON ;ON,OFF
- ;3-----------CPT=OFF ;ON,OFF
- ;4-----------WDTE=Disable ;Enable,Disable
- ;5-----------LV=Low Vol Reset ON ;Low Vol Reset ON,Low Vol Reset OFF
- ;6-----------RESET=...input... ;...input...,...reset...
- ;------------------------------------------------------------------
- a_buf equ 0x20 ;acc缓存器
- status_buf equ 0x21 ;status缓存器
- tm_r equ 0x22 ;1s计时
- pb_buf equ 0x23 ;端口缓存
- del_r0 equ 0x24 ;延时计数
- del_r1 equ 0x25 ;延时计数
- gs_flag equ 0x26 ;高水位标志
- cs_flag equ 0x27 ;常水位标志
- ns_flag equ 0x28 ;浓缩位标志
- fmq_flag equ 0x29 ;蜂鸣器标志位
- ct1_flag equ 0x2A ;加热次数标志
- ct2_flag equ 0x2B ;加热次数标志
- ct3_flag equ 0x2C ;加热次数标志
- grcs_flag equ 0x2e ;加热次数标志
- grcs0_flag equ 0x2e ;加热次数标志
- ;------------------------------------------------------------------
- org 0x3fe ;mk7a11p的中断向量地址定义
- lgoto int ;跳转到中断程序入口
- org 0x3ff ;mk7a11p的复位向量地址定义
- lgoto main ;跳转到主程序入口
- ;------------------------------------------------------------------
- org 0x000
- int ;中断入口地址
- ;保护现场
- movam a_buf
- swap status,a
- movam status_buf
- ;---------------------------------------------------------------
- btsc irqf,tm0f ;判断是不是tmr0溢出中断
- lgoto int_tm0 ;进入tmr0中断服务程序
- ;---------------------------------------------------------------
- int_end
- ;中断结束要恢复现场
- swap status_buf,a
- movam status
- swap a_buf,m ;这里不能用"mov a_buf,a"因为
- swap a_buf,a ;"mov a_buf,a"会影响status
- reti
- ;------------------------------------------------------------------
- int_tm0 ;tmr0中断服务程序
- bc irqf,tm0f ;清除tmr0中断标志
- ;---------------------------------------------------------------
- inc tm_r,m
- movla .1 ;4x250=1s
- xor tm_r,a
- btss status,z ;逻辑结果操作结果零标记位
- lgoto int_end
- clr tm_r
- ;---------------------------------------------------------------
- movla b'00100000'
- xor portb,m ;PA0的High Low切换
- lgoto int_end
- ;------------------------------------------------------------------
- delay
- decsz del_r0,m ;延时消抖
- lgoto delay
- movla .255
- movam del_r0
- decsz del_r1,m
- lgoto delay
- ret ;子程序返回
- main ;主程序入口地址定义
- ;PortA端口方向及状态设定
- movla b'11110000'
- iodir porta
- clr porta
- clr pa_pdm
- ;------------------------------------------------------
- ;PortB端口方向及状态设定pb2高水位键盘和绿灯控制
- movla b'11001001';六个键 PB0 PB3设置为输入
- iodir portb
- clr portb
- clr pb_pod ;lou ji kai lu
- clr pb_pdm ;gong neng xuan ze
- clr pb_pup ;shang la dian zu qi
- bs pb_pup, 0
- ;bs pb_pup, 3
- ;------------------------------------------------------初始化
- movla .0
- MOVAM a_buf
- movla .0
- MOVAM status_buf
- movla .0
- MOVAM tm_r
- movla .0
- MOVAM pb_buf
- movla .0
- MOVAM gs_flag
- movla .0
- MOVAM cs_flag
- movla .0
- MOVAM ns_flag
- movla .0
- MOVAM fmq_flag
- movla .0
- MOVAM ct1_flag
- movla .0
- MOVAM ct2_flag
- movla .0
- MOVAM ct3_flag
- movla .0
- MOVAM grcs_flag
- movla .0
- MOVAM grcs0_flag
- ;bs pb_pup, 3
- ; movla b'00000001'
- ; xor portb,m ;PA0的High Low切换
- ;----------------------------------------------------------
- ;PortB端口8个IO唤醒使能
- ;movla b'11111111'
- ;movam wake_up
- ;---------------------------------------------------
- ;配置TMR0,预分频比为1:16
- ;TMR0初始值为250
- movla b'11000011'
- select
- movla .12
- movam tmr0 ;tmr0的溢出时间是:250x16=4ms
- ;---------------------------------------------------
- ;tmr0中断使能
-
- ;inc del_r0,m ;tmr0的溢出时间是:250x16=4ms
- movla .255
- movam del_r0
- movla .255
- movam del_r1
- ;--------------------------------------延时一段时间等待电路稳定
- lcall delay
- lcall delay
- lcall delay
- ; lcall delay
- ; lcall delay
- ;--------------------------------------——————第一次读取按键;
- duqu1
- movla b'11001101' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- mov portb,a ;读取端口状态
- movam pb_buf ;保存端口状态
- COM pb_buf, m ;取反端口状态
- lgoto qu01_flag ;延时状态
- yqu0
- movla b'11001101' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- mov portb,a ;二次读取端口状态
- AND pb_buf, m
- BTSc pb_buf,2 ;测试pb2 为5零sikp高水位测试位
- lgoto qingchu
- BTSc pb_buf,3 ;测试pb2 为5零sikp高水位测试位
- lgoto qingchu
- movam pb_buf ;一次测试pb0通过 。
- inc grcs0_flag,m
- BTSs grcs0_flag,7 ;八次测试pb0通过 。
- lgoto duqu1
- BTSs grcs0_flag,6 ;八次测试pb0通过 。
- lgoto duqu1
- BTSs grcs0_flag,5 ;八次测试pb0通过 。
- lgoto duqu1
- BTSc pb_buf,2
- lgoto sns_flag
- lgoto sgs_flag
- qu01_flag
- movla .200
- MOVAM fmq_flag
- qu011_flag
- movla b'11001001' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- bc portb, 2 ;绿色指示灯亮
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- DECSZ fmq_flag, m
- lgoto qu011_flag
- lgoto yqu0 ;
- qingchu
- movla .0
- MOVAM grcs0_flag
- lgoto duqu1
-
- sgs_flag
- movla .1
- MOVAM gs_flag
- lgoto jiare_flag ;只可能一个键被按下检测到后直接跳转加热
- sns_flag
- BTSc pb_buf,3 ;测试pb3 为零sikp
- lgoto scs_flag
- movla .1
- MOVAM ns_flag
- lgoto jiare_flag ;只可能一个键被按下检测到后直接跳转加热
- scs_flag movla .1
- MOVAM cs_flag
- ;----------------------------------------------------------------电路全功率加热
- jiare_flag
- bc portb, 4 ;红色指示灯亮,
- movla b'10000001'
- movam irqm
- clr irqf
- ;bs portb, 5 ;打开蜂鸣器
- movla .5
- movam del_r1
- lcall delay ;蜂鸣器响一声,
- ;lcall delay ;蜂鸣器响一声,
- lcall delay ;蜂鸣器响一声,
- lcall delay ;蜂鸣器响一声,
- movla b'00000000'
- movam irqm
- clr irqf
- ;bc portb, 5 ;关闭蜂鸣器
-
- bs portb, 1 ;继电器打开全功率加热。
- bs portb, 0
- ; bs portb, 0 ;继电器打开全功率加热。
-
-
- jiare
- mov portb,a ;读取端口状态
- movam pb_buf ;保存端口状态
- btss pb_buf,0 ;测试pb0
- lgoto jiare ;等待温控器信号为零时跳出循环体
- nop
- bc portb, 4 ;红色指示灯亮,
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- btss pb_buf,0 ;测试pb0
- lgoto jiare ;等待温控器信号为零时跳出循环体
- nop
- nop
- nop
- nop
- lcall delay
- nop
- nop
- nop
- nop
- btss pb_buf,0 ;测试pb0
- lgoto jiare ;等待温控器信号为零时跳出循环体
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- btss pb_buf,0 ;测试pb0
- lgoto jiare ;等待温控器信号为零时跳出循环体
- ;------------------------------------------------------------加热完成延时加热;
- BTSc gs_flag,0 ;为一表示高电平没有按键,跳过指令
- lgoto wcjiare1 ;高水位加热后直接完成加热状态
- BTSc cs_flag,0
- lgoto csjiare_flag ;常水位加热后延时2分钟
- BTSc ns_flag,0
- lgoto nsjiare1_flag ;浓缩水位加热后延时6分钟
- csjiare_flag
- movla .121
- MOVAM fmq_flag
- csjiare1_flag
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO csjiare1_flag
- LGOTO wcjiare1
- nsjiare1_flag
- movla .180
- MOVAM fmq_flag
- nsjiare11_flag
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO nsjiare11_flag
- nsjiare2_flag
- movla .180
- MOVAM fmq_flag
- nsjiare22_flag
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO nsjiare22_flag
- wcjiare1
- movla b'11001001';六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输出
- bs portb, 4 ;红色指示灯灭,
- bc portb, 1 ;关闭继电器打开全功率加热。
- bs portb, 2 ;绿色指示灯亮
- movla .10 ;蜂鸣器响十声,
- MOVAM fmq_flag
- sss1_flag
- movla b'10000001'
- movam irqm
- clr irqf
- lcall delay
- lcall delay
- movla b'00000000'
- movam irqm
- clr irqf
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO sss1_flag
- bc portb, 5 ;关蜂鸣器,
- ;----------------------------------------------------------加热延时完成关闭加热;
- ;----------------------------------------------------------加热完成二次读取按键;
- baowen
- movla b'11001101' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- mov portb,a ;读取端口状态
- movam pb_buf ;保存端口状态
- COM pb_buf, m ;取反端口状态
- lgoto qu1_flag ;延时状态
- yqu
- movla b'11001101' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- mov portb,a ;二次读取端口状态
- AND pb_buf, m
- BTSc pb_buf,2 ;测试pb2 为5零sikp高水位测试位
- lgoto qingchu0
- BTSc pb_buf,3 ;测试pb2 为5零sikp高水位测试位
- lgoto qingchu0
- movam pb_buf ;一次测试pb0通过 。
- inc grcs_flag,m
- BTSs grcs_flag,7 ;八次测试pb0通过 。
- lgoto baowen
- BTSc pb_buf,2
- lgoto sns1_flag
- lgoto jiare2
- qu1_flag
- movla .100
- MOVAM fmq_flag
- qu11_flag
- movla b'11001001' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- bs portb, 2 ;绿色指示灯亮
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- DECSZ fmq_flag, m
- lgoto qu11_flag
- lgoto yqu ;
- qingchu0
- movla .0
- MOVAM grcs_flag
- lgoto baowen
- sns1_flag
- BTSc pb_buf,3 ;测试pb3 为零sikp浓缩水位测试位
- lgoto scs1_flag ;不是高水位也不是浓缩水位
- BTSc gs_flag,0 ;是浓缩水位,
- lgoto sss_flag ;高水位转浓缩水位,转加热6分钟
- BTSc cs_flag,0 ;是浓缩不是高水位
- lgoto loop3 ;常水位转浓缩水位,加热四分钟
- lgoto jiare2 ;是浓缩水位,不是高水位,也不是常水位转保温加热
- scs1_flag ;二次读取为常水位。
- BTSc gs_flag,0
- lgoto loop ;高水位转常水位 加热两分钟
- lgoto jiare2 ;不是高水位转常水位转到保温加热。
- loop
- BTSc ct1_flag,0
- lgoto jiare2
- inc ct1_flag,m
- movla b'11001001' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- bc portb, 2 ;绿色指示灯亮
- bc portb, 4 ;红色指示灯亮,
- bs portb, 1 ;继电器打开全功率加热。
- movla .120
- MOVAM fmq_flag
- nsjiare44_flag ;延时
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO nsjiare44_flag
- lgoto wcjiare1 ;延时加热后转保温加热
- sss_flag
- BTSc ct2_flag,0
- lgoto jiare2
- BTSc ct1_flag,0
- lgoto nsjiare045_flag
- inc ct2_flag,m
- movla b'11001001' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- bc portb, 2 ;绿色指示灯亮
- bc portb, 4 ;红色指示灯亮,
- bs portb, 1 ;继电器打开全功率加热。
- movla .120
- MOVAM fmq_flag
- nsjiare45_flag ;延时
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO nsjiare45_flag
- nsjiare045_flag
- inc ct2_flag,m
- bc portb, 2 ;绿色指示灯灭
- bc portb, 4 ;红色指示灯亮,
- bs portb, 1 ;继电器打开全功率加热。
- movla .230
- MOVAM fmq_flag
- nsjiare46_flag ;延时
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- DECSZ fmq_flag, m
- LGOTO nsjiare46_flag
- lgoto wcjiare1 ;延时六分钟加热后转保温加热
- loop3
- BTSc ct3_flag,0
- lgoto jiare2
- inc ct3_flag,m
- movla b'11001001' ;六个键 PB0 PB3设置为输入
- iodir portb ; pb2 设 置为输入
- bc portb, 2 ;绿色指示灯亮
- bc portb, 4 ;红色指示灯亮,
- bs portb, 1 ;继电器打开全功率加热。
- movla .240
- MOVAM fmq_flag
- nsjiare47_flag ;延时
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- lcall delay
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
14 6A12_dzkwh.rar
(15.45 KB, 下载次数: 6)
|