?? x50451.c
字號:
/*------------------- x5045.c ----------------------------*/
/*------------------- 使用AT89C2051模擬SPI總線程序 ------------------------*/
/*---------- 從機器件為X5045,看門狗、復位芯片、自帶4Kbit EEPROM存儲器 -------*/
/*----------------- Name:lilac Time:2006.7.22 ----------------*/
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
sbit SCK =P3^2; // SPI協(xié)議串行時鐘
sbit MOSI =P3^3; // SPI協(xié)議主機輸出從機輸入
sbit MISO =P3^4; // SPI協(xié)議主機輸入從機輸出
sbit WCS =P3^5; // 喂狗信號、從機選擇
sbit DI =P1^3; // LED數(shù)碼管顯示串行數(shù)據(jù)
sbit CLK1 =P1^2; // LED數(shù)碼管顯示串行時鐘
sbit PWR_OK =P1^6; // 正確上電復位指示
sbit CTRL =P1^7; // LED數(shù)碼管顯示開關控制
#define unchar unsigned char
#define unint unsigned int
#define WREN 0x06 // 置位WEL標識位指令
#define WRDI 0x04 // 清零WEL標識位指令
#define RDSR 0x05 // 讀狀態(tài)寄存器指令
#define WRSR 0x01 // 寫狀態(tài)寄存器指令
#define READ_UPPER 0x0b // 讀4Kbit EEPROM的一半高地址存儲器指令
#define READ_LOWER 0x03 // 讀4Kbit EEPROM的一半低地址存儲器指令
#define WRITE_UPPER 0x0a // 寫4Kbit EEPROM的一半高地址存儲器指令
#define WRITE_LOWER 0x02 // 寫4Kbit EEPROM的一半低地址存儲器指令
#define PROTECT_ALL 0x0c // 對4Kbit EEPROM全部寫保護,看門狗溢出時間為1.4秒
#define PROTECT_HALF 0x08 // 對4Kbit EEPROM地址空間0x100-0x1FF寫保護,看門狗溢出時間為1.4秒
#define PROTECT_QUAR 0x04 // 對4Kbit EEPROM地址空間0x180-0x1FF寫保護,看門狗溢出時間為1.4秒
#define NO_PROTECT 0x00 // 對4Kbit EEPROM全部不寫保護,看門狗溢出時間為1.4秒
#define delaynop() { _nop_(); _nop_(); }; // 時間延時
unchar code ledseg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共陰極顯示段碼
/* ------------------ x5045操作函數(shù)部分 ----------------- */
void delay2ms(unsigned int delay) // 延時程序由Delay參數(shù)確定延遲時間
{
unsigned int i;
for(;delay>0;delay--)
{
for(i=0;i<124;i++)
;
}
}
void write_wel(unchar instr) // 對WEL寄存器的置位和復位操作
{
unchar n=8;
WCS=0;
SCK=1;
while(n--)
{
SCK=0;
if((instr & 0x80)==0x80)
MOSI=1;
else
MOSI=0;
instr=instr<<1;
SCK=1;
}
WCS=1;
}
void send_byte(unchar da) // 向從機發(fā)送一個字節(jié)的數(shù)據(jù)
{
unchar n=8; // 向SDA上發(fā)送一數(shù)據(jù)字節(jié),共八位
SCK = 1 ; // 時鐘置高
while(n--)
{
SCK = 0 ; // 時鐘置低
if((da & 0x80) == 0x80) // 若要發(fā)送的數(shù)據(jù)最高位為1則發(fā)送位1
MOSI = 1; // 傳送位1
else
MOSI = 0; // 否則傳送位0
da = da <<1; // 數(shù)據(jù)左移一位
SCK = 1 ; // 時鐘置高
}
}
unchar receive_byte() // 從數(shù)據(jù)線接收一個字節(jié)的數(shù)據(jù)
{
unchar n=8; // 從MISO線上讀取一上數(shù)據(jù)字節(jié),共八位
unchar tmp;
SCK = 1; // 時鐘為高
MISO=1;
while(n--)
{
SCK = 0; // 時鐘為低
tmp = tmp <<1; // 左移一位
if(MISO == 1)
tmp = tmp | 0x01; // 若接收到的位為1,則數(shù)據(jù)的最后一位置1
else
tmp = tmp & 0xfe; // 否則數(shù)據(jù)的最后一位置0
SCK =1;
MISO=1;
}
return(tmp);
}
void write_char(unchar instr,unchar addr,unchar da) // 對指定地址的存儲器空間的寫操作
{
WCS=0; // 選擇從機
send_byte(instr);
send_byte(addr);
send_byte(da);
WCS=1;
delay2ms(3); // 延時6ms,內部存儲器寫周期
}
void write_string(unchar instr,unchar addr,unchar *da) // 連續(xù)16字節(jié)寫EEPROM存儲器模式
{
unchar tmp;
unchar i;
WCS=0; // 選擇從機
send_byte(instr);
send_byte(addr);
for(i=0;i<16;i++)
{
tmp=da[i];
send_byte(tmp);
}
WCS=1; // 從機選擇線置位,結束數(shù)據(jù)傳送
delay2ms(3); // 延時6ms,內部存儲器寫周期
}
unchar read_char(unchar instr,unchar addr) // 從指定地址的存儲空間讀取一個字節(jié)的數(shù)據(jù)
{
unchar tmp=0;
WCS = 0; // 選擇從機
send_byte(instr);
send_byte(addr);
tmp = receive_byte();
WCS=1; // 從機選擇線置位,結束數(shù)據(jù)傳送
return tmp;
}
void read_string(unchar instr,unchar addr,unchar *da) // 連續(xù)16字節(jié)讀EEPROM存儲器模式
{
unchar tmp;
unchar i;
WCS = 0; //選擇從機
send_byte(instr);
send_byte(addr);
tmp=0;
for(i=0;i<16;i++)
{
tmp = receive_byte();
da[i]=tmp;
}
WCS=1; // 從機選擇線置位,結束數(shù)據(jù)傳送
}
unchar read_sr(unchar instr) // 讀狀態(tài)寄存器
{
unchar tmp;
WCS = 0; // 選擇從機
send_byte(instr);
tmp=0;
tmp = receive_byte();
WCS=1;
return tmp; // 返回狀態(tài)寄存器的值
}
void write_sr(unchar instr,unchar da)
{
WCS = 0; // 選擇從機
send_byte(instr);
send_byte(da);
WCS=1; // 從機選擇線置位,結束數(shù)據(jù)傳送
delay2ms(3);
}
void softdog() // 產生喂狗信號
{
WCS=1;
_nop_();
WCS=0;
_nop_();
WCS=1;
}
void clear_mem(unchar be,unchar end) // 一定地址空間的存儲器清零
{
for(;be<=end;be++)
{
write_wel(WREN);
WCS=0; // 選擇從機
send_byte(WRITE_LOWER);
send_byte(be);
send_byte(0);
WCS=1;
delay2ms(3); // 延時6ms,內部存儲器寫周期
softdog();
}
}
/* ---------------------- 測試程序部分 ----------------------------- */
void main(void)
{
unchar data da1=76;
unchar code trydata[]={1,2,3,4,5,6,7,8,9,80,70,60,50,40,30,20};
unchar data buf[17]={0};
unchar rs;
unchar i;
PWR_OK=0;
CTRL=1;
to_bcd(rs,showbuf);
txdbyte(showbuf[1]);
txdbyte(showbuf[0]);
CTRL=0;
write_wel(WREN);
write_char(WRITE_LOWER,0x50,da1);
rs =0;
rs = read_char(READ_LOWER,0x50);
CTRL=1;
to_bcd(rs,showbuf);
txdbyte(showbuf[1]);
txdbyte(showbuf[0]);
CTRL=0;
delay2ms(200);
softdog();
write_wel(WREN);
write_sr(WRSR,NO_PROTECT);
rs=0;
rs=read_sr(RDSR);
CTRL=1;
to_bcd(rs,showbuf);
txdbyte(showbuf[1]);
txdbyte(showbuf[0]);
CTRL=0;
delay2ms(200);
write_wel(WREN);
write_string(WRITE_LOWER,0x00,trydata);
read_string(READ_LOWER,0x00,buf);
while(1)
{
for(i=0;i<16;i++)
{
CTRL=1;
to_bcd(buf[i],showbuf);
txdbyte(showbuf[1]);
txdbyte(showbuf[0]);
CTRL=0;
delay2ms(200);
softdog();
}
}
}
/*
unchar addr;
unchar tmp;
for(addr=0;addr<128;addr++)
{
tmp=0;
tmp = read_char(READ_LOWER,addr);
CTRL=1;
to_bcd(tmp,showbuf);
txdbyte(showbuf[1]);
txdbyte(showbuf[0]);
CTRL=0;
PWR_OK=0;
delay2ms(100);
PWR_OK=1;
delay2ms(100);
softdog();
}
PWR_OK=0;
delay2ms(400);
PWR_OK=1;
softdog();
clear_mem(0x00,0x80);
while(1)
{
for(addr=0;addr<128;addr++)
{
tmp=0;
tmp = read_char(READ_LOWER,addr);
CTRL=1;
to_bcd(tmp,showbuf);
txdbyte(showbuf[1]);
txdbyte(showbuf[0]);
CTRL=0;
PWR_OK=0;
delay2ms(100);
PWR_OK=1;
delay2ms(100);
softdog();
}
}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -