嵌入式系统课程设计——温度记录仪

news2024/11/27 6:36:11

课程设计目录

一、嵌入式系统基础实验

 二、项目需求分析

三、实验方案设计

四、实验程序设计

 五、成本核算情况

八、完成情况与问题分析

九、学习心得


一、嵌入式系统基础实验

1.1实验平台的使用

图1 建立新工程图片

图2 选择lpc1114芯片图片

图3 选择头文件图片

图4 编译新工程图片

图5 烧录新工程到开发板图片

 二、项目需求分析

2.1题目:温度记录仪

2.2功能要求:

(1)每秒检测一次环境温度并存储

(2)存储数据与时间关联,可通过串行口导出

(3)当前时间可通过串口进行设置和读取

(4)USB供电

(5)USB转串口数据传输

(6)一个运行状态指示灯

(7)一个功能按键

2.3技术指标:

(1)检测温度:范围:-55~+125℃,精度:不低于1.5摄氏度

(2)数据存储空间:不低于2MB

三、实验方案设计

3.1芯片介绍

(1)LPC1114是NXP公司生产的Cortex-M0内核的32位微控制器,采用ARM处理器架构。该芯片集成了大量的模拟和数字外设,包括GPIO、I2C、SPI、UART、ADC、DAC、PWM、定时器等,还具有Flash和SRAM存储器。它的主频可达50MHz,工作电压范围为1.8V到3.6V,可广泛应用于家用电器、智能家居、电子玩具、工业自动化、医疗设备等领域。

LPC1114的封装形式包括DIP、TSSOP、LQFP等,方便用户进行不同的应用设计。此外,该芯片还提供了多种工具支持,例如Flash编程器、在线仿真器、开发板等,可大大降低用户的设计成本和开发难度。

图9 LPC1114引脚图

(2)LM75BD是一种数字温度传感器,由德州仪器(Texas Instruments)生产。它采用I2C数字接口,并能够以0.5°C分辨率测量温度,其温度测量范围为-55°C到+125°C。LM75BD还具有低功耗和单电源操作的特点,以及在2.8V至5.5V电压范围内的高电压容忍度,使其非常适合用于低功耗应用和广泛的应用场景。

LM75BD具有内置的数字式温度传感器,以及数字化接口,这使得它非常适合在许多不同的应用中使用,如计算机服务器、智能家居、医疗设备等等。它还具有高精度、可编程温度阈值、过热检测和电源管理功能,可以通过I2C接口与其他设备通信。

图10 LM75BD引脚图  

(3)DS1307是一款实时时钟芯片,由美国芯片制造商Maxim Integrated公司生产。它具有低功耗、高稳定性、精度高等特点,适用于需要精准时间控制的电子设备,如计算机、工业自动化控制系统、数字相机、嵌入式系统等。

DS1307的主要特性如下:

1.集成了实时时钟和日历,具有年、月、日、时、分、秒的计数和显示功能。

2.采用低功耗CMOS技术,工作电流小于1.5mA。

3.采用I2C总线接口,可以与其他I2C设备进行通信。

4.可以通过程序控制对时钟和日历进行设置和读取,具有多种时钟格式的选择。

5.内置32.768kHz的晶振,可提供高稳定性的时钟信号。

6.具有自动切换夏令时功能。

DS1307是一款非常实用的实时时钟芯片,广泛应用于各种需要时间控制的电子设备中。

图11 DS1307引脚图  

(4)XT25F02是一种串行闪存(Serial Flash)存储器,由国内集成电路设计和制造公司厦门兴泰微电子股份有限公司生产。XT25F02具有2M比特(Mb)的存储容量,采用SPI(Serial Peripheral Interface)接口进行数据通信。

XT25F02的主要特点如下:

1.存储密度高:具有2M比特的存储容量,可以存储大量数据。

2.SPI接口:采用SPI接口进行数据通信,具有数据传输速度快、芯片引脚数目少、连接简单等特点。

3.低功耗:XT25F02的工作电压范围为2.7V至3.6V,具有低功耗的特点,在移动设备、便携式设备等应用场景中比较适用。

4.高可靠性:XT25F02采用高可靠性的存储器单元和数据保护机制,可以有效避免数据丢失和损坏等问题。

XT25F02可以广泛应用于消费电子、通信设备、工业自动化、医疗设备、安防设备等领域。

图12 XT25F02引脚图  

3.2设计思路

采用LPC1114 DevKit作为开发板,以LPC1114FBD48/302作为处理器。首先,其复杂程度相对较低一些。因为涉及到的电路模块相对来说都比较简单和容易,电路板上的每个模块功能都比较熟悉。第二,性能方面能基本实现温度记录仪的基本要求功能,满足设计的需要——具有温度检测和串口显示功能。第三,可行性方面具有更高的可行性,因为在设计程序方面和电路板硬件方面都有过以往相关实验的经验。设定好时钟频率为48MHz,初始化LPC1114微控制器UART串行口,定时器、I2C总线接口、SSP串行端口为SPI帧格式;系统启动后,利用通用定时器实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值和DS1307读取当前时间,通过UART接口发送到PC,并通过SPI接口将读到的温度值存储到FLASH存储器XT25F02中,在PC上利用串口调试助手向LPC1114的UART接口发送读取命令,从FLASH存储器中读出温度数据,并通过UART接口发送到PC。

3.2系统框图

图13 系统方框图

图14 Lpc1114方框图

图15 开发板硬件图

四、实验程序设计

4.1软件流程图:

 

 

 

 4.2代码

#include <LPC11xx.h>

void UARTInit();

void I2CInit();

void TMR16B0_Init();

void SSPI1_Init();

void Delay_1s(void);

void DS1307Init();

void Led_off();

void Led_on();

/*主函数*/

int main(){

Led_on();

      SystemInit();//  主时钟设置成48Mhz

  UARTInit();

       I2CInit();

       SSPI1_Init();

       Delay_1s();

  DS1307Init();

       TMR16B0_Init();

       while(1){

       }

}

#include <LPC11xx.h>

void UART_Send();

void Get_temputerature();

void UART_Send_Bit();

//void SSP1_Send(uint8_t *buf,uint8_t Length);

void SPI1_Write_FLASH(uint8_t *data, uint8_t Length);

void SPI1_Read_FLASH(uint8_t *data,uint8_t Length);

void XT25_EraseSector();

void Delay_1s();

long int ADDR;

void XT25_EraseAll();

uint8_t buf[100]; //存放温度

void Led_off();

void Led_on();

/*LED亮*/

void Led_on(){

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); // 使能时钟

       LPC_GPIO1->DIR |= (1<<9);

       LPC_GPIO1->DATA &= (0<<9); //拉低

}

/*LED灭*/

void Led_off() {

  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); // 使能时钟

       LPC_GPIO1->DIR |= (1<<9);

       LPC_GPIO1->DATA |= (1<<9); //拉高

}

void DS1307_Read(uint8_t *data);

/*

*函数功能:16B0 初始化

*计时1s

*/

void TMR16B0_Init(){//定时器初始化 定时1s

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<7);//使能16B0

       LPC_TMR16B0->MCR =3; //匹配MR0时复位TC且中断

       LPC_TMR16B0->PR=799;   //预分频值 3999

       LPC_TMR16B0->MR0=SystemCoreClock/800; //  设置周期为1秒

       LPC_TMR16B0->TCR=0X01;  //启动定时

       NVIC_EnableIRQ(TIMER_16_0_IRQn); //启动中断

}

/*

*16B0中断函数

*/

void TIMER16_0_IRQHandler(){

        int i;

        int n;

        uint8_t data[16]={0};

        uint8_t shijian[7]={17,20.00};

        uint8_t time[8]={0};

        DS1307_Read(shijian);

        time[0]=(shijian[0]&0x0F)+48;           //时间转换成ascii码进行保存

        time[1]=(shijian[0]>>4)+48;

        time[2]=(shijian[1]&0x0F)+48;

        time[3]=(shijian[1]>>4)+48;

        time[4]=(shijian[2]&0x0F)+48;

        time[5]=(shijian[2]>>4)+48;

        UART_Send_Bit(time[5]);

        UART_Send_Bit(time[4]);

        UART_Send("hou",3);

        UART_Send_Bit(':');

        UART_Send_Bit(time[3]);

        UART_Send_Bit(time[2]);

        UART_Send("min",3);

        UART_Send_Bit(':');

        UART_Send_Bit(time[1]);

        UART_Send_Bit(time[0]);

   UART_Send("sec",3);

//发送换行

        UART_Send_Bit(0x0d);

        UART_Send_Bit(0x0a);

        Get_temputerature();

//    Delay_1s();

        SPI1_Write_FLASH(buf,7);//  发送温度 以转换好的数组的形式发送 到xt52

        SPI1_Read_FLASH(data,7);

        UART_Send("Temputerature=",14);

        UART_Send(data,7);  //发送温度到pc

        UART_Send_Bit('C');

//发送换行

        UART_Send_Bit(0x0d);

        UART_Send_Bit(0x0a);

        ADDR=ADDR+8;

        LPC_TMR16B0->IR |=0X01; //清中断

}

#include <LPC11xx.h>

uint32_t Rcv_Buf[100]; //存放数据

int buf_i=0;//数据长度

void SPI1_Read_FLASH(uint8_t *data,uint8_t Length);

void SPI1_Write_FLASH(uint8_t *data, uint8_t Length);

uint8_t dest_addr[16];

uint8_t src_addr[16];

uint8_t XT25_ReadSR();

void XT25_WriteEnable();

void XT25_RUID();

void XT25_Erase();

void XT25_WriteSR(uint8_t sr);

void XT25_EraseSector();

void Delay_1s(void);

/*

*uart初始化

*clk 12MHZ

*115200 8 1 N

*FIFO 深度8

*/

void UARTInit(){

 

  //配置引脚

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<16);//使能IO

  LPC_SYSCON->SYSAHBCLKCTRL |=(1<<6) ;//使能GPIO

       LPC_IOCON->PIO1_6 |= 0x01; //设置成RXD 引脚

       LPC_IOCON->PIO1_7 |= 0x01; //设置成TXD 引脚

       LPC_UART->LCR=3; //数据8 停止1 无校验

       //设置波特率115384  近似115200

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<12);//使能UART

       LPC_SYSCON->UARTCLKDIV=4;  //设置分频值4  获得UART时钟为12Mhz

       LPC_UART->LCR=0X83; //DLAB=1

       LPC_UART->DLL=4;

       LPC_UART->DLM=0;

       LPC_UART->LCR=0x03; //DLAB=0

       LPC_UART->FDR=0X85; //MIV=8 DIV=5

      

      

       LPC_UART->FCR  =0X81; //使能FIFO 深度设置为8

       LPC_UART->IER |=1<<0; //使能接受中断

       NVIC_EnableIRQ(UART_IRQn); //启动中断

      

}

/*

*发送字符串

*/

void UART_Send(uint8_t str[],int lenght){

       int i;

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

              LPC_UART->THR= str[i];

                     while((LPC_UART->LSR&0X40)==0);//等待数据发送完成

       }

}

/*

*发送 一个字节

*/

void UART_Send_Bit(uint8_t data){

       LPC_UART->THR= data;

                     while((LPC_UART->LSR&0X40)==0);//等待数据发送完成

}

#include <LPC11xx.h>

/*

*函数功能:I2C 初始化

*/

void I2CInit(){

       LPC_SYSCON->PRESETCTRL |= (1<<1); //复位取消

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<5);//使能I2C

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<16);//使能IO配置块

      

  //选择快速模式

       LPC_IOCON->PIO0_4 &=~(0X3F); //选择快速模式

       LPC_IOCON->PIO0_4 |=0X01;//选择SCL

       LPC_IOCON->PIO0_5 &=~(0X3F); //选择快速模式

       LPC_IOCON->PIO0_5 |=0X01;//选择SDA

      

       //设置SCL频率为400kHZ

       LPC_I2C->SCLH=40;

       LPC_I2C->SCLL=80;

      

       //使能I2C 同时将其他控制位清0

       LPC_I2C->CONCLR=0XFF;     //清所有标志

       LPC_I2C->CONSET |=(1<<6);    //使能I2C接口

}

/*

*函数功能:发送开始信号

*/

void I2c_Start(){

       LPC_I2C->CONSET =(1<<5);// 发送开始信号

       while(!(LPC_I2C->CONSET&(1<<3))){//等待开始信号发送完成 SI置位

       }

       LPC_I2C->CONCLR =(1<<5|1<<3); //清零START 和SI

}

/*

*函数功能:发送停止信号

*/

void I2C_Stop(){

       LPC_I2C->CONCLR =(1<<3);

       LPC_I2C->CONSET =(1<<4);// 发送停止信号

       while((LPC_I2C->CONSET&(1<<4))){//等待停止信号发送完成 SI置位

       }

}

/*

*函数功能:发送一个字节

*/

void I2C_Send_Byte(uint8_t data){

       LPC_I2C->DAT=data;

       LPC_I2C->CONCLR =(1<<3); //开始发送数据 清SI

              while(!(LPC_I2C->CONSET&(1<<3))){//等待数据发送完成 SI置位

       }

}

/*

*函数功能:接受一个字节

*/

uint8_t I2C_Recieve_Byte(){

       LPC_I2C->CONCLR =(1<<3);//开始接受数据  清SI

       while(!(LPC_I2C->CONSET&(1<<3))){//等待接受数据完成 SI置位

       }

       return (uint8_t)LPC_I2C->DAT;

}

#include <LPC11xx.h>

#define WREN    0X06            //写入使能

#define WRDI      0X04

#define RDSR      0X05

#define WRSR     0X01

#define READ      0X03

#define WRITE    0X02

extern uint8_t src_addr[16]; //写

extern uint8_t dest_addr[16];//读

void UART_Send(uint8_t str[],int lenght);

void UART_Send_Bit(uint8_t data);

void XT25_WriteEnable();

uint8_t XT25_ReadSR();

uint8_t SPI1_comunication(uint8_t TxData);

extern long int ADDR;

void Delay_1s(void){

       int i=SystemCoreClock/500;//0.01s

              while(--i);

}

/*

*函数功能:SSP1IO初始化

*/

void SSP1_IOConfig(){

       LPC_SYSCON->SYSAHBCLKCTRL |=((1<<6)|(1<<16)); //IO 和GPIO

       LPC_IOCON->PIO2_2 &=~(0X07); //

       LPC_IOCON->PIO2_2 |=0X02;// 把PIO2_3选择为MISO

      

       LPC_IOCON->PIO2_3 &=~(0X07); //

       LPC_IOCON->PIO2_3 |=0X02;//把PIO2_2选择为MOSI

       LPC_IOCON->PIO2_1 &=~(0X07); //

       LPC_IOCON->PIO2_1 |=0X02;//把PIO2_1选择为LPC_SSP   CLK

      

       LPC_GPIO2->DIR |= (1<<0);

       LPC_GPIO2->DATA |= (1<<0); //拉高

}

void SSP1_LOW(){

       LPC_GPIO2->DATA &= ~(1<<0); //拉低

}

void SSP1_HIGH(){

       LPC_GPIO2->DATA |= (1<<0); //拉高

}

/**

*函数功能:SSP1初始化

*/

void SSPI1_Init(){

       uint8_t Dummy=Dummy; //解决编译产生的Warning:never used

       uint8_t i;

      

       LPC_SYSCON->PRESETCTRL |=1<<2; //禁止LPC_ssp1复位

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<18); //ssp1 时钟使能

       LPC_SYSCON->SSP1CLKDIV=0X02 ;  //分频值 2 48/2=24

      

       SSP1_IOConfig(); //初始化SSP1 IO口

      

       LPC_SSP1->CR0=0X0707;   //CPSR=7 DATAbit= 8 CPOL=0 CPHA=0 SCR=7  选择spi

      

       LPC_SSP1->CPSR=0X02;   //SCLK=48/(2*2*8)= 1.5M

      

       LPC_SSP1->CR1 &=~(1<<0);//LBM=0 :正常模式

       LPC_SSP1->CR1 &=~(1<<2);//MS=0 主机模式

       LPC_SSP1->CR1 |=1<<1; //SSE=1 开启ssp1

      

       //清空RXFIFO

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

              Dummy=LPC_SSP1->DR;

       }

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

              dest_addr[i]=0;

              src_addr[i]=0;

       }

       ADDR=0xff0000;

}

/**

* 函数功能:SSP1通信

* 接受和发送一个字符

*/

uint8_t SPI1_comunication(uint8_t TxData){

       while(((LPC_SSP1->SR)&(1<<4))==(1<<4));//忙时等待

       LPC_SSP1->DR=TxData; //发送数据到TxFIFO

       while(((LPC_SSP1->SR)&(1<<2))!=(1<<2));//等待数据接受完

       return (LPC_SSP1->DR); //接受返回的数据

}

/**

*函数功能:SSP1发送

*/

void SSP1_Send(uint8_t *data,uint8_t Length){

       uint8_t i;

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

              SPI1_comunication(data[i]);

       }

}

/**

* 函数功能:SSP1接受

*/

void SSP1_Receive(uint8_t *data,int Length){

       uint8_t Dummy=Dummy; //随机数 用于产生时钟

       uint8_t i;

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

              data[i]=SPI1_comunication(0xff);

       }

}

/**

* 函数功能:写入使能

*/

void XT25_WriteEnable(){

       SSP1_LOW();

       SPI1_comunication(WREN);

       SSP1_HIGH();

}

/**

* 函数功能:读状态寄存器

*/

uint8_t XT25_ReadSR(){

       uint8_t sr;

       SSP1_LOW();

       SPI1_comunication(RDSR);//发送读取命令

       sr=SPI1_comunication(0xff);//得到寄存器数据

       SSP1_HIGH();

       return  sr;

}

/*

*函数功能:忙碌等待 写入等待

*/

void XT25_Write_Wait(){

       int stat_code=0;

       while(1){

              stat_code=XT25_ReadSR();

              if(((stat_code&1<<1)==0x02)&&(stat_code&1)==0){

                     break;

              }

       }

}

/*

*函数功能:忙碌等待 读出等待

*/

void XT25_Read_Wait(){

       int stat_code=0;

       while(1){

              stat_code=XT25_ReadSR();

              if((stat_code&1)==0){

                     break;

              }

       }

}

/*

*函数功能:写FLASH

*/

void SPI1_Write_FLASH(uint8_t *data, uint8_t Length){

       uint8_t i;

       uint8_t sr;

       XT25_WriteEnable();//写入使能

       Delay_1s();//延时1秒

       src_addr[0]=WRITE;//页面编程开始

       //地址1~3

       src_addr[1]=(uint8_t)((ADDR)>>16);

       src_addr[2]=(uint8_t)((ADDR)>>8);

       src_addr[3]=(uint8_t) ADDR;

       //写入的数据

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

              src_addr[i+4]=data[i];

       }

       XT25_Write_Wait(); //忙时等待

       SSP1_LOW();//使能

       SSP1_Send((uint8_t *)src_addr,4+Length);

       SSP1_HIGH();//拉高

}

/**

* 函数功能:读flash

*/

void SPI1_Read_FLASH(uint8_t *data,uint8_t Length){

       int i;

       int stat_code=0;

       src_addr[0]=READ;

       //读取的地址

       src_addr[1]=(uint8_t)((ADDR)>>16);

       src_addr[2]=(uint8_t)((ADDR)>>8);

       src_addr[3]=(uint8_t) ADDR;

       XT25_Read_Wait();

       SSP1_LOW();

  SSP1_Send((uint8_t *)src_addr,4);

       SSP1_Receive((uint8_t *)dest_addr,Length);//接受温度

       SSP1_HIGH();

       for(i=0;i<Length;i++){ //温度为3个整数 1个小数点 2个小数

                     data[i]=dest_addr[i];

       }

}

#include <LPC11xx.h>

void I2c_Start();

void I2C_Stop();

void I2C_Send_Byte();

uint8_t I2C_Recieve_Byte();

void Ds1307_WriteByte(uint8_t WriteAddr,uint8_t WriteData);

void DS1307_Write(uint8_t *data);

/*

* 函数功能:DS1307初始化

* 默认初始化为全0

*/

void DS1307Init(){

       Ds1307_WriteByte(0x00,0x01);  //秒

       Ds1307_WriteByte(0x01,0x01);  //分

       Ds1307_WriteByte(0x02,0x01);  //时

       Ds1307_WriteByte(0x03,0x01);  //星期

       Ds1307_WriteByte(0x04,0x01);  //日

  Ds1307_WriteByte(0x05,0x01);  //月

       Ds1307_WriteByte(0x06,0x01);  //年

       uint8_t time[7]={0x00,0x00,0x00,0x05,0x10,0x02,0x23};

       DS1307_Write(time);

}

/**

* 函数功能:DS1307读

*                                        全读

*/

void DS1307_Read(uint8_t *data){

      

       Ds1307_WriteByte(0x3f,0x01);//定位ds1307内部指针到0x3f(RAM尾部)处

       I2c_Start();//start

       I2C_Send_Byte(0xd1);//读

       LPC_I2C->CONSET =(1<<2);//AA=1

      

       data[0]=I2C_Recieve_Byte();

  data[1]=I2C_Recieve_Byte();

       data[2]=I2C_Recieve_Byte();

       data[3]=I2C_Recieve_Byte();

       data[4]=I2C_Recieve_Byte();

       data[5]=I2C_Recieve_Byte();

      

      

       LPC_I2C->CONCLR =(1<<2);//AA=0

       data[6]=I2C_Recieve_Byte();

       I2C_Stop();//STOP

      

}

/**

* 函数功能:DS1307写

*                                        全写

*/

void DS1307_Write(uint8_t *data){

      

      

       I2c_Start();//start

       I2C_Send_Byte(0xd0);//读

       LPC_I2C->CONSET =(1<<2);//AA=1

       I2C_Send_Byte(0x00);//从0x00开始写入

       I2C_Send_Byte(data[0]);

  I2C_Send_Byte(data[1]);

  I2C_Send_Byte(data[2]);

  I2C_Send_Byte(data[3]);

  I2C_Send_Byte(data[4]);

  I2C_Send_Byte(data[5]);    

      

       LPC_I2C->CONCLR =(1<<2);//AA=0

       I2C_Send_Byte(data[6]);

       I2C_Stop();//STOP

      

}

/*

*函数功能:DS1307写一个字节

*/

void Ds1307_WriteByte(uint8_t WriteAddr,uint8_t WriteData)

{

                     //I2C_Start();    

         I2c_Start();//start

             

    I2C_Send_Byte(0xd0);    // Device Addr + Write (operation)

    I2C_Send_Byte(WriteAddr);

      

              LPC_I2C->CONCLR =(1<<2);//AA=0    接受完下一个字节后返回非应答信号

    I2C_Send_Byte(WriteData);

  

    I2C_Stop();  

   

}

/*

* 函数功能:DS1307读一个字节

*/

uint8_t Ds1307_ReadByte()

{

  uint8_t RevData;

 

  I2c_Start();//start              

  I2C_Send_Byte(0xD1);     // Device Addr + Write (operation)  

 

       LPC_I2C->CONCLR =(1<<2);//AA=0

  RevData = I2C_Recieve_Byte();   

 

  I2C_Stop();  

 

  return RevData;

}

#include <LPC11xx.h>

void I2c_Start();

void I2C_Stop();

void I2C_Send_Byte();

void UART_Send(uint8_t str[],int lenght);

uint8_t I2C_Recieve_Byte();

extern uint8_t buf[100]; //存放温度

uint16_t Temputerature_Test(){

       uint16_t Temputerature_8,Temputerature_16;

      

       float Temputerature;

       I2c_Start();//start

       I2C_Send_Byte(0x91);//读

       LPC_I2C->CONSET =(1<<2);//AA=1

       Temputerature_8=I2C_Recieve_Byte();//高八位

       LPC_I2C->CONCLR =(1<<2);//AA=0

       Temputerature_16=(Temputerature_8<<8)+I2C_Recieve_Byte();//合成温度

       I2C_Stop();//STOP

       //温度转换

       Temputerature_16=Temputerature_16>>5;

       if(Temputerature_16&0x0400){

              Temputerature=-(~(Temputerature_16&0x03ff)+1)*0.125;

       }else{

              Temputerature=0.125*(float)(Temputerature_16);

       }

       return (uint16_t)(Temputerature*1000);

}

void Get_temputerature(){

       uint16_t temp;

      

       temp=Temputerature_Test();//获得温度

      

       //将int 转为char 同时'0'对应00000000 对数值无影响

       buf[0]=temp/100000+'0';//

       if((temp/100000)==0)

                     buf[0]=' ';//不显示0

       buf[1]=temp/10000%10+'0';

       buf[2]=temp/1000%10+'0';

       buf[3]='.';

       buf[4]=temp/100%10+'0';

       buf[5]=temp/10%10+'0';

       buf[6]=temp%10+'0';

}

 五、成本核算情况

图16 成本核算表1

  图17 成本核算表2

图18 成本核算表3 

图19 成本核算表4 

图20 成本核算表5

7.3代码调试

 图28编译通过图片

图29调试图片 

7.4系统测试

测试过程:调试好代码之后,运行并下载到温度记录仪上,在PC端打开串口调试助手软件,设置好波特率数值为115200并打开串口。然后观察串口调试助手上接收到的室内的温度数据和时间,并进行必要的记录。

测试结果:程序代码成功下载到了温度记录仪上,温度记录仪绿色指示灯亮,表示温度记录仪正常运行,并且PC端的串口调试助手成功接收到了通过串口发送的室内空调下的温度数值—范围为24.750-25.200摄氏度,设计测试成功完成。

图30 串口调试助手一 

图31 串口调试助手二

7.5对结果的讨论与分析

通过把代码下载到课设电路板上,通过读取温度传感器采集到的室内温度,初始化LPC1114微控制器UART串行口,定时器、I2C总线接口、SSP串行端口为SPI帧格式;系统启动后,利用通用定时器实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值和DS1307读取当前时间,当前时间通过UART接口发送到PC,并通过SPI接口将读到的温度值存储到FLASH存储器XT25F02中,在PC上利用串口调试助手向LPC1114的UART接口发送读取命令,从FLASH存储器中读出温度数据,并通过UART接口发送到PC。然后通过对比实际室内的温度数值——25摄氏度,有细微的误差,数值很接近实际室内温度,证明程序成功实现了温度和时间记录。

八、完成情况与问题分析

通过LPC1114课程设计电路板上的系统启动后,利用通用定时器实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值和DS1307读取当前时间,当前时间通过UART接口发送到PC,并通过SPI接口将读到的温度值存储到FLASH存储器XT25F02中,在PC上利用串口调试助手向LPC1114的UART接口发送读取命令,从FLASH存储器中读出温度数据,并通过UART接口发送到PC。通过电脑上的串口助手即可得知该时刻LM75BD温度传感器所测得的数据,并不断更新。完成功能要求:(1)每秒检测一次环境温度并存储(2)存储数据与时间关联,可通过串行口导出(3)当前时间可通过串口进行设置和读取(4)USB供电(5)USB转串口数据传输(6)一个运行状态指示灯(7)一个功能按键

FLASH存储器XT25F02使用问题分析:

1.接口兼容性:LPC1114与XT25F02之间的通信接口必须兼容,以便LPC1114可以正确地读写XT25F02中的数据。可以通过查阅LPC1114和XT25F02的数据手册以及代码示例来解决接口兼容性的问题。

2.编程技巧:在LPC1114中使用XT25F02需要使用一些特定的编程技巧,如SPI接口配置、寄存器配置等。需要掌握这些技巧才能正确地将XT25F02集成到LPC1114应用中。

3.数据存储:使用XT25F02存储数据需要进行数据编码、存储器分配、读取校验等步骤。需要根据具体应用需求来实现这些功能,并且需要进行充分的测试和验证,以确保数据的正确性和可靠性。

解决以上问题的方法包括:

1.仔细研究LPC1114和XT25F02的数据手册和代码示例,确保接口兼容性和正确的接线方式。

2.学习和掌握相关的编程技巧,如SPI接口配置、寄存器配置等。

3.在实际应用中进行充分的测试和验证,确保数据的正确性和可靠性。

4.可以使用现成的开发工具和库,如Keil等,以加快开发过程。

九、学习心得

经过几天的努力学习和研究,我终于成功完成了课程报告。这些用于课程设计的时间完全没有白费,是一次非常宝贵的实践经验。通过这次课程设计,我得到了锻炼自己的机会,并且增强了自己的实际应用能力和解决问题的能力。在这次学习过程中,我也学到了很多东西。此外,在程序设计方面,我深刻地意识到了掌握基础知识的重要性。我更加清晰地了解了代码的实现,以及如何在实际开发过程中设计程序,以及如何实现程序的功能等等问题。

 

 

 

 

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

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

相关文章

基于51单片机数字频率计的设计与实现

目录 第一章 系统原理与总体设计 1.1系统组成 1.2系统原理 1.3测量原理 1.4频率测量与总体设计 第二章 硬件电路设计 2.1硬件电路框图 2.2数字频率计原理图 2.3硬件电路设计 第三章 软件程序设计 3.1程序流程图 3.2显示电路程序设计 3.3 定时器初始化程序设计 3.4…

MeetingService重构和ParticipantList性能优化实践

​ 一丶背景 1.1 现状 最初Rooms客户端只支持加入Rcv meeting这个meeting type&#xff0c;RcvMeetingStateService里写了一些加会的状态机转换和Audio, Video, Share相关的功能代码。后续有新的业务&#xff0c;需要增加支持Webinar, Sip等各种Meeting&#xff0c;MeetingS…

Linux Shell 实现一键部署ovirt4

ovirt 前言 oVirt是一个开源分布式虚拟化解决方案&#xff0c;旨在管理您的整个企业基础设施。oVirt使用可信的KVM管理程序&#xff0c;并基于其他几个社区项目构建&#xff0c;包括libvirt、Gluster、PatternFly和Ansible。 Ovirt仅支持系统Centos / Redhat ovirt download…

npm利用verdaccio工具发布到私有仓库的教程

文章目录 概要安装方式运行方式相关的配置淘宝源修改开发访问地址设置用户删除用户更换源设置发布当前包 概要 提示&#xff1a;用于将可复制和常用的方法打包发布 例如&#xff1a; 可以将我们的公共组件和工具类以及SDK等核心的代码发布到外网中&#xff0c;需要我们常见私…

小白到运维工程师自学之路 第三十五集 (MongoDB的基本使用)

一、概述 MongoDB是一个非关系型数据库管理系统&#xff0c;它使用文档模型存储数据。MongoDB中的文档类似于JSON对象&#xff0c;可以包含键值对和嵌套文档。MongoDB提供了强大的查询语言、聚合框架、索引和直接在数据存储中运行的计算。 MongoDB被广泛应用于许多领域&#x…

MySQL开启远程访问权限

默认情况下&#xff0c;MySQL只允许本地登录&#xff0c;即只能在安装MySQL环境所在的主机下访问。 但是在日常开发和使用中&#xff0c;我们经常需要访问远端服务器的数据库&#xff0c;此时就需要开启服务器端MySQL的远程连接权限。1、生成环境&#xff0c;连接MySQL 2、查看…

STM32单片机(六)TIM定时器 -> 第七节:TIM编码器接口

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

vue引入jszip下载多个图片并压缩下载

vue引入jszip下载多个图片并压缩下载 jszip官网地址 先进行jszip下载 npm install jszip然后废话不多说直接上代码 <template><div><button click"downloadImages">下载图片</button></div> </template><script> impo…

shell内置命令

目录 内置命令介绍内置命令列表alisa内置命令alias别名定义语法unalias 别名删除语法alias演示 echo内置命令echo命令介绍echo输出语法echo输出转义字符 read内置命令介绍语法options支持的参数示例1&#xff1a;多个变量赋值 exit内置命令介绍语法示例&#xff1a;Shell脚本文…

OPC AE server服务的实现

OPC AE server的实现 日前实现了OPC AE server&#xff0c;特此记录备查。 1、事件分三类&#xff0c;从下图可知每类都包含啥内容了&#xff0c;CONDITION看起来主要是一些越限&#xff0c;熟悉其它协议的朋友应该对这个不陌生&#xff0c;一般这种事件产生时&#xff0c;会…

通过Selenium实现Web自动化测试的研究

目录 前言&#xff1a; 1 自动化测试概念 1.2 自动化测试发展阶段 2 自动化测试工具Selenium简介 3 具体测试过程 4 总结 前言&#xff1a; Web自动化测试是Web应用程序测试的重要组成部分&#xff0c;它通过模拟实际用户行为&#xff0c;对Web应用程序进行自动化测试并…

chatgpt赋能python:Python拆包:提高编程效率的神器

Python拆包&#xff1a;提高编程效率的神器 在Python编程中&#xff0c;拆包&#xff08;unpacking&#xff09;是一项非常有用的技巧。它可以让你将一个可迭代对象&#xff08;iterable&#xff09;中的元素分离开来&#xff0c;赋值给多个变量。这个过程一般称为“解包”&am…

小白到运维工程师自学之路 第三十八集 (redis高可用集群)

一、概述 Redis高可用集群是一种分布式系统&#xff0c;它由多个Redis节点组成&#xff0c;可以提供高可用性和容错性。在Redis高可用集群中&#xff0c;每个节点都可以处理客户端请求&#xff0c;并且数据会在多个节点之间进行复制和同步&#xff0c;以确保数据的可靠性和一致…

Day_51-53kNN分类器

目录 Day_51&#xff1a;kNN分类器 一. 前言 二. 机器学习基本术语 三. kNN算法的原理 1. kNN算法的思想 2. kNN算法的具体实现过程 四. 代码实现 1. 导包 2. 参数初始化 3. 数据的导入 4. 数据的抽取 5. 对于测试集进行预测 6. 核心代码 Day_52&#xff1a;knn分类器&am…

LabVIEW开发微控制器控制的并行机器人的实时视觉图像处理

LabVIEW开发微控制器控制的并行机器人的实时视觉图像处理 通过相机视觉&#xff0c;以对目标物体的不同颜色进行分类&#xff0c;并与平行机器人一起拾取和放置物体。通过使用MATLAB Simulink模拟合适的机器人工作空间来研究使用相机的效率和机器人的准确性。机械臂以使用运动学…

OpenMMLab-AI实战营第二期——5-2. MMSegmentation代码课

文章目录 1. 自定义数据集1.0 整理数据集为特定格式1.1 持久化运行&#xff08;用文件定义&#xff09;1.2 运行时生效&#xff08;直接运行时定义一个class&#xff09;1.3 注意事项 2. 配置文件3. 运行训练和测试X. 其他语义分割数据集 视频链接&#xff1a;MMSegmentation代…

ThreadPoolExecutor源码

介绍 ThreadPoolExecutor 是 Java 中实现线程池的一个类&#xff0c;它是 ExecutorService 接口的一个实现类。线程池可以用来优化线程的使用&#xff0c;避免频繁地创建和销毁线程&#xff0c;以及限制并发线程的数量&#xff0c;从而提高应用程序的性能。 public class Thr…

读发布!设计与部署稳定的分布式系统(第2版)笔记06_用户

1. 系统的人类用户天生就具备进行创造性破坏的本事 1.1. 用户会消耗内存 1.2. 用户会做奇怪和随机的事情 1.2.1. fuzzing工具箱、基于属性的测试或模拟测试 1.3. 恶意用户总是存在的 1.3.1. 灾祸总会发生&#xff0c;坏人肯定存在 1.4. 用户会合伙对付你 2. 难伺候的用户…

【linux】opencv修改摄像头分辨率

起因 发现linux系统下调用opencv修改摄像头分辨率&#xff0c;一直修改不成功。 原本 正常在window下面读取摄像头数据是如下代码&#xff1a; # capture from web camcap cv2.VideoCapture(0)# set widthcap.set(3, 1280)# set heightcap.set(4, 720)while self._run_flag…

武职302303笔记-day01

这里写自定义目录标题 开发永和小票开发步骤1、对页面进行需求分析 使用CSS的方式 Order.html问题&#xff1a;html代码和css样式代码交织 idea开发后端程序使用chatGPT给我们打工QRCreate.java 开发永和小票 开发步骤 1、对页面进行需求分析 页面是很多文字组成&#xff0c;…