【TB作品】体重监控系统,ATMEGA16单片机,Proteus仿真

news2024/11/19 0:25:48

机电荷2018级课程设计题目及要求
题1:电子称重器设计
功能要求:
1)开机显示时间(小时、分)、时分可修改;
2)用滑动变阻器模拟称重传感器(测量范围0-
200g),数码管显示当前重量值,当重量值高于高
值时,红灯长亮;
3)当重量值低于低值时,黄灯长亮;
4)当重量值在正常值时,绿灯亮;
5)重量高值150g-200g和低值30g。
硬件调试:实现以上功能

数码管 段选RORTD八个引脚 位选PC0 PC1 PA1 PA2 PA3 PA4 PA5(只用到7位数码管)
按键四个 PB0 PB1 PB2 PB3
滑动变阻器接PA0
三个灯,黄绿红,接PB4 PB5 PB6

功能:
1数码管前四个显示时和分比如0158代表1点58分。数码管最后三位显示重量000到200表示多少g。
重量低于30,则黄灯亮。
重量正常,则绿灯亮。
重量高于150,则红灯亮。
按键1增加小时,按键2减少小时。(调时)
按键3增加分钟,按键4减少分钟。(调分)
正常走时。

在这里插入图片描述

电子称重器设计

功能要求

  1. 显示时间:开机后显示当前时间(小时和分钟),并且可以通过按键进行时、分的修改。
  2. 重量测量:使用滑动变阻器模拟称重传感器,测量范围为0到200克。数码管实时显示当前重量。
  3. 重量报警:根据测量的重量值,分别控制三种指示灯:
    • 当重量高于150克时,红灯亮。
    • 当重量低于30克时,黄灯亮。
    • 当重量在30克到150克之间时,绿灯亮。

硬件配置

  • 数码管:用于显示时间和重量。段选引脚连接RORTD,位选引脚连接PC0、PC1、PA1、PA2、PA3、PA4、PA5(只使用7位数码管)。
  • 按键:四个按键,分别连接到PB0、PB1、PB2、PB3。用于调整时间。
  • 滑动变阻器:连接到PA0,用于模拟称重传感器。
  • 指示灯:三个灯(黄、绿、红),分别连接到PB4、PB5、PB6。

系统原理

  1. 时间显示与调整

    • 数码管的前四个位置用于显示当前时间。例如,显示"0158"表示当前时间是1点58分。
    • 通过按键1和按键2可以增加或减少小时,通过按键3和按键4可以增加或减少分钟。
    • 时间正常计时,并且每秒钟更新一次。
  2. 重量测量与显示

    • 滑动变阻器模拟称重传感器,通过AD转换器将模拟信号转换为数字信号。
    • AD转换后的数据经过处理,显示在数码管的后三位。例如,显示"050"表示当前重量为50克。
    • 重量的变化实时更新到数码管上。
  3. 重量报警指示

    • 程序根据重量值的范围控制相应的指示灯。
      • 当重量低于30克时,黄灯亮,表示重量过轻。
      • 当重量在30克到150克之间时,绿灯亮,表示重量正常。
      • 当重量超过150克时,红灯亮,表示重量过重。

程序实现与讲解

1. 初始化设置
DDRA = 0xFF - 0x01;  // 配置引脚的输入输出关系
DDRC |= 0x03;        // 配置引脚的输入输出关系
DDRD = 0xFF;         // 配置引脚的输入输出关系
DDRB = 0xF0;         // 配置引脚的输入输出关系

这段代码配置了各个引脚的输入输出关系。数码管、滑动变阻器和指示灯分别连接到不同的端口。

2. 时间更新与显示
SEG_DISP[0] = LED_Disbuf[time_hour % 100 / 10];
SEG_DISP[1] = LED_Disbuf[time_hour % 10];
SEG_DISP[2] = LED_Disbuf[time_minute % 100 / 10];
SEG_DISP[3] = LED_Disbuf[time_minute % 10];

这段代码将当前时间的小时和分钟分解成个位和十位,并将其转换为数码管显示的内容。

3. 按键检测与时间调整
int GetKey(void) {
    if ((PINB & 0x01) == 0) {
        return 1; // 第1个按键
    } else if ((PINB & 0x02) == 0) {
        return 2; // 第2个按键
    } else if ((PINB & 0x04) == 0) {
        return 3; // 第3个按键
    } else if ((PINB & 0x08) == 0) {
        return 4; // 第4个按键
    }
    return 0;
}

这个函数检测哪个按键被按下,并返回相应的按键编号。通过这个返回值可以调整时间。

if (keyvalue == 1) { // 按键1的功能
    time_hour++;
    if (time_hour == 24) time_hour = 0;
} else if (keyvalue == 2) { // 按键2的功能
    if (time_hour == 0) {
        time_hour = 23;
    } else {
        time_hour--;
    }
} else if (keyvalue == 3) { // 按键3的功能
    time_minute++;
    if (time_minute == 60) time_minute = 0;
} else if (keyvalue == 4) { // 按键4的功能
    if (time_minute == 0) {
        time_minute = 59;
    } else {
        time_minute--;
    }
}

根据按键检测结果,调整小时和分钟。按键1和按键2用于增加和减少小时,按键3和按键4用于增加和减少分钟。

4. 重量检测与显示
unsigned int AD_GetData(void) {
    unsigned int ADData0;
    ADMUX = (1 << REFS0); // ADC参考电压为AVcc,ADC结果右对齐,选择通道ADC0
    ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // 使能AD转换,ADC时钟64分频

    ADCSRA |= (1 << ADSC); // 开始AD转换
    while (!(ADCSRA & (1 << ADIF)));
    ADCSRA |= (1 << ADIF); // 清零ADC中断标志位

    ADData0 = ADC;
    ADData0 = ((long)ADData0 * 5010 / 1024); // 将获得的AD值转换为电压值,单位为mv
    ADData0 = ADData0 / 25; // 数值换算到0~200g

    return ADData0;
}

该函数通过AD转换器获取滑动变阻器的电压值,并将其转换为重量值,显示在数码管上。

5. 指示灯控制
if (ADData0 < 30) { // 重量低于30
    PORTB &= ~0x10; // PB4低电平,黄灯亮
    PORTB |= 0x20; // PB5高电平,绿灯不亮
    PORTB |= 0x40; // PB6高电平,红灯不亮
} else if (ADData0 < 150) {
    PORTB &= ~0x20; // PB5低电平,绿灯亮
    PORTB |= 0x10; // PB4高电平,黄灯不亮
    PORTB |= 0x40; // PB6高电平,红灯不亮
} else {
    PORTB &= ~0x40; // PB6低电平,红灯亮
    PORTB |= 0x20; // PB5高电平,绿灯不亮
    PORTB |= 0x10; // PB4高电平,黄灯不亮
}

根据重量值控制相应的指示灯。当重量低于30克时,黄灯亮;重量在30克到150克之间时,绿灯亮;重量超过150克时,红灯亮。

通过以上功能模块的合理设计和实现,可以完成电子称重器的主要功能,包括时间显示与调整、重量测量与显示以及重量报警指示。

资源

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1896593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

使用任意电脑通过内网穿透生成的公网地址远程SSH连接本地Windows电脑

文章目录 前言1. Windows安装SSH服务2. Windows本地连接测试3. Windows安装Cpolar工具4. 配置SSH公网地址5. 远程SSH 连接测试6. 固定SSH公网地址7. 固定SSH地址测试 前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于Wind…

JAVA--JSON转换工具类

JSON转换工具类 import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackso…

浅析MySQL-索引篇01

什么是索引&#xff1f; 索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;类似于数据的目录。 索引的分类 按数据结构分类&#xff1a; MySQL 常见索引有 BTree 索引、HASH 索引、Full-Text 索引。 Innodb是MySQL5.5之后的默认存储引擎&#xff0c;BTree索引类型也…

一些感想。

1.double必须用double的输出&#xff08;“%lf”&#xff09; 我还以为是什么bug。。 2.sqrt&#xff0c;pow只要include cmath之后就能用了&#xff0c;我pow()没有devc艹的提示&#xff0c;还以为我记错了&#xff0c;早知道运行一下了 cnm公式写错了 #include <iostre…

无人机人员搜救

人员搜救-水域救援 水域搜救&#xff1a;快速水面搜查 物资抛投&#xff1a;救生物资抛投 绳索牵引&#xff1a;牵引救援绳索 领航船艇&#xff1a;水面侦察领航 人员搜救 昼夜搜救&#xff0c;精准定位 水域搜救 经纬 M300 RTK 搭载禅思 H20T 能够满足全天候作业需求&a…

YUM——简介、安装(Ubuntu22.04)

1、简介 YUM&#xff08;Yellowdog Updater, Modified&#xff09;是一个开源的命令行软件包管理工具&#xff0c;主要用于基于 RPM 包管理系统的 Linux 发行版&#xff0c;如 CentOS、Red Hat Enterprise Linux (RHEL) 和 Fedora。YUM 使用户能够轻松地安装、更新、删除和管理…

【项目管理】项目风险管理(Word原件)

风险和机会管理就是在一个项目开发过程中对风险进行识别、跟踪、控制的手段。风险和机会管理提供了对可能出现的风险进行持续评估&#xff0c;确定重要的风险机会以及实施处理的策略的一种规范化的环境。包括识别、分析、制定处理和减缓行动、跟踪 。合理的风险和机会管理应尽力…

深度学习-数学基础(四)

深度学习数学基础 数学基础线性代数-标量和向量线性代数-向量运算向量加和向量内积向量夹角余弦值 线性代数-矩阵矩阵加法矩阵乘法矩阵点乘矩阵计算的其他内容 人工智能-矩阵的操作矩阵转置&#xff08;transpose&#xff09;矩阵与向量的转化 线性代数-张量&#xff08;tensor…

计算机应用数学--第一次作业

第一次作业计算题编程题 &#xff08;20分&#xff09; 第一次作业 计算题 &#xff08;20分&#xff09;求 E ( X ) E(X) E(X)&#xff0c; V a r ( X ) Var(X) Var(X) &#xff08;1&#xff09; X X X 服从 [ a , b ] [a,b] [a,b] 均匀分布。 &#xff08;2&#xff09;…

鸿蒙开发设备管理:【@ohos.thermal (热管理)】

热管理 该模块提供热管理相关的接口&#xff0c;包括热档位查询及注册回调等功能。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shi…

24西安电子科技大学数学与统计学院—考研录取情况

24西安电子科技大学—数学与统计学院—考研录取统计 01、数学与统计学院各个方向 02、24数学与统计学院近三年复试分数线对比 数统院24年院线相对于23年院线增加高达30分&#xff0c;确实增长浮动比较高&#xff0c;接近30分的水平&#xff0c;因此大家更需要好好去努力&#x…

swiftui中设置建议最多5个tabItem项,多个tabItem项会被自动折叠起来

在swiftui中设置底部的菜单栏的时候&#xff0c;最多建议设置5个&#xff0c;如果超过了&#xff0c;会被自动折叠到More中&#xff0c;点击More就会出现类似list的样式显示&#xff0c;不是很友好。 最多按照5个默认设置的话&#xff0c;就会正常全部显示出来&#xff1a; 测…

idea如何连接gitee仓库

1.先在idea上登录gitee账号 在gitee官网上生成令牌。 点击生成新令牌。 复制到idea上就行了。然后登陆成功。 2.连接gitee 把项目的https克隆到idea中就行了。

谷粒商城学习-10-docker安装mysql

文章目录 一&#xff0c;拉取MySQL镜像1&#xff0c;搜索MySQL的Docker镜像2&#xff0c;拉取MySQL镜像3&#xff0c;查看已经拉取的镜像 二&#xff0c;创建、启动MySQL容器1&#xff0c;使用docker run创建启动容器2&#xff0c;使用docker ps查看运行状态的容器3&#xff0c…

深入了解图解并发线程

1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建&#xff0c;但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联可运行 调用了 start 方法&#…

docker集群部署主从mysql

搭建一个mysql集群&#xff0c;1主2从&#xff0c;使用docker容器 一、创建docker的mysql镜像 下次补上&#xff0c;因为现在很多网络不能直接pull&#xff0c;操作下次补上。 二、创建mysql容器 创建容器1 docker run -it -d --name mysql_1 -p 7001:3306 --net mynet --…

Portainer 是一个开源的容器管理平台-非常直观好用的Docker图形化项目

在这个容器化技术大行其道的时代&#xff0c;Docker和Kubernetes几乎成了技术圈的新宠。可是管理起容器来&#xff0c;有时候还是有点头大。命令行操作对于某些小伙伴来说&#xff0c;可能还是有点不太友好。 今天开源君分享一个叫 Portainer 的开源项目&#xff0c;一个用来简…

Zabbix 配置grafana对接

zabbix对接grafana简介 Zabbix与Grafana对接可以实现更加丰富和美观的数据可视化&#xff0c;可以利用Grafana强大的可视化功能来展示Zabbix收集的数据。 Grafana 本身是提供了Zabbix的对接插件&#xff0c;开箱即用&#xff0c;安装好了之后点击 enable 一下就能启用。然后就…

Mysql 的第二次作业

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 1&#xff09;登陆数据库。 打开命令行&#xff0c;输入登陆用户名和密码。 mysql -uroot -p123456 ​ 2&#xff09;切换数据库…