实验目的:写数据到EEPROM里面去,然后把存入的数据发送到PC机上
作者:竹林清风
*******************************************************/
#include<iom16v.h>
#include<macros.h>
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define FRAMING_ERROR (1<<FE) //接收帧出错检测
#define PARITY_ERROR (1<<PE) //检验错误
#define DATA_OVERRUN (1<<DOR) //接收数据溢出出错
#define DATA_REGISTER_EMPTY (1<<UDRE) //寄存器为空
//unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
/******************发送字符函数************************/
void USART_Transmit(unsigned char data)
{
while (!(UCSRA & DATA_REGISTER_EMPTY)); // 等待发送寄存器空
UDR = data; // 发送数据
// while(!(UCSRA&(BIT(TXC))));
//UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
{
USART_Transmit(*(ptr++));
}
}
/********************EEPROM写入函数********************/
void EEPROM_write(unsigned int address,unsigned char data)
{
while(EECR&(1<<EEWE));//等待前面的写完成
EEAR=address; //设置地址和数据寄存器
EEDR=data;
EECR |= (1<<EEMWE); //置位EEMWE:主机写使能
EECR|=(1<<EEWE); //启动写操作
}
/********************EEPROM写入字符串函数****************/
void EEPROM_write_string(unsigned char uaddress,unsigned char number, unsigned char *fdata)
{
while(number--)
{
while(EECR&(1<<EEWE));//等待前面的写完成
EEAR=uaddress++; //设置地址和数据寄存器
EEDR=*fdata++;
EECR |= (1<<EEMWE); //置位EEMWE:主机写使能
EECR|=(1<<EEWE); //启动写操作
}
}
/*********************从EEPROM中读取数据****************/
unsigned char EEPROM_read(unsigned int uAddress)
{
while(EECR & (1<<EEWE)); /* 等待上一次写操作结束 */
EEAR = uAddress; /* 设置地址寄存器*/
EECR |= (1<<EERE); /* 设置EERE 以启动读操作*/
return EEDR; /* 自数据寄存器返回数据 */
}
void delay_ms(int time)
{
int i=0;
for(;time>0;time--)
for(i=0;i<1000;i++);
}
void main(void)
{
unsigned char m,n;
unsigned char table[6];
UCSRA = 0x00; // USART初始化
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); // 允许RXC中断,接收允许,发送允许
//UCSRB = 0x98;
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // 8 Data, 1 Stop, No Parity
//UCSRC = 0x86;
UBRRH=BAUD_H; // 设置波特率
UBRRL=BAUD_L;
EEPROM_write_string(0X01,6,"abcdef");//写入字符串
for(n=0;n<6;n++)
{
table[n]=EEPROM_read(0x01+n);
}
delay_ms(1);
while(1)
{
for(m=0;m<6;m++)
{
USART_Transmit(table[m]);
delay_ms(250);
}
}
}
****************eeprom实验****************************
实验目的:写数据到EEPROM里面去,然后读出通过LED数码管显示
作者:竹林清风
*******************************************************/
#include<iom16v.h>
#include<macros.h>
unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
/********************EEPROM写入函数********************/
void EEPROM_write(unsigned int address,unsigned char data)
{
while(EECR&(1<<EEWE));//等待前面的写完成
EEAR=address; //设置地址和数据寄存器
EEDR=data;
EECR |= (1<<EEMWE); //置位EEMWE:主机写使能
EECR|=(1<<EEWE); //启动写操作
}
/********************EEPROM写入字符串函数****************/
void EEPROM_write_string(unsigned char uaddress,unsigned char number, unsigned char *fdata)
{
while(number--)
{
while(EECR&(1<<EEWE));//等待前面的写完成
EEAR=uaddress++; //设置地址和数据寄存器
EEDR=*fdata++;
EECR |= (1<<EEMWE); //置位EEMWE:主机写使能
EECR|=(1<<EEWE); //启动写操作
}
}
/*********************从EEPROM中读取数据****************/
unsigned char EEPROM_read(unsigned int uAddress)
{
while(EECR & (1<<EEWE)); /* 等待上一次写操作结束 */
EEAR = uAddress; /* 设置地址寄存器*/
EECR |= (1<<EERE); /* 设置EERE 以启动读操作*/
return EEDR; /* 自数据寄存器返回数据 */
}
void delay_ms(int time)
{
int i=0;
for(;time>0;time--)
for(i=0;i<1000;i++);
}
void main(void)
{
unsigned char i,m,n;
EEPROM_write_string(0X01,6,"123456");//写入字符串
while(1)
{
for(n=0;n<6;n++)
{
i=EEPROM_read(0x01+n);
PORTA=led_7[i-48];//字符转换,数码管显示值为1,2,3,4,5,6
delay_ms(200);
}
}
}