2024-09-01
售卖作品
00

目录

电子称重器设计
功能要求
硬件配置
系统原理
程序实现与讲解
1. 初始化设置
2. 时间更新与显示
3. 按键检测与时间调整
4. 重量检测与显示
5. 指示灯控制
资源

机电荷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. 初始化设置

c
DDRA = 0xFF - 0x01; // 配置引脚的输入输出关系 DDRC |= 0x03; // 配置引脚的输入输出关系 DDRD = 0xFF; // 配置引脚的输入输出关系 DDRB = 0xF0; // 配置引脚的输入输出关系

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

2. 时间更新与显示

c
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. 按键检测与时间调整

c
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; }

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

c
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. 重量检测与显示

c
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. 指示灯控制

c
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
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!