📄 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 + -