機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
C51讀寫EEPROM(93C46)
C51讀寫EEPROM(93C46)
 更新時間:2008-7-27 16:09:15  點(diǎn)擊數(shù):2
【字體: 字體顏色

#i nclude <reg51.h>
#define inbuf_len 4   //數(shù)據(jù)長度
#define anbuf_len 2

sbit cs=p3^4;
sbit sk=p3^3;
sbit di=p3^5;
sbit do=p3^6;

void delay(void);
unsigned char inbuf1[inbuf_len],anbuf[anbuf_len];
unsigned char checksum,count3,count2;
bit           read_flag=0,flag=0;

void init_serialcomm(void)
{
    tmod=0x21;//設(shè)置定時器1的工作方式與初值,9600kb/s
 th0=0xf8;
    tl0=0xcd;//`
//    tr0=1;
 //   et0=1;
 th1=0xfd;
 tl1=0xfd;
 scon=0x50;
 pcon=0x00;
 tr1=1;
 es=1;//打開串口中斷。
 ea=1;
}

//向串口發(fā)送一個字符
void send_char_com(unsigned char ch) 
{
    sbuf=ch;
    while(ti==0);
    ti=0;
}

//向串口發(fā)送一個字符串,strlen為該字符串長度
void send_string_com(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do
    {
        send_char_com(*(str + k));
        k++;
    } while(k < strlen);
}


//串口接收中斷函數(shù)
void serial () interrupt 4 using 3
{
    if(ri)
    {
        unsigned char ch;
        ri = 0;
        ch=sbuf;
        if(ch>97)
        {
             anbuf[count2]=ch;
    count2++;
             if(count2==anbuf_len)
             {
              flag=1;  //如果串口接收的數(shù)據(jù)達(dá)到inbuf_len個,且校驗(yàn)沒錯,
                count2=0;             //就置位取數(shù)標(biāo)志
    
             }
  }
        else
        {
            
             inbuf1[count3]=ch;
    checksum ^= ch;
    count3++;
             if(count3==inbuf_len)
             {
                 read_flag=1;  //如果串口接收的數(shù)據(jù)達(dá)到inbuf_len個,且校驗(yàn)沒錯,
                 count3=0;             //就置位取數(shù)標(biāo)志
             }
        }
    }
}
/*
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();
}


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)
{         //*ramaddress 要寫入93c46的值的地址
 unsigned int temp;     //romaddress 93c46的地址
 if(number==0) return;    // number  數(shù)據(jù)長度
 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);
}
void main()
{
 unsigned char data ramaddress[3]={1,9,0x12};
 unsigned char romaddress;
 unsigned char number;
 init_serialcomm();
 romaddress=0x20;
 number=0x03;
 writestring(ramaddress,romaddress,number);
 while(1)
 {
  if(flag)
  {
  // romaddress=0x20;
  // number=0x03;
   readstring(ramaddress,romaddress,number);
   send_string_com(ramaddress,3);
   flag=0;
  }
  }
}

  • 上一篇: C語言運(yùn)算符及優(yōu)先等級
  • 下一篇: Keil軟件仿真的串口調(diào)試技巧
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1