百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

单片机实战——连载之十一

bigegpt 2024-09-03 11:07 3 浏览

程序编译主程序里包含以下程序:中断服务程序、主程序、各子程序模块、变量定义等,启动CS+ for CC,打开hdwinit,在编译窗口,把下面的程序拷贝过来即可。

中断服务程序,使用了4个,10mS定时器中断、1S定时器中断、串行通信发送中断、串行通信接收中断。

以下是主程序:

;========================================================

.PUBLIC MAIN

.EXTERN _R_FDL_Init

.EXTERN _R_FDL_Read

.EXTERN _PFDL_Close

.EXTERN _R_FDL_ExecuteWrite

.EXTERN _R_FDL_ClearDataFlash

.extern _g_write_address

.extern _g_block_valeu

.extern _g_read_value

.extern _g_write_value

.SECTION .data, DATA

;--------------------------------------------------------

RXADDREG .EQU0XF800 ; UART1-RX1缓存区寄存器(32byte)

;--------------------------------------------------------

TX1ADDREG .EQU0XF820 ; UART1-TX1缓存区寄存器(32byte)

;--------------------------------------------------------

WDTBUFREG .EQU0XF840 ;

RXTXFLG .EQU0XF841

MODEFLG .EQU0XF842

FLHADREG .EQU0XF843 ; FLASH读写字节数量记数器

BLOCK_TIM .EQU0XF844 ; DATA FLSCH 块擦除间隔计时器

DATCRCRG .EQU0XF845 ; CRC计算数据个数计数器

RXTIM10RG .EQU0XF846 ; UART接收数据延时计数器

SHRDARG .EQU0XF847 ; CRC计算移位寄存器

TXCOUN .EQU0XF848 ; UART发送数据长度计数器

RXCOUN .EQU0XF849 ; UART接收数据长度计数器

TIM60SREG .EQU0XF84A ; 秒计数寄存器

TIM60MREG .EQU0XF84B ; 分计数寄存器

TIM24HREG .EQU0XF84C ; 时计数寄存器

DAYREG .EQU0XF84D ; 日计数寄存器

MONTHREG .EQU0XF84E ; 月计数寄存器

YEARREG .EQU0XF84F ; 年计数寄存器;

DEVIADDREG .EQU0XF850 ; 设备类型配置寄存器

UNITTYPEH .EQU0XF851

UNITTYPEL .EQU0XF852

DATETIME1 .EQU0XF853

DATETIME2 .EQU0XF854

DATETIME3 .EQU0XF855

DATETIME4 .EQU0XF856

BCEDBUFG .EQU0XF858

FLASHRG .EQU0XF859

BCT60MREG .EQU0XF85C ; 充电计时寄存器

EDT60MREG .EQU0XF85E ; 放电计时寄存器;

TRCRCREG .EQU0XF860 ; 收发CRC计算结果寄存器2BYTE

RXADDBUF .EQU0XF862 ; UART接收地址指针寄存器2BYTE

TXADDBUF .EQU0XF864 ; UART发送地址指针寄存器2BYTE

BAUDAREG .EQU0XF866 ; 波特率配置寄存器2BYTE

BATDCRGL .EQU0XF86A ; 蓄电池电压寄存器L

BATDCRGH .EQU0XF86B ; 蓄电池电压寄存器H

VSODCRGL .EQU0XF86C ; 电池板电压寄存器L

VSODCRGH .EQU0XF86C ; 电池板电压寄存器H

BATIVRGL .EQU0XF86E ; 充电电流寄存器L;

BATIVRGH .EQU0XF86F ; 充电电流寄存器H;

LEDOTIMG .EQU0XF870 ; LED指示灯闪烁计时器

ADCBITBUF .EQU0XF871

MODE1TIMG .EQU0XF872

MODE2TIMG .EQU0XF873

VER50CRG .EQU0XF874

VTR50BRG .EQU0XF875

TIMEVD1RG .EQU0XF876

TIMEVD2RG .EQU0XF877

TIMEVD3RG .EQU0XF878

TIMEVD4RG .EQU0XF879

TIMEVD5RG .EQU0XF87A

TIMEVD6RG .EQU0XF87B;

ADCD1TSG .EQU0XF880

ADCD2TSG .EQU0XF882

ADCD3TSG .EQU0XF884;

LEDO1 .EQUP6.0 ; 充电状态指示

LEDO2 .EQUP6.1 ; 电池状态指示1

LEDO3 .EQUP6.2 ; 电池状态指示2

INUA .EQUP2.2 ; P2.3/2=01涓流/恒流充电

INUB .EQUP2.3 ; P2.3/2=10浮充充电;

UART1_CN .EQUp12.0 ; 485收发控制位;

LEDGOUT .EQUP5.1 ; 收发指示灯(绿)输出;

RXOK_BIT .EQURXTXFLG.0

TXOK_BIT .EQURXTXFLG.1

TXEN_BIT .EQURXTXFLG.6 ; 发送使能

RXEN_BIT .EQURXTXFLG.7 ; 接收使能;

FLASH_EN .EQUFLASHRG.0 ; 写FLASH使能

ERASES_BT .EQUFLASHRG.1 ; 块清楚标志

FDERR_BT .EQUFLASHRG.6

YEAR_BIT .EQUFLASHRG.7 ; 闰年标志

;

TXME1_BIT .EQUMODEFLG.0 ; 发送模式1使能

TXME2_BIT .EQUMODEFLG.1 ; 发送模式2使能

TXME3_BIT .EQUMODEFLG.2 ; 发送模式3使能

TXME4_BIT .EQUMODEFLG.3 ; 发送模式4使能

TXME5_BIT .EQUMODEFLG.4 ; 发送模式5使能;

TRICH_BT .EQUBCEDBUFG.0 ; 涓流充电标记

FLOAT_BT .EQUBCEDBUFG.1 ; 浮充充电标记

CONSC_BT .EQUBCEDBUFG.2 ; 恒流充电标记

POWERH_BT .EQUBCEDBUFG.3 ; 电池过压标记

POWERM_BT .EQUBCEDBUFG.4 ; 电池正常标记

POWERL_BT .EQUBCEDBUFG.5 ; 电池欠压标记

BATT_ERR .EQUBCEDBUFG.6 ; 电池故障状态

BATENA_BT .EQUBCEDBUFG.7 ; 充电允许状态;

;--------------------------------------------------------

.SECTION.textf,TEXTF

;--------------------------------------------------------

INTST1 .VECTOR 0x0024

INTSR1 .VECTOR 0x0026

INTTM06 .VECTOR 0x0046

INTTM07 .VECTOR 0x0048

;--------------------------------------------------------

; 10Ms定时中断服务子程序

; 使用0单元7通道

;--------------------------------------------------------

INTTM07:

PUSHAX

INC!WDTBUFREG

INC!LEDOTIMG

MOVA,!RXTXFLG

BT A.7,$INTTM07_STR

POPAX

RETI

INTTM07_STR:

CMP!RXTIM10RG,#1

BNC$INTTM07_END

INC!RXTIM10RG

POPAX

RETI

INTTM07_END:

SET1!SRMK1 ; disable INTSR1 interrupt

SET1!ST0L.3

CLR1!SRIF1 ; clear INTSR1 interrupt flag

SET1!RXOK_BIT ; 数据接收完成

CLR1!RXEN_BIT

SET1LEDGOUT

POPAX

RETI

;--------------------------------------------------------

; 1000Ms定时中断服务子程序

; 使用0单元6通道

;--------------------------------------------------------

INTTM06:

CMP!TIM60SREG,#59

BNC$INTTM06_M

INC!TIM60SREG

RETI

INTTM06_M:

CLRB!TIM60SREG

CMP!TIM60MREG,#59

BNC$INTTM06_H

INC!TIM60MREG

INCW!BCT60MREG ; 充电计时+1

INCW!EDT60MREG ; 放电计时+1

RETI

INTTM06_H:

CLRB!TIM60MREG

CMP!TIM24HREG,#23

BNC$INTTM06_SET

INC!TIM24HREG

RETI

INTTM06_SET:

CLRB!TIM24HREG

INC!DAYREG ; 日计数寄存器+1

RETI

;--------------------------------------------------------

; UART0接收中断服务子程序

; UART0使用0单元3通道接收

;--------------------------------------------------------

INTSR1:

PUSHAX

PUSHHL

CLR1LEDGOUT

CLR1!SRIF1 ; clear INTSR0 interrupt flag

MOVA,!SSR03L

BT A.2,$INTSR1_RXE

MOVWHL,!RXADDBUF

SET1!RXEN_BIT

CLRB!RXTIM10RG

MOVA,!RXD1

MOV[HL],A

INCW!RXADDBUF

INC!RXCOUN

POPHL

POPAX

RETI

INTSR1_RXE:

SET1LEDGOUT

MOV!SIR03L,#0X07

POPHL

POPAX

RETI

;--------------------------------------------------------

; UART0发送中断服务子程序

; UART0使用0单元2通道发送

;--------------------------------------------------------

INTST1:

PUSHAX

PUSHHL

CLR1LEDGOUT

CLR1!STIF1 ; clear INTST0 interrupt flag

DEC!TXCOUN

CMP!TXCOUN,#0

BZ $INTST1_END

MOVWHL,!TXADDBUF

MOVA,[HL]

MOVTXD1,A

INCW!TXADDBUF

POPHL

POPAX

RETI

INTST1_END:

SET1!TXOK_BIT ; 发送完成,=1完成

SET1LEDGOUT

SET1!STMK1

SET1!ST0L.2

CLR1!SOE0L.2 ; Set SOE0

CLR1STIF1 ; clear INTST1 interrupt flag

POPHL

POPAX

RETI

;********************************************************

; 主运行程序

;********************************************************

MAIN:

MOV!UNITTYPEH,#0XAC

MOV!UNITTYPEL,#0X68

MOV!DATETIME4,#0X17

MOV!DATETIME3,#0X09

MOV!DATETIME2,#0X03

MOV!DATETIME1,#0X01 ; 生产序列号(可变ID)

MOV!DEVIADDREG,#0XFA ; 设备类型=0xFA(蓄电池管理)

MOVWAX,#0

MOVW!_g_write_address,AX

NOP

CALL!_R_FDL_Init

MAIN_LOP:

NOP

CALL!_R_FDL_Read

MOVWHL,#LOWW(_g_read_value)

MAIN_LOOP:

NOP

MOVA,[HL]

CMPA,#0XFF ; 判断数据块是否为空

BNZ$MAIN_LOP1 ; 一个字节不是FF即有写入数据

INCWHL

INC!FLHADREG

INC!_g_write_address

CMP!FLHADREG,#2

BC $MAIN_LOOP

MOVWAX,!_g_write_address

CLRWBC

MOVC,!FLHADREG

SUBWAX,BC

SUBWAX,#2

MOVW!_g_write_address,AX; 减去2作为当前读地址

BT A.7,$MAIN_LOP2

NOP

CALL!_R_FDL_Read

MOVWAX,!_g_read_value

MOVW!BAUDAREG,AX ; 波特率

MOVW!_g_write_value,AX

MOVWAX,!_g_write_address

ADDWAX,#2

MOVW!_g_write_address,AX; 加2作为当前写地址

NOP

BR $MAIN_LOP3

MAIN_LOP1:

CLRWBC

MOVWDTE,#0XAC

MOVC,!FLHADREG

MOVWAX,!_g_write_address

SUBWAX,BC

ADDWAX,#2

MOVW!_g_write_address,AX

BR $MAIN_LOP ;

MAIN_LOP2:

MOVWAX,#0X2580 ; 默认波特率=9600bps,16进制=0X2580

MOVW!BAUDAREG,AX

MOVW!_g_write_value,AX

SET1!FLASH_EN ; 置写FLASH使能标记

MAIN_LOP3:

NOP

CALL!_PFDL_Close

NOP

MOVWAX,!BAUDAREG

CMPWAX,#0X0960 ; 波特率=2400bps,16进制=0X0960

BZ $MAIN_BAUS1

CMPWAX,#0X12C0 ; 波特率=4800bps,16进制=0X12C0

BZ $MAIN_BAUS2

CMPWAX,#0X2580 ; 波特率=9600bps,16进制=0X2580

BZ $MAIN_BAUS3

CMPWAX,#0X4B00 ; 波特率=19200bps,16进制=0X4B00

BZ $MAIN_BAUS4

CMPWAX,#0X9600 ; 波特率=38400bps,16进制=0X9600

BZ $MAIN_BAUS5

BR !MAIN_RET

MAIN_BAUS1:

MOVWAX,#0x0061

MOVW!SPS0,AX ;CK01:20MHz/64=0.3125MHz,CK00:20MHz/2=10MHz

BR !MAIN_RET

MAIN_BAUS2:

MOVWAX,#0x0051

MOVW!SPS0,AX ;CK01:20MHz/32=0.625MHz,CK00:20MHz/2=10MHz

BR !MAIN_RET

MAIN_BAUS3:

MOVWAX,#0x0041

MOVW!SPS0,AX ;CK01:20MHz/16=1.25MHz,CK00:20MHz/2=10MHz

BR !MAIN_RET

MAIN_BAUS4:

MOVWAX,#0x0031

MOVW!SPS0,AX ;CK01:20MHz/8=2.5MHz,CK00:20MHz/2=10MHz

BR !MAIN_RET

MAIN_BAUS5:

MOVWAX,#0x0021

MOVW!SPS0,AX ;钟CK01:20MHz/4=5MHz,CK00:20MHz/2=10MHz

MAIN_RET:

CLR1UART1_CN ; 485收发控制位,0=接收

CLRB!RXCOUN

MOVWHL,#LOWW(RXADDREG)

MOVWAX,HL

MOVW!RXADDBUF,AX

MOVWAX,#0x8022 ; 传送结束中断

MOVW!SMR02,AX

SET1!SS0.3 ; enable UART0 接收

CLR1!SRIF1 ; clear INTSR1 interrupt flag

CLR1!SRMK1 ; enable INTSR1 interrupt

NOP

EI

MAIN_STR:

NOP

CMP!WDTBUFREG,#50

BC $MAIN_CNR ; WDTBUFREG<0.5秒 TO MAIN_CNR

MOVWDTE,#0XAC

CLRB!WDTBUFREG

MAIN_CNR:

NOP

CALL!RXDAT_CON ; UART1接收数据处理子程序

NOP

CALL!DATE_CONT ; 日期处理子程序(年、月、日)

NOP

CALL!TXDATM_CON ; UART1发送数据模式1设置子程序

NOP

CALL!BTSTASTO_CNT ; 充电启停判断处理子程序

NOP

CALL!BTMODE_CON ; 充电模式判断处理子程序

NOP

CALL!BATTEN_CON ; 充电使能处理子程序

NOP

CALL!XDCV_CNT ; 蓄电池电压判断子程序

NOP

CALL!LEDOUT_CNT ; 指示灯控制子程序

NOP

CALL!ACCUL_CNT ; 蓄电池故障处理子程序

NOP

CALL!DAFW_CONT

NOP

MOVA,!RXTXFLG

BF A.1,$MAIN_STR ; 发送完成?

CLR1!TXOK_BIT ; 清发送完成

CLR1UART1_CN ; 485收发控制位,0=接收

CLRB!RXCOUN

MOVWHL,#LOWW(RXADDREG)

MOVWAX,HL

MOVW!RXADDBUF,AX

MOVWAX,#0x8022 ; 传送结束中断

MOVW!SMR02,AX

SET1!SS0.3 ; enable UART0 接收

CLR1!SRIF1 ; clear INTSR1 interrupt flag

CLR1!SRMK1 ; enable INTSR1 interrupt

NOP

BR !MAIN_STR

;--------------------------------------------------------

把前期介绍的各模块的子程序拷贝到此处

;--------------------------------------------------------

ACCUL_CNT:

MOVA,!BCEDBUFG

BT A.6,$ACCUL_FCNS

MOVWAX,!BCT60MREG

CMPWAX,#21600 ; 充电大于6小时?

BNC$ACCUL_CON1

RET

ACCUL_CON1:

MOVWAX,!BATDCRGL ;蓄电池电压小于12V?

MOVB,#12

MOVC,#0

CMPWAX,BC

BC $ACCUL_CON2

CLR1!BATT_ERR ; 清电池故障标记

RET

ACCUL_CON2:

SET1!BATT_ERR ; 置电池故障标记

MOVWAX,#0

MOVW!BCT60MREG,AX ; 清充电计时

RET

ACCUL_FCNS:

MOVWAX,!EDT60MREG

CMPWAX,#7200 ; 放电大于2小时?

BNC$ACCUL_FCN1

RET

ACCUL_FCN1:

MOVWAX,#0

MOVW!EDT60MREG,AX

MOVWAX,!BATDCRGL ;蓄电池电压小于10V?

MOVB,#10

MOVC,#0

CMPWAX,BC

BC $ACCUL_FCN2

RET

ACCUL_FCN2:

SET1!TXME1_BIT

RET

蓄电池故障判断条件:

1、充电时电压:连续充电6小时后,电池电压小于12V。

2、放电时电压:充电结束2小时后,电压小于10V。

同时满足以上两个条件,电池失效。

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...