C51 单片机 读取93C64

发布者:SunshineHope最新更新时间:2018-12-19 来源: eefocus关键字:C51  单片机  读取93C64 手机看文章 扫描二维码
随时随地手机看文章

这里写图片描述

#include  

#include


//define OP code

#define OP_EWEN_H       0x00    // 00                   write enable

#define OP_EWEN_L       0x60    // 11X XXXX             write enable

#define OP_EWDS_H       0x00    // 00                   disable

#define OP_EWDS_L       0x00    // 00X XXXX             disable

#define OP_WRITE_H      0x40    // 01 A6-A0             write data

#define OP_READ_H       0x80    // 10 A6-A0             read data

#define OP_ERASE_H      0xc0    // 11 A6-A0             erase a word

#define OP_ERAL_H       0x00    // 00                   erase all

#define OP_ERAL_L       0x40    // 10X XXXX             erase all

#define OP_WRAL_H       0x00    // 00                   write all   

#define OP_WRAL_L       0x20    // 01X XXXX             write all   

//define pin

sbit CS = P1^3;

sbit SK = P1^2;

sbit DI = P1^1;

sbit DO = P1^0;


void start();

void ewen();

void ewds();

void erase();

void write(unsigned char addr, unsigned char indata);

unsigned char read(unsigned char addr);

void inop(unsigned char op_h, unsigned char op_l);

void shin(unsigned char indata);

unsigned char shout();



//*********************************************************

void delayms(unsigned int ms)   

// 延时子程序

{                       

    unsigned char i;

    while(ms--)

    {

        for(i = 0; i < 120; i++);

    }

}

//*********************************************************


//*********************************************************

void write(unsigned char addr, unsigned char indata)

// 写入数据indata到addr

{

    inop(OP_WRITE_H, addr);         // 写入指令和地址

        shin(indata);

        CS = 0;

    delayms(10);                        // Twp

}

//*********************************************************

unsigned char read(unsigned char addr)

// 读取addr处的数据

{

    unsigned char out_data;

    inop(OP_READ_H, addr);          // 写入指令和地址

    out_data = shout();

    CS = 0; 

    return out_data;

}

//*********************************************************

void ewen()

{

    inop(OP_EWEN_H, OP_EWEN_L);

    CS= 0;

}

//*********************************************************

void ewds()

{

    inop(OP_EWDS_H, OP_EWDS_L);

    CS= 0;  

}

//*********************************************************

void erase()

{

    inop(OP_ERAL_H, OP_ERAL_L);

    delayms(30);

    CS = 0;

}

//*********************************************************

void inop(unsigned char op_h, unsigned char op_l)

//移入op_h的高两位和op_l的低7位

//op_h为指令码的高两位

//op_l为指令码的低7位或7位地址

{   

    unsigned char i;    

    SK = 0;                         // 开始位

    DI = 1;

    CS = 1;

    _nop_();

    _nop_(); 

    SK = 1;

    _nop_();

    _nop_();

    SK = 0;                         // 开始位结束

    DI = (bit)(op_h & 0x80);    // 先移入指令码高位

    SK = 1;

    op_h <<= 1;

    SK = 0;     

    DI = (bit)(op_h & 0x80);    // 移入指令码次高位

    SK = 1;

    _nop_();

    _nop_();    

    SK = 0; 

                                        // 移入余下的指令码或地址数据

    op_l <<= 1; 

    for(i = 0; i < 7; i++)      

    {

        DI = (bit)(op_l & 0x80);// 先移入高位

        SK = 1;

        op_l <<= 1;

        SK = 0;     

    }

    DI = 1;     

}

//*********************************************************

void shin(unsigned char indata)     

                                        //移入数据

{

    unsigned char i;

    for(i = 0; i < 8; i++)

    {

        DI = (bit)(indata & 0x80);// 先移入高位

        SK = 1;

        indata <<= 1;

        SK = 0;     

    }

    DI = 1;

}

//*********************************************************

unsigned char shout(void)           

// 移出数据

{

    unsigned char i, out_data;

    for(i = 0; i < 8; i++)

    {

        SK = 1;

        out_data <<= 1;

        SK = 0;

        out_data |= (unsigned char)DO;

    }

    return(out_data);

}


/***********************************************************

*       系统毫秒延时

*

************************************************************/

void mdelay(unsigned int m)

{

    preTime = (unsigned long int)(m + SysTick);

    while(preTime > SysTick)

    {

        _nop_();    

    }   

}


/***********************************************************

*       系统秒延时

*

************************************************************/

void sdelay(unsigned int s)

{

    preTime = (unsigned long)((s * 1000) + SysTick);

    while(preTime > SysTick)

    {

        _nop_();    

    }

}


void main()

{

    CS = 0;                         //初始化端口

    SK = 0;

    DI = 1;

    DO = 1;

    ewen();                         // 使能写入操作

    erase();                        // 擦除全部内容   


    write(0x01, 0xaa); // 93C46的0x01地址写入 0xaa;


    while(1)

    {

        P0 = read(0x01); // 从93C46读取0x01地址数据

    }

}

关键字:C51  单片机  读取93C64 引用地址:C51 单片机 读取93C64

上一篇:51单片机 主循环和中断共享全局变量的冲突
下一篇:C51 Timer 计数器

推荐阅读最新更新时间:2024-03-16 16:20

基于PIC16F87X系列单片机开发的高精度数据采集器
1ADS1210引脚及功能   ADS1210是一种高精度、宽动态范围,采用单5V电源供电,具有24位分辨率的新型A/D转换器。封装形式有18脚双列直插式和18线贴片式,引脚功能描述如表1。    ●指令寄存器(INSR)   指令寄存器是一个8位寄存器,它指明了系统是进行读操作还是写操作,并确定读/写操作的字节长度以及读/写操作寄存器的起始地址。   ●命令寄存器(CMR)   命令寄存器是ADS1210的关键,它控制着ADS1210的所有特性功能。一旦串口时钟的下降沿将数据字节的最后一位写入命令寄存器,新的模式就开始生效。命令寄存器控制ADS1210所选用的选项和操作模式,包括可编程增益放大器的增益(G)设置、增强模
[单片机]
基于PIC16F87X系列<font color='red'>单片机</font>开发的高精度数据采集器
为什么要对单片机系统进行扩展?
单片机应用系统开发时,首先遇到的问题就是存储器的扩展。因为单片机内部的存储器容量一般都比较小,因此,从单片机外部配置外部存储器,包括程序存储器和数据存储器,就成了应用系统的重要工作之一。 此外,单片机内部虽然配置了若干并行I/O接口。但是,当外部设备较多时,原有的几个内部I/O接口就不够使用。所以,在大多数单片机应用系统中都需要扩展输入输出接口芯片,以满足输入输出的需要。
[单片机]
PIC单片机AD转换汇编程序
;此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入 ;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下 ;时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结 ;果用间接寻址的方式存取。 LIST P=18F458 INCLUDE "P18F458.INC" TIMES EQU 0X20 DEY EQU TIMES+1 ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器 ACCAHI EQU TIMES+3 ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器
[单片机]
英飞凌推出具有 USB-C PD 和升降压充电控制器的高压 MCU,简化嵌入式系统设计
英飞凌推出具有 USB-C PD 和升降压充电控制器的高压 MCU,简化嵌入式系统设计 【2023 年 03 月 29日,德国慕尼黑讯】 USB-C已被消费电子行业广泛采用为首选连接器,有望取代大多数高达 240 W 的传统电源适配器。随着全球过渡到采用基于 USB-C 的直流电源,快速充电协议日渐普及,电源的功能性和用户体验也得到进一步提升 。为满足这一趋势带来的需求,英飞凌科技股份公司推出 EZ-PD™ PMG1-B1,进一步完善了具有 USB-C 电力传输(PD)功能的 EZ-PD PMG1 系列高压微控制器(MCU)产品。 PMG1-B1 PD MCU 是集 USB-C PD 控制器、升降压电池充电控制器、
[嵌入式]
英飞凌推出具有 USB-C PD 和升降压充电控制器的高压 <font color='red'>MCU</font>,简化嵌入式系统设计
基于51单片机自行车码表设计
由于仿真中没有霍尔传感器,实际呢霍尔就是感应磁信号,输出高低电平的脉冲信号,这样用脉冲就可以了,不同的频率代表电机转速的快慢 制作出来的实物图如下: 自行车码表元件清单 1) 9*15万用板 2) AT89C51单片机 3) 40脚IC座 4) 1602液晶 5) 16p母座 6) 16p排针 7) 10k电阻 8) 1K电阻 9) 轻触按键 10) 5MM LED灯(红色) 11) 103电位器 12) 3v直流电机 13) 直流电机底座 14) 磁铁*2 15) 501电位器 16) 3144霍尔传感器 17) 10uf电解电容 18) 30pf瓷片电容*2 19) 12M晶
[单片机]
基于51<font color='red'>单片机</font>自行车码表设计
基于ATmega16 单片机的干式变压器 智能温度控制器设计
1工作原理    温控仪由温度监测、信号处理、输出控制三部分组成。系统框图如图1所示,它通过预埋在 变压器三相绕组中的三只铂电阻传感器获取绕组温度值,经信号调理电路处理后直接送入控 制器的A/D转换输入端。微控制器根据信号数据及设定的各种控制参数,按照嵌入的软件控 制规律执行计算与处理,自动显示变压器绕组的温度值、输出相应的控制信号、控制风机的 启停,并根据当前状态输出正常、报警和跳闸信号等,同时将各种数据通过RS-485传到上 位机实现集中监控。    温控仪控制核心采用ATmegal6单片机,它是一款基于AVR RISC的低功耗CMOS 8位单片机,在 一个时钟周期内执行一条指令,可以取得1MIPS/MHz的性能,因
[单片机]
基于ATmega16 <font color='red'>单片机</font>的干式变压器 智能温度控制器设计
单片机串口设置问题
最近测试涉及到底层串口代码的修改。经过这次修改,突然发现其实自己对于串口的一些特性以前并不是十分清楚。 首先遇到的一些问题: 1)在使用IO的数据位的时候,没有考虑校验位所占的位数。 2)在设置串口输入的时候,使用悬空输入。 关于1),在一次使用 STM32 串口参数9600,N,8,1与另一个 8051MCU通信的时候发现偶校验没有问题,但是无校验通信就出现异常。但是,当将 STM32 与电脑通信的时候,偶校验与无校验通信又完全都是正确的。8051MCU单独与电脑通信也都是完全正确的。查看代码,还真不知道有什么不对劲的。因为这段代码,用了很长时间了。后来一个同事看代码后,提醒说对于数据位的设置,偶校验和无校验是一致的,既然没有数
[单片机]
8位单片机中如何对16位INT型数据进行操作?
在 8位单片机 中没有16位数的操作指令,所有的int型数据都要通过两个字节分开操作,使用的方法不用,生成的代码也不相同,当然效率也不一样,通过指针对16位数进行操作可以得到高效的代码。 比如通过串行口接收数据,或者从串行的EEPROM中读取的数据,或者从大于8位的A/D读取的数据,由于 8位单片机 的数据线是8位的,高于8位的数据都要分成两个字节分别读取,然后写入到RAM中去再进行计算,或者把16位的int型数据从RAM中读出再分别把高低字节存到EEPROM或者送到D/A,或者通过串行口发送出去,方法有很多种,下面用多种方法进行实现该操作,这里只演示写入到16位的情况,读取的情况非常相似,不赘述。 (1)使用联合 (un
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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