·首页 ·单片机应用 ·pic单片机教程 ·arm学习教程 ·AVR单片机 ·DSP芯片 ·接口电路 ·无线通信 ·存储器 ·模拟电路
·电路图 ·嵌入式系统 ·WinCE ·ucLinux ·Vxworks ·ucOSII ·可编程逻辑器件 ·led显示屏 ·PCB设计 ·传感器技术 ·仪器仪表

单片机论文网>pic单片机教程>文章内容


上篇:使用PIC单片机读写1-wire EEPROM DS2430的范例程序
下篇:PIC12C508A/509A和PIC12CE518/519八脚单片机系列的特点

用HI-TECH C写的使用PIC12C508单片机读写93LC46范例程式

51c51  本站整理 

 
/************************************************************
* Processer : Microchip PIC12C508 *
* Compiler : Hi-TECH PICC 8.00 PL2 *
* Writer : Jason Kuo *
* Description : It can read/write 93LC46 (64 x 16-bit organization) *
*************************************************************/

static volatile unsigned char RTCC @ 0x01;
static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
static          unsigned char FSR @ 0x04;
static volatile unsigned char OSCCAL @ 0x05;
static volatile unsigned char GPIO @ 0x06;

static          unsigned char control OPTION @ 0x00;
static volatile unsigned char control TRIS @ 0x06;

/* STATUS bits */
static bit GPWUF @ (unsigned)&STATUS*8+7;
static bit PA0 @ (unsigned)&STATUS*8+5;
static bit TO @ (unsigned)&STATUS*8+4;
static bit PD @ (unsigned)&STATUS*8+3;
static bit ZERO @ (unsigned)&STATUS*8+2;
static bit DC @ (unsigned)&STATUS*8+1;
static bit CARRY @ (unsigned)&STATUS*8+0;

/* OPTION bits */
#define GPWU (1<<7)
#define GPPU (1<<6)
#define T0CS (1<<5)
#define T0SE (1<<4)
#define PSA (1<<3)
#define PS2 (1<<2)
#define PS1 (1<<1)
#define PS0 (1<<0)

/*      OSCCAL bits     */
static volatile bit     CAL3    @ (unsigned)&OSCCAL*8+7;
static volatile bit     CAL2    @ (unsigned)&OSCCAL*8+6;
static volatile bit     CAL1    @ (unsigned)&OSCCAL*8+5;
static volatile bit     CAL0    @ (unsigned)&OSCCAL*8+4;

static volatile bit GP5 @ (unsigned)&GPIO*8+5;
static volatile bit GP4 @ (unsigned)&GPIO*8+4;
static volatile bit GP3 @ (unsigned)&GPIO*8+3;
static volatile bit GP2 @ (unsigned)&GPIO*8+2;
static volatile bit GP1 @ (unsigned)&GPIO*8+1;
static volatile bit GP0 @ (unsigned)&GPIO*8+0;

#define CONFIG_ADDR 0xFFF

/* code protection */
#define MCLREN 0xFFFF // memory clear enable
#define MCLRDIS 0xFFEF // memory clear disable

/*watchdog*/
#define WDTEN 0xFFFF // watchdog timer enable
#define WDTDIS 0xFFFB // watchdog timer disable

/* code protection */
#define PROTECT 0xFFF7 // protect the program code
#define UNPROTECT 0xFFFF // do not protect the program code

/*osc configurations*/
#define EXTRC   0xFFFF // external resistor/capacitor
#define INTRC 0xFFFE // internal
#define XT 0xFFFD // crystal/resonator
#define LP 0xFFFC // low power crystal/resonator

/* 93LC46 I/O pin define */
#define CS GP0 //Chip Select
#define CLK GP1 //Serial Data Clock
#define DI GP2 //Serial Data Input
#define DO GP4 //Serial Data Output

void Delay(unsigned int counter);
void Pulse(void);
void StartBit(void);
void EWEN(void);
void EWDS(void);
extern void Write93LC46(unsigned char Offset_Addr, unsigned int tx_data); 
extern unsigned int Read93LC46(unsigned char Offset_Addr);
void InitPIC(void);

#define CLRWDT() asm(" clrwdt")
#define SLEEP() asm(" sleep")

#define ___mkstr1(x) #x
#define ___mkstr(x) ___mkstr1(x)
#define __CONFIG(x) asm(" psect config,class=CONFIG,delta=2");
asm(" global config_word");
asm("config_word");
asm(" dw "___mkstr(x))

#define __IDLOC(w)       asm(" psect idloc,class=IDLOC,delta=2");
asm(" global idloc_word");
asm("idloc_word");
asm(" irpc __arg," ___mkstr(w));
asm(" dw 0&__arg&h");
asm(" endm")


__CONFIG(MCLRDIS & WDTDIS & EXTRC & PROTECT);


/*----------------------------------------------------
Function : Delay
Input : unsigned int (counter)
Output : None
Description : Delay routine
if counter=1  delay 35us , if counter=10 delay 134us,
if counter=100 delay 1.12ms,
These delay is base on internal 4MHz
------------------------------------------------------*/     
void Delay(unsigned int counter)
{
   while(counter>0) counter--; 
}                                    


/*----------------------------------------------------
Function : Pulse
Input : None
Output : None
Description : Send a pulse (10) to Serial Data Clock(CLK)
------------------------------------------------------*/     
void Pulse(void)
{
    CLK = 1;
    Delay(25);
    CLK = 0;
}

/*----------------------------------------------------
Function : StartBit
Input : None
Output : None
Description :
1. Set Chip Select(CS) = 1 (high)
2. Set a Start Bit(1) to Serial Data Input(DI)
------------------------------------------------------*/     
void StartBit(void)
{
    CS = 1;
    DI = 1;
    Pulse();
}

/*----------------------------------------------------
Function : EWEN
Input : None
Output : None
Description : ERASE/WRITE Enable
------------------------------------------------------*/     
void EWEN(void)
{
    unsigned char i,temp;

    StartBit();                  /* 1 */

    temp = 0x80;                        /* 0011xxxx ,(opcode:00, Address:11xxxx) */
    for(i=0; i<8; i++) {
        if(0x30 & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }

    CS = 0;
}

/*----------------------------------------------------
Function : EWDS
Input : None
Output : None
Description : ERASE/WRITE Disable
------------------------------------------------------*/     
void EWDS(void)
{
    unsigned char i;

    StartBit();                  /* 1 */

    DI = 0;                       /* 0000xxxx, (opcode:00, Address:00xxxx) */
    for(i=0; i<8; i++)
        Pulse();

    CS = 0;
}

/*----------------------------------------------------
Function : Write93LC46
Input : unsigned char Offset Address, unsigned int tx_data
Output : None
Description : Write 16bits data in to 93LC46 Offset Address
------------------------------------------------------*/     
void Write93LC46(unsigned char Offset_Addr, unsigned int tx_data)
{
    unsigned char Addr, i;
    unsigned int temp;

    EWEN();

    StartBit();                  /* 1 */
    Offset_Addr=Offset_Addr&0x3F; /* 6bits address */
    Addr = Offset_Addr + 0x40;          /* 01AAAAAA ,(opcode:01, address:AAAAAA) */
    temp = 0x0080;
    for(i=0; i<8; i++) {
        if(Addr & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }

    temp = 0x8000;                      /* DDDDDDDDDDDDDDDD(16bits data)*/
    for(i=0; i<16; i++) {
        if(tx_data & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }
    CS = 0;

    EWDS();
}

/*----------------------------------------------------
Function : Read93LC46
Input : unsigned char Offset Address
Output : unsigned int
Description : Read 16bits data from 93LC46 offset address
------------------------------------------------------*/     
unsigned int Read93LC46(unsigned char Offset_Addr)
{
    unsigned char Addr, i, temp;
    unsigned int  rx_data;

    StartBit();                   /* 1 */
    Offset_Addr = Offset_Addr&0x3F; /* 6bits address */
    Addr = Offset_Addr + 0x80;           /* 10AAAAAA ,(opcode:10, address:AAAAAA) */
    temp = 0x80;
    for(i=0; i<8; i++) {
        if(Addr & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }

    rx_data = 0x0000;                    /* DDDDDDDDDDDDDDDD(16bits data)*/
    for(i=0; i<16; i++) {
        Pulse();
        if(DO)
            rx_data |= 0x0001;
        if(i < 15)
            rx_data <<= 1;
    }
    CS = 0;

    return(rx_data);
}

void InitPIC(void)
{
    OPTION = (GPWU | GPPU | PS2 | PS1 | PS0);
    TRIS = 0x10;  
    CS = 0;
    CLK = 0;
    DI = 0;   
}

/* Main routine */
void main(void)
{
unsigned char addr;
unsigned int rx_buf;

InitPIC();
/* Read a word then +1 and write back to 93LC46 */
for (addr = 0; addr < 10; addr++)
{
rx_buf = Read93LC46(addr);
rx_buf = rx_buf+1;
Write93LC46(addr, rx_buf);
}

}

相关资料:
·使用PIC单片机读写1-wire EEPROM DS2430的范例程序
·PIC12C508A/509A和PIC12CE518/519八脚单片机系列的特点
·PIC单片机实现CRC的小程序
·PIC12C508A/509A和PIC12CE518/519八脚单片机系列的特点
·PIC16C55单片机控制多用电子钟(附源程序
·PIC单片机数据存储器的特点和功能
·PIC16C54单片机在神经刺激器中的应用
·自制PIC编程器
·PIC单片机程序设计的基本格式
·小议编写PIC单片机源程序应注意的问题
·PIC系列单片机程序设计基础一
·Wineows下PIC 8位单片机源程序汇编和固化

Copyright © 2004-2007 单片机论文网 - 免责条款