⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom._c

📁 AVR程序
💻 _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 + -