void Write_byte_eeprom(unsigned short address,unsigned char data)
{
while (EECR&(1<
EEAR = address;
EEDR = data;
EECR |= (1<
EECR |= (1<
}
unsigned char Read_byte_eeprom(unsigned short address)
{
while (EECR&(1<
EEAR = address;
EECR |= (1<
return EEDR;
}
void Refresh_eeprom(void)
{
unsigned char i = 0;
unsigned char check = 0;
unsigned char *p = (unsigned char *)&ram;
asm("cli");
ram.start = 0x55;
for (; i<(sizeof(ram)-1); i++)
{
Write_byte_eeprom(i,*(p+i));
check += *(p+i);
}
Write_byte_eeprom(i,check);
asm("sei");
}
void Read_eeprom(void)
{
unsigned char i = 0;
unsigned char check = 0;
unsigned char *p = (unsigned char *)&ram;
for (; i<(sizeof(ram)-1); i++)
{
*(p+i) = Read_byte_eeprom(i);
check += *(p+i);
}
*(p+i) = Read_byte_eeprom(i);
//取值合理性判断
if ((*(p+i) != check) || (*p != 0x55))
{
Parameter_reset();
}
}
关键字:AVR EEPROM读写
引用地址:
AVR EEPROM读写
推荐阅读最新更新时间:2024-03-16 15:05
avr单片机的熔丝配置
对 AVR 熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对 AVR 熔丝位的配置操作时的一些要点和需要注意的相关事项。 (1)在 AVR 的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态, Unprogrammed 表示熔丝状态为 1 (禁止); Programmed 表示熔丝状态为 0 (允许)。因此,配置熔丝位的过程实际上是 配置熔丝位成为未编程状态 1 或成为已编程状态 0 。 (2)在使用通过选择打钩 方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚 表示设置熔丝位状态为 0 还是为 1 。 (3)使
[单片机]
AVR单片机—(五)、ATMEGA16的USART与PC机串行通信—01(补充)
//------------------------------------------------------------------------------ //ATMEGA16与PC机的通信实验1 //PC机发送一个字符给单片机,单片机收到后既在发光二极管进行显示,同时将其回传给PC //单片机的发送和接收都采用查询方式 #include ioavr.h #include intrinsics.h #include delayics.h //------------------------------------------------------------------------------ typedef u
[单片机]
AVR通讯--同步异步区别
我们都知道数据通讯就是两个通讯主体之间发送、接收数字信号。假设要发送以下数据:12,23,34,45,56,67,78,89。接收方要正确接收这些数据,就必须知道数据什么时候开始发送,什么时候结束,要不然,可能会将数据接收成22,33,44,55,66,77,88。 对于同步通讯协议,发送方在发送数据之前先发出一个特殊的电信号,让接收方准备好接收数据,然后发送方就将以上数据全部连续发出,发送完毕后,再发送一个特殊的电信号表示数据发送结束。我们可以用以下图表示同步信号通讯。 开始 1223344556677889 结束 数据包 然后,接收方按照事先约定,即每两位一个
[单片机]
用ATmega16驱动的LCD2004的源程序(avr)
/*============================================== 20x4字符液晶主程序,编译软件(ICCAVR_6.31) CPU内部晶振8M 数据线B0~B7接PORTB, E=D7 RW=D6 RS=D5 =========================================== 接线图如下: _______________ ______________ | --1|GND | | --2| 5V | | --3|V0 | | | | PD5|--------4|RS | PD6|--------5|RW | PD7|--------6|E | CPU | | | ATmmega1
[单片机]
ATmega16单片机(AVR)主要特点总结
下面就总结一下AVR单片机ATmega16的主要特点: (注: 括号内有红色 *x* 符号的表示文章下方会有解释/扩展) 1) 采用 RISC 结构的AVR内核单片机. 131 条机器指令, 大多数指令为单个系统时钟周期执行的指令; 32 个 8 位通用工作寄存器; 全静态工作方式(Fully Static Operation). (*A*) 工作在 16 MHz 时具有 16 MIPS 的性能.(注: ATmega16L 系列最大工作频率为 8 MHz); 内部配备有 2 个时钟周期的硬件乘法器. 2)片内自带大容量, 非易失的程序和数据存储器 (*B*) 16KB 在线可编程(ISP, In-Sys
[单片机]
AVR单片机I/O口位操作,置位、清位、取反
看到好多新手对AVR单片机位变量使用不明白,现在提供一个I/O口位操作方法供大家学习: 下面是我用的宏定义方式: #define LED_SET PORTD |= (1 PD5) //位置高 #define LED_CLR PORTD &= ~(1 PD5) //位置低 #define LED_COM PORTD ^= (1 PD5) //位取反 #define LED_R PIND & (1 PD5) //位读取 通过上面的定义就可以在程序中直接操作I/O了。 本帖链接文字,方便回帖时直接复制使用: AVR单片机I/O口位操作,置位、清位、取反。
[单片机]
AVR与L298进行直流电机控制
软件环境:icc+avrstudio 打开motor.h更改以下内容即可。 //PD4,PD5 电机方向控制 #define moto_en1 PORTD |= 0x10 #define moto_en2 PORTD |= 0x20 #define moto_uen1 PORTD &=~ 0x10 #define moto_uen2 PORTD &=~ 0x20 软件核心介绍: 通过控制电机的IN1和IN2改变方向, pwm控制速度。 IN1和IN2不同时,电机转动; IN1和IN2相同时,电机急停。 硬件连接电路图 avr+N298控制电机输入信号与电机工作方式 N298电机控制芯片引脚图 电机控制资
[单片机]
AVR单片机寄存器 DDRx PORTx PINx 与对应IO端口之间的关系
AVR单片机寄存器 DDRx PORTx PINx 与对应IO端口之间的关系(x代表某个端口,如A端口、B端口等) 下表以端口B的第2位PB2为例子加以说明,并且假设PB2为悬空状态 DDRB.2 PORTB.2 读取PINB.2的结果 引脚PB2的状态 1 1 1 PB2推挽输出 1 1 0 0 PB2推挽输出 0 0 1 1 PB2弱上拉,可作输入 0 0 PB2高阻抗,可作输入 读取PINB.2时,就是读取PB2引脚的实际电平, 如果PB2直接接VCC,那么任何时候读取PINB.2的结果都是1 如果PB2直接接GND,那么任何时候读取PINB.2的结果都是0 下面是一个标准C语言例子:
[单片机]