当前位置: 首页 > news >正文

seo网站结构杭州编程培训机构排名

seo网站结构,杭州编程培训机构排名,天津做网站联系方式,主机屋安装wordpress一、实验目的 掌握89C51单片机的基本操作和编程方法学习I2C总线协议及其在单片机中的应用实现基于AT24C02 EEPROM的带记忆功能的计数器掌握LCD1602液晶显示模块的使用方法 二、实验设备 89C51单片机开发板(板载)AT24C02 EEPROM芯片(板载&a…

一、实验目的

  1. 掌握89C51单片机的基本操作和编程方法
  2. 学习I2C总线协议及其在单片机中的应用
  3. 实现基于AT24C02 EEPROM的带记忆功能的计数器
  4. 掌握LCD1602液晶显示模块的使用方法

二、实验设备

  1. 89C51单片机开发板板载
  2. AT24C02 EEPROM芯片板载
  3. LCD1602液晶显示屏板载
  4. 按键开关板载

三、实验原理

1. 系统组成

本实验系统主要由以下几部分组成:

  1. 89C51单片机:作为主控制器,负责处理按键输入、I2C通信和LCD显示
  2. AT24C02 EEPROM:用于存储计数器的当前值,实现断电记忆功能
  3. LCD1602液晶显示屏:用于显示当前计数值
  4. 按键开关:用于增加计数值

2. I2C总线协议

I2C总线是一种简单的双向二线制同步串行总线,由数据线SDA和时钟线SCL组成。本实验使用89C51的P2.0和P2.1引脚模拟I2C总线与AT24C02通信。

3. AT24C02 EEPROM

AT24C02是一种2Kbit的串行EEPROM,采用I2C接口。其设备地址为0xA0(写)和0xA1(读)。本实验使用其第一个地址(0x00)存储计数值。

4. LCD1602液晶显示

LCD1602是一种字符型液晶显示模块,可以显示两行,每行16个字符。本实验使用其第一行显示当前计数值。

四、实验电路连接

  1. LCD1602连接:
  1. RS引脚连接P3.5
  2. RW引脚连接P3.6
  3. EN引脚连接P3.4
  4. 数据线D0-D7连接P0口
  1. AT24C02连接:
  1. SDA引脚连接P2.1
  2. SCL引脚连接P2.0
  1. 按键连接:
  1. 按键一端连接P3.2,另一端接地

五、实验代码分析

  1. 头文件和宏定义

#include <reg52.h>

#include <intrins.h>

#define unchar unsigned char

#define uint unsigned int

  1. 全局变量和常量定义

unchar code dis_table[] = "0123456789";  // 数字显示表

sbit button = P3^2; // 定义按键

sbit lcden = P3^4; // 定义LCD的E端口

sbit lcdrw = P3^6; // 定义LCD的RW端口

sbit lcdrs = P3^5; // 定义LCD的RS端口

sbit SCL = P2^0; // 定义SCL时钟线端口

sbit SDA = P2^1; // 定义SDA数据线端口

  1. 延时函数

void Delay() {

    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();

}

void DelayMs(uint ms) {

    uint i;

    while(ms--) {

        for(i = 110; i > 0; i--) ;

     }

}

  1. LCD1602操作函数

void Write_Com(unchar com) {

    lcdrs = 0; // 选择指令寄存器

    P0 = com;

    DelayMs(5);

    lcden = 1;

    DelayMs(5);

    lcden = 0;

}

void Write_data(unchar datas) {

    lcdrs = 1; // 选择数据寄存器

    P0 = datas;

    DelayMs(5);

    lcden = 1;

    DelayMs(5);

    lcden = 0;

}

void init() {

    lcdrw = 0; // 写操作

    lcden = 0;

    Write_Com(0x38);  // 8位数据接口,两行显示,5x7点阵

    Write_Com(0x0c);  // 显示开,光标关,闪烁关

    Write_Com(0x06);  // 写入新数据后光标右移,显示不移动

    Write_Com(0x01);  // 清屏

}

  1. I2C操作函数

void IIC_init() {

    SCL = 1;

    Delay();

    SDA = 1;

    Delay();

}

void IIC_start() {

    SDA = 1;

    Delay();

    SCL = 1;

    Delay();

    SDA = 0;

    Delay();

}

void IIC_respons() {

    unchar i = 0;

    SCL = 1;

    Delay();

    while(SDA == 1 && (i < 255)) {

        i++;

    }

    SCL = 0;

    Delay();

}

void IIC_stop() {

    SDA = 0;

    Delay();

    SCL = 1;

    Delay();

    SDA = 1;

    Delay();

}

void IIC_writebyte(unchar date) {

    unchar i, temp;

    temp = date;

    for(i = 0; i < 8; i++) {

        temp = temp << 1;

        SCL = 0;

        Delay();

        SDA = CY;

        Delay();

        SCL = 1;

        Delay();

    }

    SCL = 0;

    Delay();

    SCL = 1;

    Delay();

}

unchar IIC_readbyte() {

    unchar i, Data;

    SCL = 0;

    Delay();

    SDA = 1;

    for(i = 0; i < 8; i++) {

        SCL = 1;

        Delay();

        SDA = 1;

        Data = (Data << 1) | SDA;

        SCL = 0;

        Delay();

    }

    Delay();

    return Data;

}

  1. EEPROM读写函数

void Write_add(unchar date, unchar address) {

    IIC_start();

    IIC_writebyte(0xa0);  // 写入设备地址

    IIC_respons();

    IIC_writebyte(address);  // 写入存储地址

    IIC_respons();

    IIC_writebyte(date);  // 写入数据

    IIC_respons();

    IIC_stop();

}

unchar Read_add(unchar address) {

    unchar datas;

    IIC_start();

    IIC_writebyte(0xa0);  // 写入设备地址

    IIC_respons();

    IIC_writebyte(address);  // 写入存储地址

    IIC_respons();

    IIC_start();

    IIC_writebyte(0xa1);  // 读取设备地址

    IIC_respons();

    date = IIC_readbyte();  // 读取数据

    IIC_stop();

    return datas;

}

  1. 显示函数

void display(unchar date) {

    Write_Com(0x80);  // 设置显示位置为第一行第一个字符

    Write_data(dis_table[date/100]);  // 显示百位

    Write_data(dis_table[date%100/10]);  // 显示十位

    Write_data(dis_table[date%10]);  // 显示个位

}

  1. 主函数

void main() {

    unchar num, NUM;

    init();

    IIC_init();

    

    while(1) {

        if(button == 0) {  // 检测按键按下

            DelayMs(10);  // 消抖

            if(button == 0) {

                num = Read_add(0x00);  // 读取当前计数值

                num++;

                if(num > 255) num = 0;  // 限制计数值在0-255范围内

                Write_add(num, 0x00);  // 将新值写入EEPROM

            }

            while(button == 0);  // 等待按键释放

        }

        NUM = Read_add(0x00);  // 读取当前计数值

        display(NUM);  // 显示计数值

    }

}

六、实验步骤

  1. 按照电路连接图连接好硬件电路
  2. 将编译好的程序烧录到89C51单片机中
  3. 接通电源,观察LCD1602显示初始计数值(应为0)
  4. 按下按键,观察计数值增加
  5. 断电后重新上电,观察计数值是否保持断电前的值

七、实验结果与分析

  1. 实验结果
  1. 系统上电后,LCD1602显示初始计数值0
  2. 每次按下按键,计数值增加1
  3. 当计数值达到255后,再按一次按键,计数值变为0
  4. 断电后重新上电,计数值保持断电前的值
  1. 结果分析
  1. 系统能够正确读取和写入EEPROM中的数据,实现了断电记忆功能
  2. 按键消抖处理有效,避免了按键抖动导致的误计数
  3. LCD1602显示正常,能够实时显示当前计数值
  4. 计数值范围限制在0-255之间,符合设计要求

八、实验总结

通过本次实验,我掌握了以下知识和技能:

  1. 89C51单片机的基本编程方法
  2. I2C总线协议及其在单片机中的应用
  3. AT24C02 EEPROM的使用方法
  4. LCD1602液晶显示模块的编程和显示控制
  5. 按键消抖处理的方法

实验中遇到的问题及解决方法:

  1. 问题:初始上电时LCD显示乱码
    解决:检查发现LCD初始化时序不正确,调整延时后解决
  2. 问题:按键按下时计数值多次增加
    解决:增加按键消抖处理,并在按键按下后等待释放
  3. 问题:断电后重新上电计数值不记忆
    解决:检查EEPROM读写函数,发现I2C时序不正确,调整后解决

九、实验要求

  1. 可以增加减计数功能,通过另一个按键实现
  2. 可以增加清零功能,通过长按按键实现
  3. 可以优化I2C通信的延时函数,提高通信效率
  4. 可以增加计数值范围限制的提示信息
http://www.yayakq.cn/news/60445/

相关文章:

  • 网站建设性能分析抖音广告推广
  • 唐山制作网站的公司网络规划设计师是干啥的
  • 网站 pinghei顺德o2o网站建设
  • 免费建站网站一级大录像不卡在线看化妆品网站建设的论文
  • 网站报价广东峰凌建设有限公司网站
  • 国美电器网站建设的思路做游戏网站有钱赚吗
  • 做大型网站费用做网站银川
  • 网站结构的类型wordpress界面英文
  • 旅游网站设计与实现论文拼多多网站分析
  • 西安电商网站建设揭阳网站建设团队
  • 室内设计师上网第一站橱柜网站源码
  • 特别酷炫网站住建部2022年执行的新规范
  • 怎样理解网站建设与开发这门课遵义网站建设txwl
  • 做教育机器网站qq群推广引流
  • 秦皇岛微信推广平台seo经理
  • 石家庄有哪些做网站的公司wordpress需要多大内存
  • 设计一个网站的首页步骤广东省著名商标在什么网站做
  • 国际品牌的广州网站建设wordpress悬浮工具
  • 购物帮–做特惠的导购网站阿里巴巴运营岗位职责
  • 互联网站产品开发的流程营销手机网站
  • 网站调用字体库媒体平台推广
  • 网站空间要备案吗苏州建网站的公司一站式服务
  • 百度公司做网站优化多少钱设计师入门必学软件
  • 网站自动跳转怎么办中国纪检监察报电子版
  • 电脑科技网站模板网站主体负责人不是法人
  • 清溪做网站百度账号登录入口
  • 淘宝网站用什么语言做的wordpress 分享实现
  • 集团网站推广凡科网上商城
  • 做电影网站能不能赚钱物联网工程专业好就业吗
  • 邯郸网站建设网络公司地方门户系统源码