电子信息工程专业
单片机原理及应用课程设计
班 级 电子信息工程
学 号
姓 名
指导教师
日 期
一、 题目
基于AT24C02的数码管显示记忆系统
二、设计内容
1、内容
设计一个基于AT24C02芯片的单片机数码管显示记忆系统。数码管和两个74HC573芯片进行连接,P2.6和P2.7管脚分别控制这两个573芯片;P2.0和P2.1管脚连接AT24C02芯片的SCL和SDA管脚,使用C51语言设计程序,当系统上电后,数码管从000~255每隔1s一次显示计数,当计数到255后,则从000重新显示计数,并且在系统断电后再次上电时,数码管依旧按断电前的数字继续进行计数,不会丢失数据,数字显示在X6~X8数码管上。
2、元件清单列表
三、软件设计
1、流程图
2、代码
#include //包含头文件
#define unint unsigned int //定义数据类型
#define uchar unsigned char
sbit SDA=P2^0; //定义SDA
sbit SCL=P2^1; //定义SCL
sbit WEI=P2^7; // 定义数码管的位选端
sbit DUAN=P2^6; //定义数码管的段选端
unint dat2; //定义全局变量,显示记录信息
uchar Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴极字段显示码
void delay(){;;} //短延时声明
void init() //初始化24C02
{
SDA=1;
SCL=1;
delay();
}
void start() //开始信号
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
void stop() //停止信号
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void ack() //应答信号
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<255))i++;
SCL=0;
delay();
}
void write_byte(uchar dat) //写一个字节
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
SCL=0;
delay();
temp<<=1;
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
uchar read_byte() //读一个字节
{
unint i,j;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++) //循环8次读出一个字节数据
{
SCL=1;
delay();
j=(j<<1)|SDA;
SCL=0;
delay();
}
return j;
}
void write_addr(uchar address,uchar dat1)
{ //往指定地址写数据
start(); //初始信号
write_byte(0xa0); //写入芯片地址0XA0
ack(); //应答信号
write_byte(address); //写入芯片内部寄存器地址ADDRESS
ack(); //应答信号
write_byte(dat1); //写入数据
ack(); //应答信号
stop(); //停止信号
}
uchar read_addr(uchar address)
{ //从指定地址读数据
uchar dat3;
start(); //初始信号
write_byte(0xa0); //写入芯片地址0XA0
ack(); //应答信号
write_byte(address); //写入芯片内部寄存器地址
ack(); //应答信号
start(); //初始信号
write_byte(0xa1); //写入芯片地址0XA1
ack(); //初始信号
dat3=read_byte(); //读出数据
stop(); //停止信号
return dat3; //返回读出值
}
void init_T0() //初始设置定时器T0
{
TMOD=0x01; //定时器T0工作在方式1
TCON=0x10; //启动T0
TH0=(65536-461)/256; //FEH,11.059 2MHz,0.5ms
TL0=(65536-461)%256; //33H,
IE=0x82; //T0的中断允许
}
void wei_lock(uchar wei) //数码管位控制
{
WEI=1;
P0=wei;
WEI=0;
}
void duan_lock(uchar duan) //数码管段控制
{
DUAN=1;
P0=Temp[duan];
DUAN=0;
}
void display(uchar date) //数码管显示
{
unint i;
uchar ge,shi,bai;
ge=date%100%10;
shi=date%100/10;
bai=date/100;
duan_lock(ge);
wei_lock(0x7f);
for(i=0;i<300;i++);
duan_lock(shi);
wei_lock(0xbf);
for(i=0;i<300;i++);
duan_lock(bai);
wei_lock(0xdf);
for(i=0;i<300;i++);
wei_lock(0xff);
}
void timer0() interrupt 1 //T0的中断服务函数
{
unint i;
if(i++>=2000) //1s时间到
{
i=0;
if(dat2++>=255)dat2=0; //调整显示数字
}
TH0=(65536-461)/256; //重新给T0赋初值
TL0=(65536-461)%256;
}
void main()
{
init_T0(); //T0初始化
dat2=read_addr(0); //读24C02存储器数据
while(1)
{
init(); //存储器初始化
write_addr(0,dat2); //指定地址写数据
display(dat2); //读出数据并显示
}
}
四、仿真分析
1、原理图
2、仿真结果图
3、结果分析
通过控制AT24C02芯片向指定的地址进行数据的读写操作,利用其记忆功能达到实验目的。通过输入单片机的程序,使用定时器T0工作方式1在系统上电后数码管从000~255每隔1S依次显示计数,当计数到255后自动从跳回000重新显示计数。当系统断电后在次上电,数码管能按断电前储存的数据继续计数。达到了预期的效果。
五、设计总结
设计实验基本上是成功了。通过这次实践学会了很多知识,巩固了学过的知识并且又有了新的认识,基本掌握了所用器件的使用方法。STC89C51作为单片机,适用了内部的定时器,程序上解决了按键抖动的问题,了解学习AT24C02芯片的功能以及其接线方式,74HC573是8位三态锁存器利用它来控制数码管,数码管的显示方法工作原理等。实验中涉及到了iic,iic总线包括一条数据线SDA和一条时钟线SCL,程序非常复杂以至于现在还不是特别理解有待于继续学习掌握。在写程序的过程中深深的体会到了细心的重要性!!!以后要多练习养成写规范程序的好习惯,实验程序非常复杂感觉到自己欠缺的知识还很多,思考问题还不够全面。
六、教师评语