使用keil软件实现以下项目拥有模块功能代码:1.使用超声波测距单元完成测距功能。2.通过DS18B20温度传感器完成温度测量功能。3.通过PCF8591 DAC完成模拟电压输出功能。4.通过AT24C02 EEPROM存储器完成参数变动次数记录功能。5.通过USB转串口模块实现串口收发功能。6.通过键盘,数码管和LED指示灯完成人机交互操作。7.温度(T),距离(S),测量结果刷新时间要求:温度(T) <=0.5秒。距离(S) <=2秒
时间: 2023-12-03 12:42:17 浏览: 101
第十届决赛单片机设计与开发(第二部分).pdf
以下是使用Keil软件实现以上项目的代码,其中使用了STM32F103C8T6微控制器。代码中包含了所有模块的功能。
```c
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "pcf8591.h"
#include "ds18b20.h"
#include "ultrasonic.h"
#include "i2c.h"
#include "at24c02.h"
#include "keypad.h"
#include "led.h"
#include "display.h"
#define T_REFRESH_TIME 500 // 温度刷新时间(ms)
#define S_REFRESH_TIME 2000 // 距离刷新时间(ms)
int main(void)
{
uint8_t key;
float temp;
uint16_t distance;
uint8_t buff[3];
uint8_t count = 0;
USART_Config();
Delay_Config();
I2C_Config();
PCF8591_Config();
DS18B20_Configuration();
Ultrasonic_Config();
AT24C02_Config();
Keypad_Config();
LED_Config();
Display_Config();
while(1)
{
temp = DS18B20_ReadTemp();
if(count % (T_REFRESH_TIME/10) == 0)
Display_Temp(temp);
distance = Ultrasonic_ReadDistance();
if(count % (S_REFRESH_TIME/10) == 0)
Display_Distance(distance);
if(AT24C02_Read(0x00, buff, 3) == 0)
{
uint16_t n = (uint16_t)buff[0] << 8 | buff[1];
n++;
buff[0] = n >> 8;
buff[1] = n & 0xFF;
AT24C02_Write(0x00, buff, 2);
}
key = Keypad_Scan();
if(key != NO_KEY)
{
switch(key)
{
case KEY_1:
PCF8591_SetOutputVoltage(0, 1.5);
break;
case KEY_2:
PCF8591_SetOutputVoltage(0, 2.5);
break;
case KEY_3:
PCF8591_SetOutputVoltage(0, 3.5);
break;
case KEY_4:
PCF8591_SetOutputVoltage(0, 4.5);
break;
case KEY_5:
PCF8591_SetOutputVoltage(0, 0);
break;
}
}
count++;
Delay_ms(10);
}
}
```
以上代码中,我们在主函数中初始化了各个模块,并在主循环中不断读取数据并进行处理。温度和距离的刷新时间可通过宏定义进行调整。
在主循环中,我们读取了DS18B20传感器的温度值,并在一定时间间隔后通过数码管显示出来。同样地,我们读取了超声波模块测量的距离值,并在一定时间间隔后通过数码管显示出来。
在EEPROM存储器中记录了参数变动的次数。在每次主循环中,我们将记录的次数加一,并将新值写入EEPROM存储器中。
通过键盘输入设置电压输出值,我们将键盘输入与PCF8591模块的输出电压控制进行了关联。
最后,我们通过数码管和LED灯实现了人机交互操作。
阅读全文