老古开发网首页
导航:老古开发网首页文章索引文章分类单片机→[93c46读写程序]
| -文章搜索 - 最新文章 - |

93c46读写程序

发布时间:2005年12月30日 点击次数:3362
来源:   作者:
 
“93c46读写程序”
#include <reg52.h>
sbit CS=P2^7;
sbit SK=P2^6;
sbit DI=P2^5;
sbit DO=P2^4;

/*
extern unsigned char ReadChar(unsigned char address);
extern void WriteChar(unsigned char address,unsigned char InData);
extern void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,
unsigned char Number);
extern void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
*/

// Write enable must precede all programming modes.
void Ewen(void) {
 unsigned char temp,InData;
 CS=0; 
 SK=0;
 CS=1;
 InData=0x98; // 10011XXXX
 for(temp=9;temp!=0;temp--) { // 9
  DI=InData&0x80;
  SK=1; SK=0;
  InData<<=1;
 }
 CS=0;
}

// Disables all programming instructions.
void Ewds(void) {
 unsigned char temp,InData;
 CS=0;
 SK=0;
 CS=1;
 InData=0x80; // 10000XXXX
 for(temp=9;temp!=0;temp--) { // 9
  DI=InData&0x80;
  SK=1; SK=0;
  InData<<=1;
 }
 CS=0;
}

// Reads data stored in memory, at specified address.
unsigned int Read(unsigned char address) {
 unsigned char temp;
 unsigned int result;
 Ewen();
 SK=0; DI=1; // 110 A5-A0
 CS=0; CS=1;
 SK=1; SK=0;   // 1
 address=address&0x3f 0x80;
 for(temp=8;temp!=0;temp--) { // 8
  DI=address&0x80;
  SK=1; SK=0;
  address<<=1;
 }
 DO=1;
 for(temp=16;temp!=0;temp--) { // 16
  SK=1;
  result=(result<<1) DO;
  SK=0;
 }
 CS=0;
 Ewds();
 return(result);
}

// Writes memory location An - A0.
void Write(unsigned char address,unsigned int InData) {
 unsigned char temp;
 Ewen();
 SK=0; DI=1; // 101 A5-A0
 CS=0; CS=1;
 SK=1; SK=0;   // 1
 address=address&0x3f 0x40;
 for(temp=8;temp!=0;temp--) { // 8
  DI=address&0x80;
  SK=1; SK=0;
  address<<=1;
 }
 for(temp=16;temp!=0;temp--) { // 16
  DI=InData&0x8000;
  SK=1; SK=0;
  InData<<=1;
 }
 CS=0; DO=1;
 CS=1; SK=1;
 while(DO==0) {   // busy test
  SK=0; SK=1;
 }
 SK=0; CS=0;
 Ewds();
}

/*
// Erase memory location An - A0.
void Erase(unsigned char address) {
 unsigned char temp;
 Ewen();
 SK=0; DI=1; // 111 A5-A0
 CS=0; CS=1;
 SK=1; SK=0;   // 1
 address =0xc0;
 for(temp=8;temp!=0;temp--) { // 8
  DI=address&0x80;
  SK=1; SK=0;
  address<<=1;
 }
 CS=0; DO=1;
 CS=1; SK=1;
 while(DO==0) {
  SK=0; SK=1;
 }
 SK=0; CS=0;
 Ewds();
}

// Erases all memory locations. Valid only at VCC = 4.5V to 5.5V.
void Eral(void) {
 unsigned char temp,InData;
 Ewen();
 CS=0;
 SK=0;
 CS=1;
 InData=0x90; // 10010XXXX
 for(temp=9;temp!=0;temp--) { // 9
  DI=InData&0x80;
  SK=1; SK=0;
  InData<<=1;
 }
 CS=0; DO=1;
 CS=1; SK=1;
 while(DO==0) {
  SK=0; SK=1;
 }
 SK=0; CS=0;
 Ewds();
}

// Writes all memory locations. Valid only at VCC = 4.5V to 5.5V.
void Wral(unsigned int InData) {
 unsigned char temp,address;
 Ewen();
 CS=0;
 SK=0;
 CS=1;
 address=0x88; // 10001XXXX
 for(temp=9;temp!=0;temp--) { // 9
  DI=address&0x80;
  SK=1; SK=0;
  address<<=1;
 }
 for(temp=16;temp!=0;temp--) { // 16
  DI=InData&0x8000;
  SK=1; SK=0;
  InData<<=1;
 }
 CS=0; DO=1;
 CS=1; SK=1;
 while(DO==0) {
  SK=0; SK=1;
 }
 SK=0; CS=0;
 Ewds();
}

*/

unsigned char ReadChar(unsigned char address) {
 unsigned char temp=address>>1;
 if(address&0x01) return((unsigned char)(Read(temp)>>8));
 else return((unsigned char)(Read(temp)));
}

void WriteChar(unsigned char address,unsigned char InData) {
 unsigned char temp=address>>1;
 if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff (InData<<8)));
 else Write(temp,(unsigned int)(Read(temp)&0xff00 InData));
}

void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {
 while(Number!=0) {
  *RamAddress=ReadChar(RomAddress);
  RamAddress++;
  RomAddress++;
  Number--;
 }
}

void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {
 unsigned int temp;
 if(Number==0) return;
 if(RomAddress&0x01) {
  WriteChar(RomAddress,*RamAddress);
  RamAddress++;
  RomAddress++;
  Number--;
 }
 if(Number==0) return;
 while(Number>>1) {
  temp=*RamAddress;
  RamAddress++;
  temp=temp (*RamAddress)<<8;
  RamAddress++;
  Write(RomAddress>>1,temp);
  RomAddress++;
  RomAddress++;
  Number--;
  Number--;
 }
 if(Number) WriteChar(RomAddress,*RamAddress);


欢迎进入老古论坛进行讨论
[单片机] 相关文章:
RS-232-C端口实时监控软件的设计实现
简介:
本文介绍了在Microsoft Visual C++ 6.0环境下对RS-232-C串行端口进行编程,以及对后台监控程序所普遍涉及到的无阻塞后台运行、数据的实时接收和处理等问题的解决方法。    一、 引言   在实验室和工业应用中,受信道成本限制,串口常常作为计算机与外部串行设备之间的首选数据传输通道,而且由于串行通信方便易行,许多设备和计算机都可以通过串口对外设进行控制、检测,串口通讯日益成为计算机和外设进行通讯、获取由外设采集到的监测数据的一个非常重要的手段。本文所描述的程序实例运行于Windows 9x操作系统下,可后台运行、实时接收、处理从端口传来的数据,并能通过向串口发送命令......

单片机入门的几点建议
单片机自动报时控制器
凌阳16位MCU一改台湾芯片抗干扰性差软肋,EMC测试达国标最高标准
凌阳30万重金奖励全国大学生电子竞赛的部分获奖参赛队
温度传感器ds1820 的汇编程序
在电子防震技术中,有那些IC或器件可供选择?
当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好?
单片机控制板的设计原则
单片机D/A满量程输出却只有4.54V的原因分析
 
下一个:[通信网络]浅析PC机串口通讯流控制
简介:
我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的。那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。 1.流控制在串行通讯中的作用 这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。现在我......
 

上一个:[嵌入式系统]双机容错实时嵌入式系统设计与分析

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:219毫秒