Ⅰ 單片機中如何實現永久保存某一程序中的數據
可以外接EEPROM 24C02,下面的程序你可以參考,改動後使用,我試過,讀寫都正常
;**************************************************/
#define uchar unsigned char
#define uint unsigned int
#define Slaw 0x0a; //寫命令字
#define Slar 0xa1; //讀命令字
#include "reg52.h"
#include "intrins.h"
sbit Scl=P3^6; //串列時鍾
sbit Sda=P3^7; //串列數據
bit Rec; //接收到數據的標志
uchar RecBuf[3]; //接收緩沖區
#define Hidden 0x10; //消隱字元在字形碼表中的位置
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
uchar DispBuf[6]; //6位元組的顯示緩沖區
uchar code TH0Val=63266/256;
uchar code TL0Val=63266%256;//當晶振為11.0592時,定時2.5ms的定時器初值
//以下是中斷程序,用於顯示
void Timer0() interrupt 1
{ uchar tmp;
static uchar dCount; //計數器,顯示程序通過它得知現正顯示哪個數碼管
TH0=TH0Val;
TL0=TL0Val;
tmp=BitTab[dCount]; //根據當前的計數值取位值
P2=P2|0xfc; //P2與11111100B相或,將高6位置1
P2=P2&tmp; //P2與取出的位值相與,將某一位清零
tmp=DispBuf[dCount]; //根據當前的計數值取顯示緩沖待顯示值
tmp=DispTab[tmp]; //取字形碼
P0=tmp; //送出字形碼
dCount++; //計數值加1
if(dCount==6) //如果計數值等於6,則讓其回0
dCount=0;
}
/*發送起始條件*/
void Start(void) /*起始條件*/
{
Sda=1;
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Sda=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Stop(void) /*停止條件*/
{
Sda=0;
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Ack(void) /*應答位*/
{
Sda=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}
void NoAck(void) /*反向應答位*/
{
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}
void Send(uchar Data) /*發送數據子程序,Data為要求發送的數據*/
{
uchar BitCounter=8; /*位數控制*/
uchar temp; /*中間變數控制*/
do
{
temp=Data;
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if((temp&0x80)==0x80)/* 如果最高位是1*/
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1; /*RLC*/
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}
uchar Read(void) /*讀一個位元組的數據,並返回該位元組值*/
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if(Sda) /*如果Sda=1;*/
temp=temp|0x01; /*temp的最低位置1*/
else
temp=temp&0xfe; /*否則temp的最低位清0*/
if(BitCounter-1)
{ temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}while(BitCounter);
return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i=0;
uchar *PData;
PData=Data;
Start();
Send(0xa0);
Ack();
Send(Address);
Ack();
for(i=0;i<Num;i++)
{
Send(*(PData+i));
Ack();
}
Stop();
}
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i=0;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
void Recive() interrupt 4 //串列中斷程序
{ static uchar Count=0;
if(TI)
{ TI=0;
return; //如果是發送中斷,直接退出
}
RI=0; //清RI標志
RecBuf[Count]=SBUF;
Count++;
Rec=0;
if(Count>=3)
{ Count=0;
Rec=1; //置位標志
}
}
void Init()
{ TMOD=0x21;
RI=0;
TH1=0xfd;
TL1=0xfd;
PCON|=0x80;
TR1=1;
SCON=0x50;
TH0=TH0Val;
TL0=TL0Val;
ET0=1; //開T0中斷
EA=1; //開總中斷
ES=1;
TR0=1; //T0開始運行
TR1=1;
}
void Calc(uchar Dat1,uchar Dat2) //第一個參數放在第1、2位,第二個參數放入第5、6位
{ DispBuf[0]=Dat1/16;
DispBuf[1]=Dat1%16;
DispBuf[4]=Dat2/16;
DispBuf[5]=Dat2%16;
}
void main()
{ uchar RomDat[4];
Init(); //初始化
DispBuf[2]=Hidden;
DispBuf[3]=Hidden;
for(;;)
{
Calc(RecBuf[1],RomDat[0]); //分別顯示地址和數據
if(Rec) //接收到數據
{ Rec=0; //清除標志
if(RecBuf[0]==0) //第一種功能,寫入
{ RomDat[0]=RecBuf[2];
WrToROM(RomDat,RecBuf[1],1);
SBUF=RomDat[0];
}
else
{ RdFromROM(RomDat,RecBuf[1],1);
SBUF=RomDat[0];
}
}
}
}
Ⅱ 單片機保存設置數據
你可以在www.IC37.COM上下載它的PDF看。它帶有8K(8位)的程序儲存器,沒有EEPROM,所以不能保存的。
如果要儲存設置數據得用外部的EEPROM,比如24LC系列,有很多產品都是這樣搭配用的,這個網站上也有這個系列的PDF,自己下載來看看就好了。
Ⅲ 51單片機怎麼實現數據的存儲,通過51單片機可以把數據存到哪,沒學過usb協議
不用 usb協議 可以把數據存到EEPROM中去如W25Q16
也可以存到SD卡中(spi介面),不用文件系統,只不過查找不方便
當然也可以發送到上位機中,處理就比較靈活了
數據量小的話,直接存單片機片上的EEPROM或FLASH ROM中
如STC12C5608片上有4KB的FLASH ROM(FLASH EEPROM和程序空間不沖突)
Ⅳ 51單片機的怎麼保存一些狀態數據
程序存儲區不能存儲數據,可以用EEPRAM來存儲數據。不外加存儲器也可以實現,就用STC單片機它內部有EEPRAM。
Ⅳ c51單片機怎樣存儲大量數據
如果你的數據是靜態的不用變的就可以存在code,否則當上電後code的內容只能讀,不能改.數據多了只能加外存,可以用I2C匯流排的E2PROM(2是平方的意思),前幾天買了幾塊AT24C256(32K),5元/塊
例如:int code point[]={-1,-2,-3};就可以了。你說的不行不知道是什麼意思,具體點吧
你這樣賦初值是不行的,因為這種賦值語句是在RAM裡面進行,point[]只可能是變數,不可能是常量,也就是它不能被定義在CODE內。所以你只能一個一個來了。一但point[]被定義為CODE就不能在main()裡面再對它賦值了。:)
Ⅵ 你好 STC單片機的數據如何存儲
keil的下載調試和你使用的調試腳本有關系,#define num1 0x僅僅是一句普通語句。在編譯的時候編譯器把num1全部替換成0x??,並不會定址。
在eeprom里存數據的話需要遵循一定的時序,具體要看晶元的說明書並不是一句define語句就能實現的。
Ⅶ 51單片機怎麼存儲數據
掉電存儲需要用到EEPROM存儲器的,普通的51單片機內部沒有,可以使用外圍EEPROM元件如24Cxx系列的存儲器,也可以選用stc90系列的單片機,內部有EEPROM,程序兼容。
Ⅷ 如何讓單片機某一臨時數據永久保存
存到EEPROM ,開機的時候再從EEPROM讀取
Ⅸ 單片機怎樣才能保存設置的參數,初學者請教各位!!!
先看你用的什麼單片機,現在流行的單片機如C8051F等都有Flash存儲器,可掉電保存數據,這樣就不需要外擴存儲器。經典的MCS-51很古老,沒有Flash,所以一般單片機教材上的都沒講怎樣保存數據。具體有沒有Flash可以查看單片機的數據手冊。
往單片機的Flash里存數據一般有特殊的編程步驟,各種單片機都不一樣,也要查看數據手冊。
單片機沒有Flash的話,就需要擴展存儲器了。EPROM是紫外線擦除的,不能用。EEPROM是電擦除的。看你需要多大空間、什麼介面,再去查型號,AT24C01,AT29C020等。下面的網址可以參考:
http://www.zymcu.com/device/memory/eeprom_01.htm
http://www.zymcu.com/device/memory/flash_01.htm