历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2018年01月08日 | AT93C46的汇编读写软件程序

2018-01-08 来源:eefocus

;* ========================================================================== *
; 名称: AT93C46的汇编读写软件包 
; 文件名: 93C46_8.ASM 

; 程序模块已通过硬件仿真调试,方便实用. 
;* ========================================================================== * 
; 说明: 软件包仅适用于93C46 8位存储器结构状态,软件包可嵌入到80C51 ROM中任一空间。 
; fosc = 12MHz 
;---------------------------------------------------------- 
    R31    EQU    1FH  
     
    CS    EQU    P1.0    ;片选端 
    SK    EQU    P1.1    ;模拟时钟信号输出端 
    DI    EQU    P1.2    ;串行数据输出端 
    DO    EQU    P1.3    ;串行数据输入端 
;---------------------------------------------------------- 
    ORG    0000H 
    JMP    MAIN 

    ORG    0100H 
MAIN: 
     MOV     R0,#7FH 
    CLR    A 
     MOV     @R0,A 
    DJNZ    R0,$-2 
     MOV     SP,#60H 
MAIN1: 
     MOV     R0,#30H 
     MOV     R7,#16 
     MOV     A,#1 
     MOV     @R0,A 
    INC    R0 
    INC    A 
    DJNZ    R7,$-3 
             
    CALL    EWNE        ;擦写允许 
     MOV     A,#01100000B    ;地址"11xxxxx" 
    CALL    INADR        ;输出地址 
     
    CALL    EWNE        ;片擦除(将整个存储器置为"1") 
     MOV     A,#01000000B    ;片擦除地址 
    CALL    INADREW        ;输出地址         
    CALL    DLY10ms     
     
    CALL    RD16        ;读指定地址单元的数据 
             
    CALL    WRITE        ;将数据写入指定地址单元 
     
    CALL    ERASE        ;擦除(将指定地址单元置为"1")     
     MOV     A,#01H        ;地址 
    CALL    INADREW        ;输出地址         
    CALL    DLY10ms 
     
    CALL    RD16        ;读 
     
    CALL    EWNE        ;擦/写禁止 
     MOV     A,#0        ;地址"00xxxxx" 
    CALL    INADR        ;输出地址 
         
    JMP    MAIN1 
;========================================================== 
;---------------------------------------------------------- 
;将存在80C51内RAM 30H为首地址的16字节数据依次写入93C46首址00H的EEPROM 
;注意: 93C46上电复位后,芯片处于写保护状态,所以在擦写操作前,应开启"写允许". 
;否则无法写入数据. 

WRITE:     
     MOV     A,#01100000B    ;地址"11xxxxx" 
    CALL    INADR        ;输出地址     
     MOV     R0,#30H        ;置源数据区首址 
     MOV     R1,#00H        ;置93C46写入单元首址 
     MOV     R7,#16        ;字节数 
    CALL    WRIT6     
    RET 
;---------------------------------------------------------- 
;将AT93C46 首址为00H的16字节数据读出并存入80C51以30H为首址的内RAM中 

RD16:     MOV     R0,#20H        ;置数据存储区首址 
     MOV     A,#00H        ;置93C46读出单元首地址     
     MOV     R7,#16        ;字节数送R7 
    LCALL    STATRD        ;启动读 
    LCALL    INADR        ;输出93C46读出单元首址 
RD160:     
    LCALL    READ        ;读出一个字节数据 
     MOV     @R0,A        ;存一个字节数据 
    INC    R0        ;指向下一存储单元地址 
    DJNZ    R7,RD160    ;判16字节数据读完否?未完继续 
    CLR    CS        ;16字节数据读完,置93C46低功耗备用状态 
    CALL    DLY10ms        ;延时10ms,以便进行芯片的其它功能操作 
    RET 
;---------------------------------------------------------- 
;入口: 数据区首址在R0,93C46单元地址在R1,写入的字节数在R7中 
     
WRIT6:             
    LCALL    STATWR        ;启动写 
     MOV     A,R1        ;置93C46写入单元地址 
    LCALL    INADR        ;输出93C46写入地址单元 
     MOV     A,@R0        ;读写入数据 
    LCALL    WRIT        ;写入一个字节     
    LCALL    DLY1ms        ;延时1ms 
    INC    R0        ;指向8051下一个数据地址 
    INC    R1        ;指向93C46下一个写入单元地址 
    DJNZ    R7,WR61        ;判6字节数据写完否?未完继续     
    CLR    CS        ;93C46进入备用状态,降低功耗 
    CALL    DLY10ms 
    RET 
WR61:    JB    DO,WRIT6    ;判REDAY/BUSY,DO=1,写入下一字节 
    SJMP    WR61        ;DO=0,转等待 

;========================================================== 
; 启动读子程序 
; 说明: STATRD子程序输出启动和读操作代码"110" 
;---------------------------------------------------------- 
STATRD: 
    CLR    CS    ;片选置低 
    CLR    SK    ;时钟置低 
    SETB    CS     
    SETB    DI    ;置启动"1" 
    SETB    SK    ;时钟上升沿输出启动信号"1" 
    CLR    SK 
    SETB    SK    ;时钟上升沿输出"1" 
    CLR    SK 
    CLR    DI    ;置输出"0" 
    SETB    SK    ;时钟上升沿输出"0" 
    CLR    SK    ;时钟置低 
    RET 
;----------------------------------------------------------     
; 启动写子程序 
; 说明: STATWR子程序输出启动和写操作代码"101" 
;---------------------------------------------------------- 
STATWR: 
    CLR    CS    ;片选置低 
    CLR    SK    ;时钟置低 
    SETB    CS    ;置片选 
    SETB    DI    ;置启动"1" 
    SETB    SK    ;时钟上升沿输出启动信号"1" 
    CLR    SK 
    CLR    DI    ;置输出"0" 
    SETB    SK    ;时钟上升沿输出"0" 
    CLR    SK 
    SETB    DI    ;置输出"1" 
    SETB    SK    ;时钟上升沿输出"1" 
    CLR    SK    ;时钟置低 
    RET 
;---------------------------------------------------------- 
; 擦写允许/禁止启动和操作代码 "100" 
; 该子程序可用于: 擦写允许(EWEN)、写禁止(EWDS)、片写(WRAL)、片擦除(ERAL), 
; 只是各自的地址不同而也. 
; 擦写允许/禁止操作代码"100",地址"11xxxxx"/"00xxxxx" 
;---------------------------------------------------------- 
EWNE:         
    CLR    CS    ;片选置低 
    CLR    SK    ;时钟置低 
    SETB    CS    ;置片选 
    SETB    DI    ;置启动"1" 
    SETB    SK    ;时钟上升沿输出启动信号"1" 
    CLR    SK 
    CLR    DI    ;置输出"0" 
    SETB    SK    ;时钟上升沿输出"0" 
    CLR    SK 
    CLR    DI    ;置输出"0" 
    SETB    SK    ;时钟上升沿输出"1" 
    CLR    SK    ;时钟置低 
    RET 
;---------------------------------------------------------- 
; 擦指令ERASE  启动和操作代码 "111" 
;---------------------------------------------------------- 
ERASE:         
    CLR    CS    ;片选置低 
    CLR    SK    ;时钟置低 
    SETB    CS    ;置片选 
    SETB    DI    ;置启动"1" 
    SETB    SK    ;时钟上升沿输出启动信号"1" 
    CLR    SK 
    SETB    DI    ;置输出"1" 
    SETB    SK    ;时钟上升沿输出"0" 
    CLR    SK 
    SETB    DI    ;置输出"1" 
    SETB    SK    ;时钟上升沿输出"1" 
    CLR    SK    ;时钟置低 
    RET 
;----------------------------------------------------------     
; 输出读写单元地址子程序 
; 入口: 7位地址已存在A中D6~D0 
;---------------------------------------------------------- 
INADR: 
     MOV     R2,#7    ;置写入地址位数(存储单元8位结构时,地址为7位) 
    RLC    A    ;先左移一位,地址移至D7~D1,D0无效 
IR1:    CLR    SK    ;时钟置低 
    RLC    A    ;左移一位 
     MOV     DI,C    ;存入DI端口 
    SETB    SK    ;时钟上升沿输出至93C46DI端 
    DJNZ    R2,IR1    ;判断7位地址写完否,未完继续     
    RET 
;---------------------------------------------------------- 
; 输出擦单元地址子程序 

INADREW: 
    CALL    INADR 
    CLR    CS 
    NOP 
    SETB    CS 
    JNB    DO,$    ; DO=0,表示编程正在进行; 
            ; DO=1,表示该指定地址的寄存器单元已擦完,可以执行下一条指令。 
    RET 
;---------------------------------------------------------- 
; 读一个字节子程序 
; 出口: 8位数据存在A中 
;---------------------------------------------------------- 
READ:    CLR    SK    ;时钟置低 
     MOV     R2,#8    ;置读入位数8 
RD1:    SETB    SK    ;时钟上升沿读入一位数据 
    NOP 
     MOV     C,DO    ;存入Cy 
    RLC    A    ;左移入A中     
    CLR    SK    ;时钟置低     
    DJNZ    R2,RD1    ;判8位数据读完否?未完继续 
    RET 
;---------------------------------------------------------- 
;确良写一个字节子程序 
; 入口: 写入数据须事先存入A中. 
; 若需写入多个字节数据,须在1ms后,93C46 DO 端出现高电平后才能重新启动写入. 
;---------------------------------------------------------- 
WRIT:     
     MOV     R2,#8    ;置写入位数8 
WR1:    CLR    SK    ;时钟置低 
    RLC    A    ;A中数据移一位至Cy中 
     MOV     DI,C    ;数据传送至DI端 
    nop 
    SETB    SK    ;时钟上升沿输出至93C46 
    DJNZ    R2,WR1    ;判8位数据写完否?未完继续 
    CLR    CS    ;8位数据写完,CS下降沿启动93C46擦写 
    SETB    CS    ;CS次高位,以使DO端REDAY/BUSY状态位号有效 
    RET 
;---------------------------------------------------------- 
DLY1ms:                ;延时1ms子程序 
     MOV     R31,#29        ; 
L2:    PUSH    R31 
L3:    DJNZ    R31,L3 
    POP    R31 
    DJNZ    R31,L2          
    RET 
DLY10ms:            ;延时10ms子程序 
     MOV     R31,#100     
L20:    PUSH    R31 
L30:    DJNZ    R31,L30 
    POP    R31 
    DJNZ    R31,L20          
    RET 
;========================================================== 
END


推荐阅读

史海拾趣

台湾丰宾(CapXon)公司的发展小趣事

面对日益激烈的市场竞争,CapXon公司始终坚持以技术创新为驱动,不断推动产业升级。公司投入大量资金用于研发新的技术和产品,以满足市场对高品质、高性能电容器的需求。通过不断的努力,CapXon成功研发出了一系列具有自主知识产权的高性能电容器产品,这些产品不仅具有更高的稳定性和可靠性,而且能够满足更广泛的应用场景需求。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

AIE公司始终将品质管理作为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、销售等各个环节都进行严格的监控和管理。同时,AIE还注重与客户的沟通和反馈,及时了解客户的需求和意见,不断改进产品和服务。这种对品质的执着追求和对客户的尊重赢得了客户的广泛信任和支持。

Ava Electronics Corp公司的发展小趣事

随着国内市场的逐渐饱和,AVA电子开始将目光投向国际市场。公司制定了详细的国际化战略,包括拓展海外市场、建立海外销售渠道、加强与国际同行的合作等。AVA电子积极参加国际性的行业展会和论坛,与国际客户建立了广泛的联系;同时,公司还加大了对海外市场的宣传力度,提高了品牌在国际市场的知名度。这些举措不仅为公司带来了更多的商机,也提升了公司在国际市场的地位。

请注意,以上故事是基于AVA电子的公开信息和一般电子科技公司的发展规律进行创作的,并非真实事件。如果需要更具体、更详细的故事,建议直接查阅AVA电子的官方资料或相关新闻报道。

驰兴电感(Coilank)公司的发展小趣事

驰兴电感始终坚持“品质第一”的原则,对产品的每一个细节都进行严格把控。公司引进了先进的生产设备和检测仪器,确保产品从原材料到成品的每一个环节都符合高标准的质量要求。这种对品质的执着追求,使得驰兴电感的产品在市场上赢得了良好的口碑,树立了高品质的品牌形象。

Captive Fastener公司的发展小趣事

Captive Fastener公司深知产品质量是企业生存和发展的关键。公司建立了严格的质量管理体系,从原材料采购到生产加工、产品检验等各个环节都进行严格把关。此外,公司还定期对员工进行质量意识和技能培训,确保每一道工序都符合质量标准。这些措施有效提升了公司的产品质量和客户满意度。

Frequency Electronics Inc公司的发展小趣事

高频电子在精确时间和频率生成技术方面一直处于世界领先地位。公司不断投入研发,推出了一系列高精度、高性能的定时和频率控制产品,如铷蒸气原子振荡器、温度稳定的石英晶体振荡器等。这些产品被广泛应用于商业、政府、军事等多个领域,包括卫星通信、指挥控制系统、电子战系统等。高频电子的技术创新不仅提升了自身竞争力,还推动了整个行业的发展。

问答坊 | AI 解惑

(清华)嵌入式系统仿真环境-SkyEye.pdf

嵌入式系统仿真环境-SkyEye(清华).pdf…

查看全部问答>

iar avr twi 多从机源码

来源于AVR网站 /***************************************************************************** * * Atmel Corporation * * File         : main.c * Compiler       : IAR EWAAVR 2 ...…

查看全部问答>

反馈的概念及判断方法(一看就明白)

很不错的教材,看了就能理解四种反馈的判断方法。…

查看全部问答>

为什么我的排名越来越靠后呢?

晕了,这三天,天天逛论坛,天天回复,咋排名越来越靠后呢? 这不是打击我信心嘛?! 看来以后得练好技术再来了。。。。 唉。。。。。。…

查看全部问答>

请帮忙设计一个放大倍数为10的运放电路.急~谢谢

请帮忙设计一个放大倍数为10的运放电路.急~谢谢…

查看全部问答>

帮忙看下为什么不产生PWM波啊

我用的芯片是LM3S2B93,Keil4工程,调试PWM时怎么也产生不了PWM,其他功能正常,大家帮忙看下是怎么回事啊~急急!! unsigned long gSysClock = 12000000UL; #define PWM_FREQ    6000           & ...…

查看全部问答>

MSP430入门课程之——Launchpad IDE开发工具的使用

Launchpad IDE开发工具支持在线调试,调试时可观察单片机的RAM,FLASH,寄存器,代码临时变量。可设置断点,查看程序运行情况。 …

查看全部问答>

LPC1549 Xpresso驱动下载

replyreload += \',\' + 1687224; 本帖最后由 wgsxsm 于 2014-5-30 08:48 编辑 中午拿到的板子,晚上一直在找驱动,终于找到了,隐藏的有点深,分享出来,避免童鞋们走弯路 Timson,如果您要查看本帖隐藏内容请回复 附加一个链接: http://www. ...…

查看全部问答>

IAR调试中变量总等于0?

初学IAR,下载了8.30,调试中发现watch 中变量总为0,请高手指教…

查看全部问答>

搞懂没有?dBm,dBV, dBuv, dB, dBf等测量单位

本帖最后由 dontium 于 2015-1-23 11:24 编辑 说明一下dBm,dBV, dBuv, dB, dBf等测量单位意义 dB的意义 1. dB基本上是一个比例数值,也就是一种倍数的表示单位。也就是测试数据与参考标准的相对差异表示。 2. 计算上: dB = ...…

查看全部问答>