?? eeprom.c
字號:
//******************************************************************************
// *
// FileName : 實驗板eeprom片內.c ICCAVR V6.31A編譯 *
// Function : 片內eeprom操作練習 *
// Date : 2006-11-14 *
// Version : 1.0 *
// *
// Author : 開關電源 hongtusy@163.com *
// Company : 電子信息技術咨詢網 http://www.itsn.cn *
// *
//***************************描述與記事*****************************************
//實驗板的AVR程序,片內eeprom操作練習,和計算機通訊,上電后首先發送保存在片內的數據
//然后接收PC發送的數據并保存起來,然后讀取數據返回給pc,斷電后數據不丟失。
//接線定義:將串口經rs232連接pc機 即PW6-7/8.
//記事:本程序旨在對片內eeprom使用的理解與演示,程序適合初學者使用.
//使用8MHz晶體。
//******************************************************************************
#include <iom8535v.h> //頭文件,ATmega8535單片機的寄存器定義
#include <macros.h> //
typedef unsigned char uchar;
typedef unsigned int uint;
#define BAUDRATE 9600 //波特率
#define F_CPU 8000000 //系統晶體頻率
/************************************************
函 數 名: DelaymS()
功 能: 毫秒級延時函數
輸入參數: 延遲時間/系統晶體
輸出參數: 做相應的延遲處理
描 述: /
***********************************************/
void DelaymS (uint i) //延時函數,參數i為延時時間
{
uint j,k; //雙重延時
for (j=0;j<i;j++)
{
for (k=0;k<=500;k++);
}
}
/********************************************************
子程序名: Send_word()
功 能: 串口發送一個字節
輸入參數: /
輸出參數: /
描 述: 把數據發送出去先發送再檢測,發完后,才離開
********************************************************/
void Send_word(uchar h)
{
UDR = h; //發送一個字符數據
while(!(UCSRA&(1<<UDRE))) //1字節發送完畢?
;
}
/********************************************************
子程序名: receive_word()
功 能: 串口接收一個字節數據
輸入參數: /
輸出參數: /
描 述: /
********************************************************/
uchar receive_word (void)
{
while(!(UCSRA&(1<<RXC))) //1字節接收完成?
;
return UDR; //輸出接收到的數據
}
/************************************************
函 數 名: Init_port()
功 能: 單片機初始化函數
輸入參數: /
輸出參數: /
描 述: 相關口方向的設置等
***********************************************/
void mcu_Init(void)
{
DDRD = 0xff;//PD口為推挽1輸出,位碼,PD7為485DE腳。口方向不影響串口。
}
/********************************************************
子程序名: usart_Init()
功 能: 串口初始化
輸入參數: /
輸出參數: /
描 述: /
********************************************************/
void usart_Init (void)
{
CLI(); //關閉中斷
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
//UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //接收結束中斷使能,RXD&TXD使能
UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<UCSZ0)|(1<<UCSZ1);
//訪問UCSRC寄存器,偶校驗,8個數據位,默認一個停止位,
//SEI(); //開全局中斷使能
}
/********************************************************
子程序名: EEPROM_write
功 能: 寫一字節數據到片內指定地址單元
輸入參數: /
輸出參數: /
描 述: /
********************************************************/
void EEPROM_write(uint uAddr,uchar uData)
{
EEAR = uAddr; //寫操作的16位地址寄存器
EEDR = uData; //寫數據到數據寄存器
EECR |= (1<<EEMWE); //允許EEPROM操作
EECR |= (1<<EEWE); //開始寫操作
while (EECR & (1<<EEWE)) //等待寫操作完成
;
}
/********************************************************
子程序名: EEPROM_read
功 能: 從片內指定地址單元讀一字節數據
輸入參數: /
輸出參數: /
描 述: /
********************************************************/
uchar EEPROM_read(uint uAddr)
{
while (EECR & (1<<EEWE)) //等待前一次寫操作完成
;
EEAR = uAddr; //寫操作的16位地址寄存器
EECR |= (1<<EERE); //開始讀操作
return EEDR; //輸出讀出的數據
}
//*****************主程序**********************************
void main (void)
{
uchar temp,i,j,k;
mcu_Init(); //單片機初始化
usart_Init(); //串口初始化
i=EEPROM_read(0x10); //讀片內EEPROM地址為0x10的數據,
Send_word(i); //發送數據到PC,這個數是掉電前保存的。
while(1) //無限循環執行
{
j=receive_word(); //串口接收一字節數據
EEPROM_write(0x10,j); //寫片內地址為0x10EEPROM的
//DelaymS(1000); //延遲
k=EEPROM_read(0x10); //讀片內EEPROM地址為0x10的數據
Send_word(k); //發送數據到PC
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -