微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机—AT24C1024(带程序解析!)—07

51单片机—AT24C1024(带程序解析!)—07

时间:11-25 来源:互联网 点击:
昨天晚上没弄好,明天老哥也要结婚了~shit,上午只是知道很忙,现在没事了~发~~

我依稀还记得昨天用Keil的时候让人蛋疼~差点让我崩溃~我擦,就是那么一点点,就是编译不通过(这个不就是没事找事啊,本来这几天就心烦意乱了)~~

首先今天说的AT24C1024在以前的文章中我有过详细的介绍(那是相当的详细,所以我写这个程序就是东拼西凑的),我这里就不说了,我只是重点把源程序上出来,里边有详细解析~~

要是感兴趣的话,你可以做个LCD显示的数码锁什么的,还有那个什么什么~~(万年历~~程序太多也是可以的,EEPROM就是强大~),那是相当的简单的~~只要在源程序的基础上加加就哦了~

今天我这个程序就是存放我预先设置好的数组然后在LCD上显示,只是个Text~~

还是先上图片~~







注意:

由于我还不怎么会看内部存储器所存储的内容,所以这里我用的是IIC Debug:

在IIC调试器中的专用字符含义:

S:开始

P:停止

Sr:重新开始

A:应答

*:收到部分数据

L:仲裁丢失,返回主控模式

?:检测到非法逻辑电平

N:非应答

然后这个是我的东东~~



然后就是程序了:

main.c(先从主程序开始吗~~后边还有很多的

//------------------------------------------------------------------------------
//main.c~~~主文件
#include"reg52.h"
#include"MacroAndCOnst.h"
#include"at24c1024.h"
#include"delay.h"
#include"lcdinit.h"
//------------------------------------------------------------------------------
uchar code title[]="AT24C1024 Text: ";
uchar send_data[16]={0,1,2,3,4,5,6,7,8,9};//要写入到AT24C1024的数据
uchar receive_data[10]; //存储懂AT24C1024读出的数据
//------------------------------------------------------------------------------
//main
void main()
{
lcd_init();
lcd_display_string(0x80,title,16);
//delay(100);//不知道为什么,我第一做的时候延时时间长就错误,很明显是寄存器公用问题
//可是当我整理的时候却又能用了~我去列~留着~
while(!mcu_send_string(0xa0,0x00,0x00,send_data,10));
delay(10);//这里一定要有一定的延时~~你懂的~~不过我用while循环送~~也可以不用延时
//如果没有while语句,那就必须要有个一直延时的~~
while(!mcu_receive_string(0xa0,0x00,0x00,receive_data,10));
lcd_display_string(0x80+0x40,receive_data,10);
while(1);
}

LcdInit.c

//------------------------------------------------------------------------------
//LCD1602的初始化程序—可调用函数—C51
#include"reg52.h"
#include"MacroAndConst.h"
#include"Delay.h"
#include"Foot.h"
//------------------------------------------------------------------------------
#definedata_port P2
sbit lcd_en=P3^4;//定义lcd_en使能引脚
sbit lcd_rs=P3^5;//定义锁存引脚
sbit lcd_rw=P3^6;//定义读写引脚
//------------------------------------------------------------------------------
//LCD写指令函数
void lcd_write_command(uchar com)
{
lcd_rs=0;
lcd_rw=0;
data_port=com;
delay(1);
lcd_en=1;
delay(1);
lcd_en=0;
}
//------------------------------------------------------------------------------
//LCD写数据函数
void lcd_write_data(uchar dat)
{
lcd_rs=1;
lcd_rw=0;
data_port=dat;
delay(1);
lcd_en=1;
delay(1);
lcd_en=0;
}
//------------------------------------------------------------------------------
//LCD初始化函数
void lcd_init()
{
lcd_write_command(0x01);
delay(1);
lcd_write_command(0x38);
delay(1);
lcd_write_command(0x0c);
delay(1);
lcd_write_command(0x06);
delay(1);
}
//------------------------------------------------------------------------------
//LCD显示一个字节函数
void lcd_display_char(uchar add,uchar dat)
{
lcd_write_command(add);
delay(1);
lcd_write_data(dat);
delay(1);
}
//------------------------------------------------------------------------------
//LCD显示多个字节函数
void lcd_display_string(uchar add,uchar *s,uchar num)
{
uchar i;
lcd_write_command(add);
for(i=0;i {
lcd_write_data(s[i]);
delay(1);
}
}
IIC.c

//------------------------------------------------------------------------------
#include"reg52.h"
#include"MacroAndConst.h"
#include"intrins.h"
#include"Foot.h"
bitack;
//------------------------------------------------------------------------------
//开始信号函数
void IIC_start()
{
sda=1;
_nop_();
scl=1;//开始信号建立时间大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=0; //开始信号锁定大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;//钳住IIC总线,准备发送或者接收数据
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//结束信号函数
void IIC_stop()
{
sda=0;
_nop_();
scl=1; //结束时间大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;//保证一个终止信号和其实信号的空闲时间大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//主控器件接收应答函数
void IIC_ack_acc()
{
_nop_();
_nop_();
sda=1;//8位数据发送完后,准备接收数据
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda==1)
ack=0;
else
ack=1;//接收到应答位,ack为1,否则置0
scl=0;
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//主控器件向被控器件发送应答函数
void IIC_ack_send(bit a)
{
if(a==0) //发应答信号
sda=0;
else
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//写一个字节函数
void send_byte(uchar c)
{
uchar bit_cnt;
for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循环传送8位
{
if((c //取当前发送位
sda=1;
else
sda=0;
_nop_();
scl=1;//发送到数据线上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
}
//------------------------------------------------------------------------------
//接收一个字节函数
//返回接收的8位数据
uchar receive_byte()
{
uchar temp;
uchar bit_cnt;
temp=0;
sda=1; //置数据线为输入方式
for(bit_cnt=0;bit_cnt<8;bit_cnt++)
{
_nop_();
scl=0; //置时钟线为低电平,准备接收数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp<=1;
if(sda==1)//接收当前数据位,接收内容放入temp中
temp+=1;
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(temp);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top