用汇编语言做一个看门狗测试

最新更新时间:2023-01-13来源: zhihu关键字:汇编语言  看门狗测试  MCU 手机看文章 扫描二维码
随时随地手机看文章

用STC的MCU的IO方式控制74HC595驱动8位数码管。

; 用户可以修改宏来选择时钟频率.

; 显示效果为: 显示秒计数, 5秒后不喂狗, 等复位.

Fosc_KHZ EQU 22118 ;22118KHZ

STACK_POIRTER EQU 0D0H ; 堆栈开始地址

DIS_DOT EQU 020H

DIS_BLACK EQU 010H

DIS_ EQU 011H

AUXR DATA 08EH

P4 DATA 0C0H

P5 DATA 0C8H

P0M1 DATA 0x93 ;

P0M0 DATA 0x94 ;

P1M1 DATA 0x91 ;

P1M0 DATA 0x92 ;

P2M1 DATA 0x95 ;

P2M0 DATA 0x96 ;

P3M1 DATA 0xB1 ;

P3M0 DATA 0xB2 ;

P4M1 DATA 0xB3 ;

P4M0 DATA 0xB4 ;

P5M1 DATA 0xC9 ;

P5M0 DATA 0xCA ;

P6M1 DATA 0xCB ;

P6M0 DATA 0xCC ;

P7M1 DATA 0xE1 ;

P7M0 DATA 0xE2 ;

WDT_CONTR DATA 0xC1

D_WDT_FLAG EQU (1 SHL 7)

D_EN_WDT EQU (1 SHL 5)

D_CLR_WDT EQU (1 SHL 4) ;auto clear

D_IDLE_WDT EQU (1 SHL 3) ;WDT counter when Idle

D_WDT_SCALE_2 EQU 0

D_WDT_SCALE_4 EQU 1

D_WDT_SCALE_8 EQU 2 ;T=393216*N/fo

D_WDT_SCALE_16 EQU 3

D_WDT_SCALE_32 EQU 4

D_WDT_SCALE_64 EQU 5

D_WDT_SCALE_128 EQU 6

D_WDT_SCALE_256 EQU 7

P_HC595_SER BIT P4.0 ; //pin 14 SER data input

P_HC595_RCLK BIT P5.4 ; //pin 12 RCLk store (latch) clock

P_HC595_SRCLK BIT P4.3 ; //pin 11 SRCLK Shift data clock

LED8 DATA 30H ; 显示缓冲 30H ~ 37H

display_index DATA 38H ; 显示位索引

ms_cnt_H DATA 39H ; 1000ms 计数值

ms_cnt_L DATA 3AH ;

tes_cnt DATA 3BH ; 测试用的计数变量

ORG 0000H ;reset

LJMP F_Main

ORG 0100H ;reset

F_Main:

CLR A

MOV P0M1, A ;设置为准双向口

MOV P0M0, A

MOV P1M1, A ;设置为准双向口

MOV P1M0, A

MOV P2M1, A ;设置为准双向口

MOV P2M0, A

MOV P3M1, A ;设置为准双向口

MOV P3M0, A

MOV P4M1, A ;设置为准双向口

MOV P4M0, A

MOV P5M1, A ;设置为准双向口

MOV P5M0, A

MOV P6M1, A ;设置为准双向口

MOV P6M0, A

MOV P7M1, A ;设置为准双向口

MOV P7M0, A

MOV SP, #STACK_POIRTER

MOV PSW, #0

USING 0 ;选择第0组R0~R7

MOV display_index, #0

MOV R0, #LED8

MOV R2, #8

L_ClearLoop:

MOV @R0, #DIS_BLACK ;上电消隐

INC R0

DJNZ R2, L_ClearLoop

MOV ms_cnt_H, #HIGH 1000 ; 重装1000ms计数值

MOV ms_cnt_L, #LOW 1000

MOV tes_cnt, #0

MOV LED8+7, tes_cnt

L_MainLoop:

MOV A, #1 ;延时1ms

LCALL F_delay_ms

LCALL F_DisplayScan

MOV A, tes_cnt

CLR C

SUBB A, #6 ; if(tes_cnt <= 5) //5秒后不喂狗, 将复位,

JNC L_QuitWatchDog

MOV WDT_CONTR, #(D_EN_WDT + D_CLR_WDT + D_WDT_SCALE_16) ; 喂狗

L_QuitWatchDog:

MOV A, ms_cnt_L ; if(--ms_cnt == 0)

CLR C

SUBB A, #1

MOV ms_cnt_L, A

MOV A, ms_cnt_H

SUBB A, #0

MOV ms_cnt_H, A

ORL A, ms_cnt_L

JNZ L_cnt1000_NotZero

MOV ms_cnt_H, #HIGH 1000 ; 重装1000ms计数值

MOV ms_cnt_L, #LOW 1000

INC tes_cnt ; 测试计数+1

MOV LED8+7, tes_cnt ;

L_cnt1000_NotZero:

LJMP L_MainLoop

F_delay_ms:

PUSH 02H ;入栈R2

PUSH 03H ;入栈R3

PUSH 04H ;入栈R4

MOV R2,A

L_delay_ms_1:

MOV R3, #HIGH (Fosc_KHZ / 13)

MOV R4, #LOW (Fosc_KHZ / 13)

L_delay_ms_2:

MOV A, R4 ;1T Total 13T/loop

DEC R4 ;2T

JNZ L_delay_ms_3 ;4T

DEC R3

L_delay_ms_3:

DEC A ;1T

ORL A, R3 ;1T

JNZ L_delay_ms_2 ;4T

DJNZ R2, L_delay_ms_1

POP 04H ;出栈R2

POP 03H ;出栈R3

POP 02H ;出栈R4

RET

T_Display: ;标准字库

; 0 1 2 3 4 5 6 7 8 9 A B C D E F

DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H

; black - H J K L N o P U t G Q r M y

DB 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06EH

; 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0EFH,046H

T_COM:

DB 001H,002H,004H,008H,010H,020H,040H,080H ; 位码

F_Send_595:

PUSH 02H ;R2入栈

MOV R2, #8

L_Send_595_Loop:

RLC A

MOV P_HC595_SER,C

SETB P_HC595_SRCLK

CLR P_HC595_SRCLK

DJNZ R2, L_Send_595_Loop

POP 02H ;R2出栈

RET

F_DisplayScan:

PUSH DPH ;DPH入栈

PUSH DPL ;DPL入栈

PUSH 00H ;R0 入栈

MOV DPTR, #T_COM

MOV A, display_index

MOVC A, @A+DPTR

CPL A

LCALL F_Send_595 ;输出位码

MOV DPTR, #T_Display

MOV A, display_index

ADD A, #LED8

MOV R0, A

MOV A, @R0

MOVC A, @A+DPTR

LCALL F_Send_595 ;输出段码

SETB P_HC595_RCLK

CLR P_HC595_RCLK ; 锁存输出数据

INC display_index

MOV A, display_index

ANL A, #0F8H ; if(display_index >= 8)

JZ L_QuitDisplayScan

MOV display_index, #0; ;8位结束回0

L_QuitDisplayScan:

POP 00H ;R0 出栈

POP DPL ;DPL出栈

POP DPH ;DPH出栈

RET

END


关键字:汇编语言  看门狗测试  MCU 编辑:什么鱼 引用地址:用汇编语言做一个看门狗测试

上一篇:用C语言写一个电容感应触摸键程序
下一篇:用C语言写一个看门狗程序测试

推荐阅读

极海推出APM32A全系列车规级MCU
极海宣布推出具有高效CPU处理性能、增强型存储空间、以及丰富连接功能的APM32A系列车规级MCU,以有效满足汽车电子多样化通信与车身控制应用开发需求,可广泛应用于车身控制、安全系统、信息娱乐系统、动力系统等车用场景。APM32A系列车规级MCU,拥有APM32A407、APM32A103、APM32A091三大产品线,共计6款产品,覆盖Arm®Cortex®-M0+/M3/M4内核, 进一步扩展了极海车规级MCU产品阵容。全系列新品已通过AEC-Q100 Grade1/Grade2车规认证,工作温度覆盖-40℃~125℃,符合车用芯片高可靠性、高工作温度范围等要求,有助于客户实现更稳定可靠的产品。在汽车“四化”趋势影响下,下一代汽
发表于 2023-02-02
极海推出APM32A全系列车规级<font color='red'>MCU</font>
恩智浦MCX系列MCU专为边缘AI普及而生
随着构成物联网 (IoT) 的连接节点数量每天都在增长,人们普遍认为机器学习 (ML) 推理的执行方式必须改变。对实时响应的需求意味着费力地来回传输数据只会花费太长时间,而需要在更短的时间内做出决策。另一个考虑因素是安全性,因为这种安排会增加网络攻击的风险。因此,物联网节点传感器获取的大部分数据将需要在源头进行处理,而不是在云端或集中式数据中心站点完成所有工作。通过这种方法,可以提供安全、低延迟的操作。通过更智能的边缘,系统将有可能对不断变化的情况做出更快的反应,例如,在有严重成本影响或安全关键的情况下,以及允许更好的用户体验而不会产生任何烦人的滞后。 能够访问基于边缘的 ML 推理将有利于广泛的应用场景。 其中包括工厂自动化、机器
发表于 2023-02-02
一文熟悉车规MCUMCU在智能电动汽车产业的应用
一辆传统燃油车需要大约500到600颗芯片,轻混汽车大约需要1000颗,插电混动和纯电动汽车则需要至少2000颗芯片。这意味着,随着智能电动汽车的飞速发展,不但先进制程的芯片需求量越来越大,传统芯片的需求量也将继续提升。MCU就是这样,除了单车搭载的数量在不断增长,域控制器也带来了对高安全、高可靠、高算力MCU的新需求增长。MCU,Microcontroller Unit,中文称单片微型计算机/微控制器/单片机,将CPU、存储器、外围功能整合在单一芯片上,形成具有控制功能的芯片级计算机,主要用于实现信号处理和控制,是智能控制系统的核心。MCU与我们的生活工作息息相关,如汽车电子、工业、计算机与网络、消费电子、家电、物联网等,其中汽车
发表于 2023-02-02
一文熟悉车规<font color='red'>MCU</font>,<font color='red'>MCU</font>在智能电动汽车产业的应用
单片机工作电压5V的来历
5V来自于TTL电平。5为True,0为False,之后用了压降更低的PN节,衍生出了3.3这个电平。 12V和24V来自于汽车电瓶,早年乘用车又12V和24V两个系统,现在一般小型车12V,商用车24V,再究其由来应该是铅酸电池。所以3.3V和5V一般出现在信号电路或者单片机等VCC供电,而12V/24V一般出现在低压动力电,例如主板、显卡、轴流风机、监控器。硬件决定系统基础,如果锂电池早点应用的话估计还会有3.7/7.4这个系统。为什么很多单片机的工作电压是5v?因为大多数芯片都是5V的TTL电平,要做到电平兼容,电平匹配,避免要电平转换操作,所有很多单片机的工作电压都是5V。早期(196x)的晶体管电路(TTL)单管的压降是0
发表于 2023-02-02
谈谈单片机编程思想——状态机
玩单片机还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如模块化编程、状态机编程、分层思想等本文来说一下状态机编程。什么是状态机?状态机(state machine)有5个要素:状态(state)迁移(transition)事件(event)动作(action)条件(guard)状态:一个系统在某一时刻所存在的稳定的工作情况,系统在整个工作周期中可能有多个状态。例如一部电动机共有正转、反转、停转这 3 种状态。一个状态机需要在状态集合中选取一个状态作为初始状态。迁移:系统从一个状态转移到另一个状态的过程称作迁移,迁移不是自动发
发表于 2023-02-02
单片机程序又跑飞?! 三种跑飞现象分析
在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。1 数组越界/溢出现象:单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。原因:数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。解
发表于 2023-02-02
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved