📄 eeprom._c
字号:
/*******************************************************************
实验八
实验名称: AVR单片机内部EEPROM实验
实验目的: 学习AVR单片机的内部的EEPROM的读写
实验现象: 通过串口发送字符串给EEPROM,M16 512个字节,发送@R,读EEPROM
中的内容,并通过串口发送给PC机
环 境: ICCAVR6.31A
设 计 者:
完成日期: 2007年4月10日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"
uchar RecvFlag = 0; //串口接收到的数据
uchar Flag = 0; //为1时表示接收到了@,如果紧接着收到
//R则发送EEPROM中的数据
uint EEpromAdd = 0; //存储在EEPROM中的地址
uchar temp[255],tempcnt = 0; //暂存数据
uchar temp1; //暂存串口接收到的数据
/*-----------------------------------------------------------------
函数名称: void EepromWrite (uint addr, uchar val)
函数功能: EEPROM的写程序
参 数: num 写的字符个数,
addr 存放的首地址
*val 存储数据的首地址
返 回 值: 无
-----------------------------------------------------------------*/
void EepromWrite ( uint addr, uchar val)
{
while ( EECR&0x02 ); //判断EEWE是否为0
EEAR = addr;
EEDR = val;
CLI();
EECR = EECR|0x04; //置EEMWE为1
EECR = EECR|0x02; //置EEWE为1
SEI();
}
/*-----------------------------------------------------------------
函数名称: void EepromRead (uchar num, uint addr, uchar *val)
函数功能: EEPROM的写程序
参 数: num 读的字符个数,
addr 读字符的首地址
*val 读数据的暂存的首地址
返 回 值: 无
-----------------------------------------------------------------*/
void EepromRead (uchar num, uint addr, uchar *val)
{
while (num)
{
while ( EECR&0x01 ); //判断EEWE是否为0
EEAR = addr;
EECR = EECR|0x01; //置EERE为1
*val = EEDR;
addr++;
val++;
num--;
}
}
/*-----------------------------------------------------------------
函数名称: void Uart0Init(void)
函数功能: 串口初始化
波特率 600 0.2% 字符长度 8bit 无奇偶校验
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void Uart0Init(void)
{
UCSRB = 0x00; //关串口
UCSRA = 0x02; //倍速模式 M16中文P151
UCSRC = BIT(URSEL) | 0x06; //写UCSRC寄存器,设定8个bit
UBRR = 206; //设定串口波特率为600
UCSRB = 0x98; //开串口
}
/*-----------------------------------------------------------------
函数名称: void UartRecvData(void)
函数功能:
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
#pragma interrupt_handler UartRecvData:12
void UartRecvData(void)
{
temp1 = UDR;
RecvFlag = 1;
}
/*-----------------------------------------------------------------
函数名称: void UartTransmitData(uchar *SendData, uchar len)
函数功能: 发送字符串
参 数: SendData 发送字符串的首地址
len 发送字符串的长度
返 回 值: 无
-----------------------------------------------------------------*/
void UartTransmitData(uchar *SendData, uint len)
{
uint i;
for( i = 0; i < len; i++)
{
while(!(UCSRA&0x20)); //判断数据寄存器是否为空
UDR = SendData[i];
}
}
/*-----------------------------------------------------------------
函数名称: void InitDevices(void)
函数功能: 初始化各种信息
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void InitDevices(void)
{
CLI(); //关全部中断
Uart0Init();
SEI(); //开全中断
}
void main(void)
{
uchar EepromData[255] ;
uint j;
InitDevices();
while(j++);
EepromRead (255, 0, EepromData); //读取上次断电前程序存储的数据
UartTransmitData(EepromData, 255); //通过串口显示
while(1)
{
if( Flag == 2)
{
Flag = 0;
EepromRead (EEpromAdd, 0, EepromData);//读取本次存储的数据,串口输出
UartTransmitData(EepromData, EEpromAdd);
}
if( RecvFlag)
{
RecvFlag = 0;
if( temp1 == '@')
Flag = 1;
else if(((temp1 == 'R')||(temp1 == 'r'))&&( Flag == 1))//连续接收到@R
{
Flag = 2;
}
else
{
Flag = 0;
EepromWrite ( EEpromAdd++, temp1);
if( EEpromAdd >= 255)
EEpromAdd = 0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -