单片机数码管记忆系统实验报告

时间:2024.5.2

电子信息工程专业

单片机原理及应用课程设计

       电子信息工程      

       

        

指导教师    

        

一、   题目

基于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,程序非常复杂以至于现在还不是特别理解有待于继续学习掌握。在写程序的过程中深深的体会到了细心的重要性!!!以后要多练习养成写规范程序的好习惯,实验程序非常复杂感觉到自己欠缺的知识还很多,思考问题还不够全面。

六、教师评语

更多相关推荐:
实验八 数码管LED实验报告

苏州大学实验报告院系年级专业姓名学号课程名称成绩指导教师同组实验者实验日期实验名称数码管LED实验一实验目的理解8段数码管的基本原理理解8段数码管的显示和编程方法理解4连排共阴极8段数码管LG5641AH与MC...

数码管动态显示实验报告

实验四数码管动态显示实验一一实验要求1在Proteus软件中画好51单片机最小核心电路包括复位电路和晶振电路2在电路中增加四个7段数码管共阳共阴自选将P1口作数据输出口与7段数码管数据引脚相连P20P23引脚输...

数码管实验报告

单片机实验报告一实验名称数码管动态扫描显示01234567实验五二实验目的1掌握数码管显示数字的原理2通过不同的编程实现灵活运用数码管三实验原理数码管由7个发光二极管组成8字形构成的加上小数点就是8个分别把它命...

数码管显示实验报告

HUNANUNIVERSITY课程实验报告实验名称学生姓名学生学号专业班级指导老师数码管显示实验20xx1217实验三数码管显示实验一实验目的1学习按键扫描的原理及电路接法2掌握利用8255完成按键扫描及显示二...

数码管实验报告

项目名称数码管实验报告姓名陈姣班级11电气2学号11731204指导老师赵海兰实验目的巩固Keil软件的使用方法学习端口输入输出的高级应用掌握7段数码管的连接方式和动态显示法掌握查表程序和延时等子程序的设计学习...

单片机c语言版数码管动态显示实验报告

数码管动态显示实验一实验要求1在Proteus软件中画好51单片机最小核心电路包括复位电路和晶振电路2在电路中增加四个7段数码管共阳共阴自选将P1口作数据输出口与7段数码管数据引脚相连P20P23引脚输出选控制...

数码管及按键实验报告模板(1)

数码管及流水灯实验报告成员:20##年11月一、实验要求:1.实验1:在开发板上调试利用按键控制数码管从1累加到F变化(S2加、S3减)(不同分组按键利用IO口不同);2.实验2:利用开发板进行秒表设计(显示分…

eda七段数码管实验报告

EDA技术实验报告册班级11电本1班姓名李明学号4110218119唐山学院信息与控制工程实验教学中心20xx年3月电子设计自动化课程实验报告三23

三维数码管扫描显示实验报告

实验报告实验日期日实验设计方案1原理图三维数码管扫描显示电路原理设计出模4计数器三选一多路选择器和23译码器并由这三个模块和7段译码器设计3位数码管扫描显示电路模4计数器对4取模输入信号的频率被4分频三选一多路...

EDA八段动态数码管显示设计实验报告

第十周动态数码管显示设计报告姓名学号专业班级指导教师20xx年11月8日目录EDA技术及应用课程设计任务书3实验目的5设计要求5实验设备5扫描原理5设计任务6实验程序6时序仿真波形图7仿真结果8模拟电路8设计总...

嵌入式软件开发基础实验报告 数码管显示

上海电力学院嵌入式软件开发基础实验报告题目专业年级姓名学号ARM实验46数码管显示实验电子科学与技术一实验目的1通过实验掌握LED的显示控制方法2巩固实验41中所掌握的对存储区进行访问的方法二实验设备硬件Emb...

开关控制LED数码管实验报告

实验二开关控制LED数码管实验一实验目的1通过AT89C51读入4位开关K1K2K3K4的输入状态并按照二进制编码关系0F输出到数码管显示如K4K3K2K1全部按下则显示F若只有K2按下则显示22掌握LED数码...

数码管实验报告(41篇)