STM内部温度传感器串口显示完整程序
串口温度数据采集并实时显示
2013年4月17日[请输入学校名称[请 输 入 专 业] 论文串口温度数据采集并实时显示(上位机部分)姓 名: [请输入作者]学 号: [请 输 入 学 号]指导教师: [请输入指导教师]一、原理读串口数据的原理是,只要当有数据向串口发数据来时,计算机就会自动将其数据写到一个特定的缓冲区,我们只要写程序去读那个特定的缓冲区就可以了.有数据向串口发过来时,程序可以将数据接收到,接收的数据是字符型的,那么将数据转化为数字型的,再将这个数据的大小作为画图的某一个点的纵坐标,横坐标为数据的序号.将这些点用线连起来就是一个曲线图了,这个就是图形显示基本原理.查看原来的数据的原理也是这样的,不同的地方就是,数据是从文件中来,同样的也是将多个数据分成一个一个的,然后这一个数据的大小就是画图的某一个点的纵坐标,横坐标同样为数据的序号,再将这些点用线连起来就是曲线图.图形能移动的原理,是我们首先改变的只是数据,图形并没有变,但图形的形式是由这些数据来确定的,当数据发生变化后,我们通过刷新显示区来变化的.二、程序流程发送到串口来的数接收数据显示保存数据查看以前的数据打开以前的数据文件按《方式查按》方式查按<方式查按>方式查选择接收数据的方三、串口程序设计///////////////文件 commDlg.cpp//////////////////一个类,对话框类,本程序使用的是对话框形式,这个类是在VC 用MFC 自动生成的,其中包括了对话框程序应有的一些方法 class CAboutDlg : public CDialog { };/********************以下的个方法也是VC 的MFC 的对话框程序固有的,也是MFC 自动生成的**************/CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { }void CAboutDlg::DoDataExchange(CDataExchange* pDX) { }发送到串口来的数OnComm()Display() OnPaint()OnComm ()查看以前的数据打开以前的数据文件OnButton4(OnComselect(),OnComspe OnButton5(OnButton6(OnButton7BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CCommDlg::CCommDlg(CWnd* pParent /*=NULL*/): CDialog(CCommDlg::IDD, pParent){}void CCommDlg::DoDataExchange(CDataExchange* pDX){}//下面这个包括的是界面中的组件BEGIN_MESSAGE_MAP(CCommDlg, CDialog)END_MESSAGE_MAP()// CCommDlg message handlersBOOL CCommDlg::OnInitDialog(){}void CCommDlg::OnSysCommand(UINT nID, LPARAM lParam){}// The system calls this to obtain the cursor to display while the user drags the minimized window.HCURSOR CCommDlg::OnQueryDragIcon(){}BEGIN_EVENTSINK_MAP(CCommDlg, CDialog)END_EVENTSINK_MAP()/********************以上的个方法也是VC的MFC的对话框程序固有的,也是MFC自动生成的**************//********************我在做这个程序时以上的程序并没有手动修改*******************************/// 画图函数// 算法:运用LineTo函数把120个点连成折线void CCommDlg::OnPaint()}//对串口数据的处理,包括接收,保存等void CCommDlg::OnComm(){}//开串口程序void CCommDlg::OnButton1(){}//清除编辑框内容程序void CCommDlg::OnButton2(){}//选择那一个串口程序void CCommDlg::OnComselect(){}//选择波特率void CCommDlg::OnComspeed(){}//停止/继续程序void CCommDlg::OnStoprecv(){}//对数据显示前的处理:将新数年据加到左边,原来的右移一位void CCommDlg::Display(){}//以下四个函数是查看原来数据的程序//按钮《程序void CCommDlg::OnButton4(){}//按钮》程序void CCommDlg::OnButton5(){}//按钮< 程序void CCommDlg::OnButton6(){}//按钮> 程序void CCommDlg::OnButton7(){}//此函数用来查看最后一屏数据void CCommDlg::OnButton8(){}对于其它的文件中的程序我没有手动修改,均为MFC自动生成,我在这就不作详细介绍了.共有4个程序文件,5个头文件comm.cppcommDlg.cppmscomm.cppStdAfx.cppcomm.hcommDlg.hmscomm.hResource.hStdAfs.h┏━━━━━━━━━━━━━━━━━━━━━┓┃源码爱好者┃┣━━━━━━━━━━━━━━━━━━━━━┫┃┃┃提供源码发布与下载┃┃┃┃ ┃┃┃┃互助、分享、提高┃┗━━━━━━━━━━━━━━━━━━━━━┛田远驰t.yc@四、数据采集实时显示程序设计1、串口控件使用说明本程序使用VC6.0的通用串口控件MSCOMM32.OCX来对发送到串口的数据进行采集处理。
STM32-内部温度传感器-串口显示-完整程序
STM32F103 内部温度传感器用串口传递到PC上显示程序如下:#include "stm32f10x.h"#include "stm32_eval.h"#include "stm32f10x_conf.h"#include <stdio.h>#define DR_ADDRESS ((uint32_t)0x4001244C) //ADC1 DR寄存器基地址USART_InitTypeDef USART_InitStructure; //串口初始化结构体声明ADC_InitTypeDef ADC_InitStructure; //ADC初始化结构体声明DMA_InitTypeDef DMA_InitStructure; //DMA初始化结构体声明__IO uint16_t ADCConvertedValue; // 在内存中声明一个可读可写变量用来存放AD的转换结果,低12 位有效void ADC_GPIO_Configuration(void);static void Delay_ARMJISHU(__IO uint32_t nCount){ for (; nCount != 0; nCount--);}int main(void){u16 ADCConvertedValueLocal;USART_ART_BaudRate = 115200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;STM_EVAL_COMInit(COM1, &USART_InitStructure);/* Enable DMA1 clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel1); //开启DMA1的第一通道DMA_InitStructure.DMA_PeripheralBaseAddr = DR_ADDRESS; DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADCConver tedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA 的转换模式为SRC模式,由外设搬移到内存DMA_InitStructure.DMA_BufferSize = 1; //DMA缓存大小,1个 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//关闭接收一次数据后,目标内存地址后移DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。
STM32获取DHT11温度传感器数据
STM32获取DHT11温度传感器数据准备物件STM32F103C8T6核⼼板ST-LINK V2DHT11杜邦线若⼲连接线STM32F103C8T6芯⽚管脚图管脚说明连接仿真器STM32ST-LINKV2VCC VCCGND GNDSWCLK SWCLKSWDIO SWDIO创建⼯程参考可将其模板复制⼀份添加延时功能在DRIVER/inc中添加timer.h#ifndef __TIMER_H__#define __TIMER_H__#include "stm32f10x.h"void systick_init(void);void timing_delay_decrement(void);void delay_us(__IO uint32_t n);#endif对应的在DRIVER/src中添加timer.c#include "timer.h"__IO uint32_t gTimingDelay;/* SystemCoreClock / 1000 --> 1ms *//* SystemCoreClock / 10000 --> 100us *//* SystemCoreClock / 100000 --> 10us *//* SystemCoreClock / 1000000 --> 1us */void systick_init(void){while (SysTick_Config(SystemCoreClock / 1000000) == 1);}void timing_delay_decrement(void){if (gTimingDelay != 0x0){gTimingDelay--;}}void SysTick_Handler(void){timing_delay_decrement();}void delay_us(__IO uint32_t n){gTimingDelay = n;while(gTimingDelay != 0);}点亮LED可以看到核⼼板上有两个LED灯,PWR(电源)和PC13修改USER/main.c#include "stm32f10x.h"#include "timer.h"#define Led_On GPIO_SetBits(GPIOC, GPIO_Pin_13)#define Led_Off GPIO_ResetBits(GPIOC, GPIO_Pin_13)void LED_Init(){GPIO_InitTypeDef s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);s.GPIO_Pin = GPIO_Pin_13;s.GPIO_Mode = GPIO_Mode_Out_PP;s.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &s);}int main(){SystemInit();systick_init();LED_Init();while (1){Led_On;delay_us(500000);Led_Off;delay_us(500000);}}<1> 由于timer.c已经实现SysTick_handler中断实现,需要编辑USER/stm32f10x_it.c,将SysTick_handler函数注释<2> 右击⼯程名 -> Options -> C/C++ Compiler -> Preprocessor在"Additional include directories:"中添加$PROJ_DIR$\USER\inc\<3> 右击⼯程名 -> Options -> Debugger -> Setup在Driver中选择ST-LINK<4> 右击⼯程名 -> Options -> ST-LINK -> Setup在Reset选择Connect during reset在Interface中选择SWD<5> 点击编译,然后Download and Debug -> Go便可以看到PC13 LED灯均匀的闪烁。
Stm32F407IG内部温度传感器测试(CORTEX-M4+ADC+DMA)
Stm32F407IG内部温度传感器测试(CORTEX-M4+ADC+DMA)刚才发了ADC的一般用法,得知stm32内部内置了一个温度传感器,于是趁热调试了一下内部温度传感器。
没有软件滤波,正如手册里所说的,该温度传感器起到一个检测温度变化的作用,如果你想要精确的温度测量,请你外置测温元件...呵呵,测试结果如图:代码如下:/************************************************************Copyright (C), 2012-2022, yin.FileName: main.cAuthor: 小枣年糕Date: 2012\05\01Description: ADC1 DMA tempersensor printfVersion: V3.0IDE: MDK 4.22aHardWare: stm32F407IG HSE = 25M PLL = 168MHistory: V1.0Function: 利用ADC读取芯片内部温度传感器的值***********************************************************/#include<stm32f4xx.h>#include<stdio.h>/*定义ADC1的数据寄存器地址,DMA功能要用到外设的数据地址*ADC1的数据地址为外设基地址+偏移地址,基地址在RM0090 Reference*manual(参考手册)的地址映射表里,为0x40012000,ADC_DR*偏移地址为0x4C,故实际地址为0x40012000+0x4C = 0x4001204C */#define ADC1_DR_Addr ((uint32_t)0x4001204C)__IO uint16_t ADCoverValue;__IO float Temper;void GPIO_Config(void);void ADC_Config(void);void USART_Config(void);void DMA_Config(void);void NVIC_Config(void);void Delay(uint32_t nCount);/* printf函数重定向*/int fputc(int ch, FILE *f);main(){/*在主函数main之前通过调用启动代码运行了SystemInit函数,而这个函数位于system_stm32f4xx.c”。
单片机DS18B20温度传感器C语言程序含CRC校验综述
单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。
内部温度传感器串口显示完整程序
STM32F103 内部温度传感器用串口传递到PC上显示程序如下:#include ""#include ""#include ""#include <>#define DR_ADDRESS ((uint32_t)0x4001244C) n\r", a, b, c, d);Delay_ARMJISHU(8000000);}}void ADC_GPIO_Configuration(void) //ADC配置函数{GPIO_InitTypeDef GPIO_InitStructure;//PC0 作为模拟通道10输入引脚= GPIO_Pin_0; //管脚1= GPIO_Mode_AIN;//输入模式GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIO组}超级终端显示如下:关于一些数据格式的定义解释:#ifndef __STM32F10x_TYPE_H#define __STM32F10x_TYPE_Htypedef signed longs32;typedef signed short s16;typedef signed chars8;typedef signed longconst sc32;?typedef signed short const sc16;?typedef signed charconst sc8;typedef volatile signed longvs32;typedef volatile signed short vs16;typedef volatile signed charvs8;typedef volatile signed longconst vsc32;?typedef volatile signed short const vsc16;?typedef volatile signed charconst vsc8; typedef unsigned longu32;typedef unsigned short u16;typedef unsigned charu8;typedef unsigned longconst uc32;?typedef unsigned short const uc16;?typedef unsigned charconst uc8;typedef volatile unsigned longvu32;typedef volatile unsigned short vu16;typedef volatile unsigned charvu8;typedef volatile unsigned longconst vuc32;?typedef volatile unsigned short const vuc16;?typedef volatile unsigned charconst vuc8;typedef enum {FALSE = 0, TRUE = !FALSE} bool;typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;#define U8_MAX((u8)255)#define S8_MAX((s8)127)#define S8_MIN((s8)-128)#define U16_MAX((u16)65535u) #define S16_MAX((s16)32767) #define S16_MIN((s16)-32768) #define U32_MAX((u32)95uL) #define S32_MAX((s32)47)#define S32_MIN((s32)-48)#endif。
STM32-内部温度传感器-串口显示-完整程序
程序如下:
#include"stm32f10x.h"
#include"stm32_eval.h"
#include"stm32f10x_conf.h"
#include<stdio.h>
#defineDR_ADDRESS((uint32_t)0x4001244C)//ADC1DR寄存器基地址
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//连续转换开始,ADC通过DMA方式不断的更新RAM区。
while(1)
{
vu16Temperature,a,b,c,d;
ADCConvertedValueLocal=ADCConvertedValue;
Temperature=(1.43-ADCConvertedValueLocal*3.3/4096)*1000/4.35+25;
typedefvolatilesignedlong??vs32;typedefvolatilesignedshortvs16;typedefvolatilesignedchar??vs8;
typedefvolatilesignedlong??constvsc32;?typedefvolatilesignedshortconstvsc16;?typedefvolatilesignedchar??constvsc8;??
typedefvolatileunsignedlong??vu32;typedefvolatileunsignedshortvu16;typedefvolatileunsignedchar??vu8;
STM32F030读取温湿度传感器SHT20的C程序源码(经实测实用过)
****************************************************************************** * @file HTU20.x* @brief HTU20functi on* @cpu STM32F051* @compil er KeiluVisio n V5.01* @author Hanney* @copyri ght* @versio n V1.0.1* @date 18-Sept-2015* @modify date20-Sept-2015****************************************************************************** * @attent ion*///STM32F051 模拟IIC//#includ e "boardA PI.h"//#includ e "stm32f0xx.h"//#includ e "HTU20.h"//#includ e "uart.h"//#includ e "delay.h"#includ e "stm32f0xx.h"#includ e "stm32l ib.h"#define HTU20_CLK RCC_AH BPeri ph_GP IOB#define HTU20_SDA_P ORT GPIOB#define HTU20_SCL_P ORT GPIOB#define HTU20_SDA_P IN GPIO_P in_11#define HTU20_SCL_P IN GPIO_P in_10#define RESOLU TION_11b 0x81 //RH 11 TH 11#define RESOLU TION_12b 0x01 //RH 8 TH 12#define RESOLU TION_13b 0x80 //RH 10 TH 13#define RESOLU TION_14b 0x00 //RH 12 TH 14#define OTP_disEN 0x02 //不能启动OP T加载#define OTP_EN0x00 //启动OPT加载#define RESh 16 //湿度解析度#define RESt 16 //温度解析度#define Measur eDela y12 //解析延时时间单位mstypede f unsign ed char BYTE;typede f unsign ed int WORD;BYTE Delaym s;GPIO_I nitTy peDef GPIO_I nitSt ructu re;voiddelaym s(BYTE ms);/*** @brief StartHTU GPIO port CLK* @retval None*/voidHTUIni t(void){RCC_AH BPeri phClo ckCmd(HTU20_CLK, ENABLE);}/*================================================================ IIC addres s================================================================*/ #define SHT20A DDR 0x80/*================================================================ ACK and NACK defina tion================================================================*/ #define ACK 0#define NACK 1/*================================================================ HTU20D Comman d Code================================================================*/ /*Comman d Code Commen tTrigge r Temper ature Measur ement 0xe3 Hold masterTrigge r Humidi ty Measur ement 0xe5 Hold masterTrigge r Temper ature Measur emeng 0xf3 No Hold masterTrigge r Humidi ty Measur ement 0xf5 No Hold masterWriteuser regist er 0xe6Read user regist er 0xe7Soft Reset0xfe*/#define SOFT_R ESET0xfe#define READ_R EGIST ER 0xe7#define WRITE_REGIS TER 0xe6#define TRIGGE R_TEM P 0xf3#define TRIGGE R_HUM I 0xf5/*================================================================ HTU20operat e interf ace================================================================*/#define HTU20_SCL GPIO_R eadIn putDa taBit(HTU20_SCL_P ORT,HTU20_SCL_P IN) #define HTU20_SDA GPIO_R eadIn putDa taBit(HTU20_SDA_P ORT,HTU20_SDA_P IN)/*** @brief Set SDA pin dircat e as output* @retval None*/void HTU20_SDA_O UT(){GPIO_S truct Init(&GPIO_I nitSt ructu re);GPIO_I nitSt ructu re.GPIO_P in = HTU20_SDA_P IN;GPIO_I nitSt ructu re.GPIO_M ode =GPIO_M ode_O UT;GPIO_I nitSt ructu re.GPIO_O Type= GPIO_O Type_OD;GPIO_I nitSt ructu re.GPIO_S peed= GPIO_S peed_Level_2;GPIO_I nitSt ructu re.GPIO_P uPd =GPIO_P uPd_N OPULL;GPIO_I nit(HTU20_SDA_P ORT, &GPIO_I nitSt ructu re);}/*** @brief Set SDA pin dircat e as intput* @retval None*/void HTU20_SDA_I N(){GPIO_S truct Init(&GPIO_I nitSt ructu re);GPIO_I nitSt ructu re.GPIO_P in = HTU20_SDA_P IN;GPIO_I nitSt ructu re.GPIO_M ode =GPIO_M ode_I N;GPIO_I nitSt ructu re.GPIO_S peed= GPIO_S peed_Level_2;GPIO_I nitSt ructu re.GPIO_P uPd =GPIO_P uPd_N OPULL;GPIO_I nit(HTU20_SDA_P ORT, &GPIO_I nitSt ructu re);}/*** @briefSet SDA pin as high* @retval None*/void HTU20_SDA_1(){GPIO_S etBit s(HTU20_SDA_P ORT,HTU20_SDA_P IN);}/*** @briefSet SDA pin as low* @retval None*/void HTU20_SDA_0(){GPIO_R esetB its(HTU20_SDA_P ORT,HTU20_SDA_P IN); }/*** @brief Set SCL pin dircat e as output* @retval None*/void HTU20_SCL_O UT(){GPIO_S truct Init(&GPIO_I nitSt ructu re);GPIO_I nitSt ructu re.GPIO_P in = HTU20_SCL_P IN; GPIO_I nitSt ructu re.GPIO_M ode =GPIO_M ode_O UT; GPIO_I nitSt ructu re.GPIO_O Type= GPIO_O Type_OD; GPIO_I nitSt ructu re.GPIO_S peed= GPIO_S peed_Level_2; GPIO_I nitSt ructu re.GPIO_P uPd =GPIO_P uPd_N OPULL; GPIO_I nit(HTU20_SCL_P ORT, &GPIO_I nitSt ructu re);}/*** @briefSet SCL pin as high* @retval None*/void HTU20_SCL_1(){GPIO_S etBit s(HTU20_SCL_P ORT,HTU20_SCL_P IN);}/*** @briefSet SCL pin as low* @retval None*/void HTU20_SCL_0(){GPIO_R esetB its(HTU20_SCL_P ORT,HTU20_SCL_P IN);}/*================================================================ Simula tionI2C Functi on================================================================*//*** @brief A shortdelay for iic synchr oniza tion* @paramt us* @retval None*/void I2CDel ay (BYTE t){while(t--){__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();__nop(); __nop(); __nop(); __nop(); __nop();}}/*** @briefI2Cinit* @retval None*/void I2CIni t(void){HTUIni t();HTU20_SDA_O UT();HTU20_SCL_O UT();HTU20_SDA_1();I2CDel ay(1);HTU20_SCL_1();I2CDel ay(1);}/*** @brief IIC startsignal* @commen t SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低* @retval None*/void I2CSta rt(void){HTU20_SDA_O UT();HTU20_SDA_1();HTU20_SCL_1();I2CDel a y(5); //大于4.7usHTU20_SDA_0();I2CDel a y(5); //大于4usHTU20_SCL_0();I2CDel ay(5);}/*** @brief IIC Stop Signal* @commet SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高 * @retval None*/void I2CSto p(void){HTU20_SDA_O UT();HTU20_SDA_0();HTU20_SCL_0();I2CDel ay(5);HTU20_SCL_1();I2CDel ay(5);HTU20_SDA_1();I2CDel ay(5);}/*** @brief simu IIC writebyte* @paramW rite_Byte: data* @retval None*/BYTE I2C_Wr ite_B yte(BYTE Write_Byte){BYTE i;HTU20_SDA_O UT();for(i = 0; i < 8; ++i){if(Write_Byte& SHT20A DDR){HTU20_SDA_1();}else{HTU20_SDA_0();}I2CDel ay(1);HTU20_SCL_1(); //输出SDA稳定后拉高S CL,从机检测到后采样I2CDel a y(5); //保证足够长锁定时间,确保从机采样成功HTU20_SCL_0();I2CDel ay(1);Write_Byte<<= 1;}I2CDel ay(4);HTU20_SDA_1(); //8位发送完后释放数据线,准备接受应答信号HTU20_SCL_1(); //再次拉高SC L,告诉从机发送完毕,等待应答I2CDel a y(5); //原来是5HTU20_SDA_I N();i = 100;do{if(HTU20_SDA == 0) break;i--;I2CDel a y(4); //原来是5}while(i>0);HTU20_SCL_0();if(i) return ACK;else return NACK;// if(HTU20_SDA == 1) //SDA为高,收到NACK// return NACK;// else //SDA为低,收到ACK// return ACK;// HTU20_SCL_0();// I2CDel ay(15);}/*** @briefsimu read byte form IIC* @param* @retval None*/BYTE I2C_Re ad_By te(BYTE AckVal ue)//receiv ebyte{BYTE i, RDByte = 0;HTU20_SCL_0(); /*后改的程序*/HTU20_SDA_O UT();// HTU20_SCL_0();HTU20_SDA_1(); //释放总线,并置数据线为输入HTU20_SDA_I N();for (i = 0; i < 8; ++i){HTU20_SCL_1(); //拉高SCL期间,采样I2CDel ay(2);RDByte<<= 1;if(HTU20_SDA == 1){RDByte |= 0x01;}else{RDByte&= 0xfe;}I2CDel ay(1);HTU20_SCL_0(); //下降沿告知从机发送下一位I2CDel ay(6);}HTU20_SDA_O UT(); //接受完一个字节,发送ACKor NACK if(AckVal ue == 1){HTU20_SDA_1();}else{HTU20_SDA_0();}I2CDel ay(3);HTU20_SCL_1();I2CDel ay(5);HTU20_SCL_0(); //清时钟线I2CDel ay(15);//HTU20_SDA_1();return RDByte;}/*** @briefsoft resetby transm it resetcomman d* @retval None*/voidSoftRe set(void){I2CIni t();I2CSta rt();I2C_Wr ite_B yte(SHT20A DDR & 0xfe); //I2C addres s + writeI2C_Wr ite_B yte(SOFT_R ESET); //soft resetI2CSto p();}/*** @brief SET HTU20D resolu tionby writeregist er* @retval None*/voidSET_Re solut ion(void){I2CSta rt();if(I2C_Wr ite_B yte(SHT20A DDR & 0xfe) == ACK) //I2C addres s + write+ ACK{if(I2C_Wr ite_Byte(WRITE_REGIS TER)==ACK) //写用户寄存器{if(I2C_Wr ite_Byte(0x83)==ACK); //设置分辨率11bitRH% 测量时间:12ms(typ.)} // 11bitT℃测量时间:9ms(typ.)}I2CSto p();}/*** @brief read sht20's conver ted result* @paramT empOr HumiC MD: operat ion comman d for temper ature or humidi ty* @retval None*/floatReadSh t20(char TempOr HumiC MD){floattemp;BYTE MSB,LSB;floatHumidi ty, Temper ature;SET_Re solut ion();I2CSta rt();if(I2C_Wr ite_B yte(SHT20A DDR & 0xfe) == ACK) //I2C addres s + write+ ACK{if(I2C_Wr ite_B yte(TempOr HumiC MD) == ACK) //comman d{// delaym s(Measur eDela y); /*这两行由下面屏蔽了的两行改到上面来的*/// I2CSta rt();do{delaym s(Measur eDela y);I2CSta rt();} while(I2C_Wr ite_B yte(SHT20A DDR | 0x01) == NACK); //I2C addres s + read + NACKMSB = I2C_Re ad_By te(ACK);LSB = I2C_Re ad_By te(ACK);I2C_Re ad_By te(NACK); //Checks um + NACKI2CSto p();LSB &= 0xfc; //Data (LSB) 的后两位在进行物理计算前前须置0temp = (MSB << 8) + LSB;if (TempOr HumiC MD == ((char)TRIGGE R_HUM I)){/*-- calcul ate relati ve humidi ty [%RH] --*///equati on: RH% = -6 + 125 * SRH/2^REShHumidi ty = (temp * 125) / 65536- 6;return Humidi ty;}else{/*-- calcul ate temper ature [°C] --*///equati on:T = -46.85 + 175.72 * ST/2^REStTemper ature = (temp * 175.72) / 65536- 46.85;return Temper ature;}}}return 0;}voiddelaym s(BYTE ms){BYTE t;for(t=0;t<100;t++){I2CDel ay(10);}// Delaym s = ms;// while(Delaym s);}////////////////////////////////////////////////////////////////////////////////////////////////////#define TRIGGE R_TEM P 0xf3#define TRIGGE R_HUM I 0xf5void I2CIni t(void);voidSoftRe set(void);voidSET_Re solut ion(void);floatReadSh t20(char TempOr HumiC MD);。
温度传感器 程序
第4章系统程序的设计4.1 系统设计内容系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序、测量序列号子程序、显示数据刷新子程序等。
4.1.1主程序主程序主要功能是负责温度的实时显示、读出处理DS18B20的测量温度值。
主程序流程图如图4-1所示:开始初始化调用显示子程序读取并显示序列号显示当前四路温度图4-1 主程序流程图4.1.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节。
在读出时须进行CRC 校验,校验有错时不进行温度数据的改写。
读出温度子程序流程图如图4-2所示:图4-2 读出温度子程序流程图4.1.3 温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时,转换时间约为750ms 。
在本程序设计中,采用1s 显示程序延时法等待转换的完成。
温度转换命令子程序流程图如图4-3所示:图4-3 温度转换命令子程序流程图 4.1.4计算温度子程序计算温度子程序将RAM 中读取值进行BCD 码的转换运算,并进行温度值正负的判定。
计算温度子程序流程图如图4-4所示: 发DS18B20复位命发跳过ROM 命令发温度转换开始命令结束 开始复位DS18B20 发跳过ROM 命令 发出温度转换命转换完毕 复位DS18B20 发匹配ROM 命令发1个DS18B20序列读温度值存入储存器 指向下一个延时N Y图4-4 计算温度子程序流程图4.1.5 温度数据的计算处理方法从DS18B20读取出的二进制值必须转换成十进制值,才能用于字符的显示。
DS18B20的转换精度为9~12位,为了提高精度采用12位。
在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为寄存器里的二进制值乘以0.0625,就是实际的十进制温度值。
通过观察表4-1可以发现,一个十进制与二进制间有很明显的关系,就是把二进制的高字节的低半字节和低字节的高半字节组成一字节,这个字节的二进制化为十进制后,就是温度值的百、十、个位字节,所以二进制值范围是0~F ,转换成十进制小数就是0.0625的倍数(0~15倍)。
单片机STM32实验报告
实验报告课程名称:单片微机原理与车载系统学生姓名蒋昭立班级电科1601学号16401700119指导教师易吉良成绩2018年12 月17 日实验1 GPIO实验1.1 实验目的1)熟悉MDK开发环境;2)掌握STM32单片机的GPIO使用方法。
1.2 实验设备1)一台装有Keil和串口调试软件的计算机;2)一套STM32F103开发板;3)STlink硬件仿真器。
1.3 基本实验内容1)熟悉MDK开发环境,参考《STM32F1开发指南(精英版)-寄存器版本_V1.0》第3章,安装MDK 并新建test工程,运行例程,在串口窗宽观察结果,并记录如下:从图片可以看出,例程运行成功,没有错误。
2)按键输入实验,《STM32F1开发指南(精英版)-寄存器版本_V1.0》第8章。
实现功能:3 个按钮(KEY_UP、KEY0和KEY1),来控制板上的2 个LED(DS0 和DS1)和蜂鸣器,其中KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY1 控制DS1,按一次亮,再按一次灭;KEY0 则同时控制DS0 和DS1,按一次,他们的状态就翻转一次。
理解连续按概念及其实现代码。
参数mode 为0 的时候,KEY_Scan 函数将不支持连续按,扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。
当mode 为1 的时候,KEY_Scan 函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。
寄存器方法实现不支持连续按的关键代码,以及程序运行后的效果。
由程序可知,给KEY_Scan函数输入的值为0,为不支持连按模式。
寄存器方法实现支持连续按的关键代码,以及程序运行后的效果。
由程序可知,给KEY_Scan函数输入的值为1,为支持连按模式。
3)采用库函数方法实现按键输入实验,参考《STM32F1开发指南(精英版)-库函数版本_V1.0》第8章。
51单片机Ds18b20温度传感器程序
* 实验名 : 18B20温度显示试验* 实验说明 : 数码管显示温度值,并且将温度值通过串口发送到电脑上。
* 连接方式 : 见连接图temp.h#ifndef __TEMP_H_#define __TEMP_H_#include<reg51.h>//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//--定义使用的IO口--//sbit DSPORT=P3^7;//--声明全局函数--//void Delay1ms(uint );uchar Ds18b20Init();void Ds18b20WriteByte(uchar com);uchar Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();#endiftemp.c#include"temp.h"/******************************************************************************** 函数名: Delay1ms* 函数功能: 延时函数* 输入: 无* 输出: 无*******************************************************************************/void Delay1ms(uint y){uint x;for( ; y>0; y--){for(x=110; x>0; x--);}}/******************************************************************************** 函数名: Ds18b20Init* 函数功能: 初始化* 输入: 无* 输出: 初始化成功返回1,失败返回0*******************************************************************************/ uchar Ds18b20Init(){uchar i;DSPORT = 0;//将总线拉低480us~960usi = 70;while(i--);//延时642usDSPORT = 1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i = 0;while(DSPORT)//等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功}/******************************************************************************** 函数名: Ds18b20WriteByte* 函数功能: 向18B20写入一个字节* 输入: com* 输出: 无*******************************************************************************/void Ds18b20WriteByte(uchar dat){uint i, j;for(j=0; j<8; j++){DSPORT = 0;//每写入一位数据之前先把总线拉低1usi++;DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDSPORT = 1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;}}/******************************************************************************** 函数名: Ds18b20ReadByte* 函数功能: 读取一个字节* 输入: com* 输出: 无*******************************************************************************/ uchar Ds18b20ReadByte(){uchar byte, bi;uint i, j;for(j=8; j>0; j--){DSPORT = 0;//先将总线拉低1usi++;DSPORT = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DSPORT;//读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。
测温并串口通信送电脑显示
河南大学物理与电子学院开放实验室单片机设计报告测温并串口通信送电脑显示设计人:开放实验室入室人员I目录0 前言 (1)1系统组成与功能................................................................. 错误!未定义书签。
1.1 系统组成 (1)1.1.1 AT89C51单片机 (1)1.1.2 温度传感器18b20 (1)1.1.3四位一体七段数码管 (2)1.2 系统功能 (3)2系统原理 (3)2.1系统仿真图 (4)2.2 实物照片 (4)3程序流程图 (5)4具体程序代码 (6)5结论 (8)参考文献 (8)II1 基于单片机测温送电脑显示0 前言随着社会的发展,单片机得到了广泛的应用。
人们越来越重视单片机的应用。
而温度适合每个人息息相关的,并且在有的生产车间里还要进行温度时时测量,甚至是对温度的进一步调控。
本设计是基于单片机和温度传感器的一个小的电脑和单片机的单向通信。
1系统组成与功能1.1 系统组成本系统主要有AT89C51单片机、18b20、1602、蜂鸣器、四位一体七段数码管等元件组成。
1.1.1 AT89C51单片机AT89S51具有如下特点:40个引脚,8k Bytes Flash 片内程序存储器,256 bytes 的随机存取数据存储器(RAM ),32个外部双向输入/输出(I/O )口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT ) 电路,片内时钟振荡器。
此外,AT89S52设计和配置了振荡频率可为0Hz 并可通过软件设置省电模式。
空闲模式下,CPU 暂停工作,而RAM 定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM 的数据,停止芯片其它功能直至外中断激活或硬件复位[2]。
引脚图如图1-1所示。
1.1.2 温度传感器18b20 DS18B20的主要特征:○1全数字温度转换及输出。
温度传感器18B20驱动程序(C语言)
//1楼主:温度传感器18B20驱动程序(C语言)/*************************************************************18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*************************************************************/#define uchar unsigned char#define uint unsigned intsbit dq = P1^7;bit flag;uint Temperature;uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar id_buff[8];uchar *p;uchar crc_data;uchar code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176,238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (uchar us){while(us--);}/*************************************************************Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/void Init18b20 (void){dq=1;_nop_();dq=0;TempDelay(86); //delay 530 uS//80_nop_();dq=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(dq==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();dq = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/ void WriteByte (uchar wr) //单字节写入{uchar i;for (i=0;i<8;i++){dq = 0;_nop_();dq=wr&0x01;TempDelay(5); //delay 45 uS //5_nop_();_nop_();dq=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ uchar ReadByte (void) //读取单字节{uchar i,u=0;for(i=0;i<8;i++){dq = 0;u >>= 1;dq = 1;if(dq==1)u |= 0x80;TempDelay (4);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (uchar j){uchar i;for(i=0;i {*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ uchar CRC (uchar j){uchar i,crc_data=0;for(i=0;i crc_data = CrcTable[crc_data^temp_buff[i]]; return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/ void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件 id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}/*急什么?急着买吗?还是要程序?我给你提供一段吧!也是网友写的。
DS18B20温度传感器(基于STM32)
#include "stm32f10x.h"
#include "stdio.h"
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* TIM IT enable */
// TIM_ITConfig(TIM2, TIM_IT_CC1 , ENABLE);
/* TIM2 enable counter */
// TIM_Cmd(TIM1, ENABLE);
//TIM_Cmd(TIM2, ENABLE);
printf(" ok");
#include "platform_config.h"
#include "misc.h"
#include "DS18b20.h"
#include "Systick_Delay.h"
/** @addtogroup StdPeriph_Examples
* @{
*/
unsigned char sign , interger ;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
温度传感器的单片机处理显示程序
//////// Function: Test Temperature.-30~+105//// Used Equation//// RT/R25=e(B*((1/(T+273))-(1/298)))//////// Change List: V0.9 -> V0.91 (07,02)//// Change display A error//////// V0.91 -> V0.92 (07,03)//// Add Temp Tab jiaozheng 70~100C ////////******************************************************//#include "ADUC812.h"#include "math.h"#include "intrins.h"#include "string.h"#include "stdio.h"#include "dada.h"bdata unsigned char LCD_data[8];//** Display Buffer **//int ssdata[3];#define Temp_100 235#define Temp_40 1352sbit s_data = P2^0;//** LCD Serial Data Port **//sbit clk_lcd = P2^2;//** LCD Clock Port **//sbit lcd_cs = P2^1;//** LCD Chip Select Port **//sbit led =P2^7;//********** LCD Command Name Define ***********//#define cmd_off 0x00//** LCD Control Power Down **//#define cmd_on 0x01//** LCD Control Power Up **//#define cmd_LCD_off 0x02//** Close LCD **//#define cmd_LCD_on 0x03//** Open LCD **//#define cmd_LCD_B3C4 0x29//** LCD Mode 1/3BAIS,1/4DUTY **//#define cmd_LCD_RC 0x18//** LCD Control Internal Oscillator 256K **//// data unsigned char Comm_buff[16];//** Serial Port Receiver Buffer **////data unsigned char Comm_len;//** Serial Port Receiver Data Length **////bit Comm_ready;//** Serial Port Receiver Flag **////** LCD Code 0,1,2...A,B,F,0.,1.,...A.,B.,F. **//unsigned char code LCD_code[] ={0xeb,0x60,0xc7,0xe5,0x6c,0xad,0xaf,0xe0,0xef,0xed,0xee,0x2F,0 x8b,0x67,0x8F,0x8e,0xfb,0x70,0xd7,0xf5,0x7c,0xbd,0xbf,0xf0,0xff,0xfd,0xfe,0x3f,0 x9b,0x77,0x9f,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00};//****************** delay *********************//void Delay(int p) //** Delay p Clock Cycle **//{int j;for(j=0;j<=p;j++){_nop_();}}//************* Delay N ms *********//void Delay_ms(int n){int i,j;for(i=0;i<=n;i++){for(j=0;j<=52;j++)//** Delay 1 ms **//{_nop_();}}}//************* LCD Data Display ****************//void LCD_Display(){unsigned char data i,j,k,tmp,tmp1,tmp2;//** Write 'Writr Mode' Command Word '101' **//lcd_cs = 0; //** Chip Select Enable **//Delay(100);clk_lcd = 0; //** Clock Down Edge **//s_data = 1; //** Data '1' **//clk_lcd = 1; //** Clock Up Edge **//clk_lcd = 0; //** Clock Down Edge **//s_data = 0; //** Data '0' **//clk_lcd = 1; //** Clock Up Edge **//clk_lcd = 0; //** Clock Down Edge **//s_data = 1; //** Data '1' **//clk_lcd = 1; //** Clock Up Edge **//s_data = 0;for(i=0; i<6; i++) //** Write First Address '00000'(A5-A0) **//{clk_lcd = 0; //** Clock Down Edge **//s_data = 0; //** Data '0' **//clk_lcd = 1;//**Clock Up Edge **//}for(i=0; i<8; i++) //** 8 Bits Display Data **//{k=8;tmp = LCD_data[i];tmp1 = tmp&0xf0; //** High 4 Bits **//tmp2 = tmp&0x0f; //** Low 4 Bits **////** Data Bits Write Out From M to L **//for(j=0; j<k; j++){clk_lcd = 0; //** Clock Down Edge **//if(tmp & 0x80)//** Data Out **//s_data = 1;elses_data = 0;clk_lcd = 1; //** Clock up Edge **//tmp = tmp << 1; //** Data << 1 Bit **//}}lcd_cs = 1;//** LCD Chip Select Disable *8//}//************** LCD Command Write *************//void LCD_CMD(unsigned char cmd){unsigned char data i;//*** Write Command Control Word 100 ***//lcd_cs = 0; //** Chip Enable **//Delay(100);clk_lcd = 0; //** Clock Up Edge **//s_data = 1; //** Data '1' **//clk_lcd = 1; //** Clock Down Edge **//clk_lcd = 0; //** Clock Up Edge **//s_data = 0; //** Data '0' **//clk_lcd = 1; //** Clock Down Edge **//clk_lcd = 0; //** Clock Up Edge **//s_data = 0; //** Data '0' **//clk_lcd = 1; //** Clock Down Edge **////** Write Command Word Bits From M to L,Add One Bit(hardware need) **//for(i=0; i<9; i++){clk_lcd = 0; //** Clock Down Edge **//if(cmd & 0x80)s_data = 1;elses_data = 0; //** Data Write **//clk_lcd = 1; //** Clock Up Edge **//cmd = cmd << 1; //** Command Data <<1 Bit **//}lcd_cs = 1; //** Chip Select disable **//}//******** Display *****************//void Display(float TT){intcon1=0,con2=0,con3=0,con4=0,con5=0,con6=0,dd=0,ss=0;long tt6;dd=TT*100;if(dd<0){dd=abs(dd);LCD_data[7]=0x04; //** +&- **//}else{LCD_data[7]=0x00;}ss=dd;con5=ss%10;ss=dd/10;con4=ss%10;ss=dd/100;con3=ss%10;ss=dd/1000;con2=ss%10;ss=dd/10000;con1=ss%10;tt6=TT*1000;dd=tt6%10;if(dd>=5){con5=con5+1;if(con5>9) //**V0.9 -> V0.91 chang dispaly A error **//{con5=0;con4=con4+1;if(con4>9){con4=0;con3=con3+1;if(con3>9){con3=0;con2=con2+1;if(con2>9){con2=0;con1=con1+1;}}}} //*** V0}//LCD_data[7]=//LCD_code[];//** LCD Data **//LCD_data[6]=LCD_code[con1];LCD_data[5]=LCD_code[con2];LCD_data[4]=LCD_code[con3+0x10];LCD_data[3]=LCD_code[con4];LCD_data[2]=LCD_code[con5];LCD_data[1]=0xcc;//LCD_code[com2];LCD_data[0]=0x8b;//LCD_code[com1];LCD_Display();}//*************** Clear LCD ********************//void Clear_LCD(){LCD_data[0] = 0x00;LCD_data[1] = 0x00;LCD_data[2] = 0x00;LCD_data[3] = 0x00;LCD_data[4] = 0x00;LCD_data[5] = 0x00;LCD_data[6] = 0x00;LCD_data[7] = 0x00;LCD_data[8] = 0x00;LCD_Display();}//***************** LCD Inital *****************//void Inital_LCD(void){LCD_CMD(cmd_off); //** Close LCD System Oscillator **//LCD_CMD(cmd_LCD_off); //** Close LCD Bisa Control **//LCD_CMD(cmd_LCD_RC); //** Start internal RC Oscillator **//LCD_CMD(cmd_on); //** Open LCD System Oscillator **//LCD_CMD(cmd_LCD_on); //** Open LCD Bisa Control **//LCD_CMD(cmd_LCD_B3C4); //** Set Mode 1/3BAIS,1/4DUTY **//}//****** Serial Port set *******//void Inital_Serial(void){SCON=0x52; //** Serial Mode 1 **//TMOD=0x21; //** T1 Mode 2 **//TH1=0xFD;TL1=0xFD; //** Baud 9600 **//TR1=1; //** Start T1**//TI=1; //** Open Int T1 **//EA=1; //** Open All Int **//}//********** LCD Check *********//LCD_Check(){int i;for(i=0;i<5;i++){Clear_LCD();led=1;Delay_ms(500);LCD_data[7]=0xFF;//** LCD Data = FF **//LCD_data[6]=0xFF;LCD_data[5]=0xFF;LCD_data[4]=0xFF;LCD_data[3]=0xFF;LCD_data[2]=0xFF;LCD_data[1]=0xFF;LCD_data[0]=0xFF;LCD_Display();led=0;Delay_ms(500);}}//************** AD Inital *************//void AD_Set(void){ADCCON1=0x7C; //** Start ADC,Clock=CK/8,8Clock **//ADCCON2=0x21; //** serial ADC, Port 4 **//Delay(100);}//********************************** Main Program *************************************//void main(void){int Data;int i,j,Channel;float Sum;float Temp;//****** Inital Set *****//Inital_Serial();Inital_LCD();LCD_Check();AD_Set();//******* Start *************//while(1){Channel=ADCDATAH>>4;if(Channel==0x01){Sum=0;for(i=0;i<100;i++){Data=ADCDATAL|((ADCDATAH&0x0F)<<8);// printf("%d\n",Data);Sum=Sum+Data;}Sum=Sum/100.0;// Sum=1800.0;//*** V0.91 -> V0.92 ADD check Tab **//if(Sum<=Temp_40){if(Sum>=Temp_100){for(i=0;i<75;i++){if(Sum<=ADC_Data[i]){j=i;}}Temp=Temp_Tab[j]+((Temp_Tab[j+1]-Temp_Tab[j])*(ADC_Data[j]-Sum)/(ADC_Data[j]-ADC_Data[j+1]));} /}else{Temp=1.0/((log(Sum/2250.0))/3470.0+(1.0/298.0))-273.0;}Delay(50);}//Temp=101.372;printf("temperature=%.1f\n",Temp);Delay_ms(900);Display(Temp);Delay(20);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[80乙NN入fP86TLN£W8乙丄dflCTM丄入门]:各霸尅勒昭护轴兀(g) @ @ @
•4r耳5F第誓曹a
审嚣敢尊®猱姆W WIS
S T M 3 2 F 1 0 3 内部温度传感器用串口传递到P C ±显示
程序如下:
#include "”
ttinclude
#include "”
ttinclude <>
ttdefine DR_ADDRESS ((uint32_t) 0x4001244C) n\r〃,a, b, c, d);
Delay_ARMJISHU(8000000);
}
}
void ADC_GP 10_Conf i gur at ion (vo id) //ADC 配置函数
{
GPIO_InitTypeDef GPIO_InitStructure;
//PCO作为模拟通道10输入引脚
=GPI0_Pin_0; 〃管脚 1
=GPIO_Mode_AIN;//输入模式
GPI0_Init(GPI0C, &GPI0_InitStructure);//GPI0 组
当前STM32芯片内部温度为:00&8°C.
当M-STM32芯片內部温度为:0047°C .
当前STM32芯片内部温度为;00489 .
当前STM32芯片內部温度为:0触TC.
当前STM32芯片内部温度为;0047^C .
当前STM32芯片内部温度为:如匸TC.
当前STM32芯片内部温度为:0047ff C .
当前STM32芯片内部温度为:0047^C .
当M-STM32芯片內部温度为:0047°C .
当前STM32芯片内部温度为;8047^ .
当前STM32芯片內部温度为:0酣6°C.
关于一些数据格式的定义解释:
ttifndef _STM32F10x_TYPE_H#define _STM32F10x_TYPE_H
typedef signed long?s32;
typedef signed char?s8;
typedef signed long?const sc32;typedef signed short const scl6;typedef signed charconst sc8: typedef volatile signed long?vs32;超级终端显示如下: 当前STM32芯片內部温度为:0046°C .
typedef signed short sl6;
typedef volatile signed short vsl6:
volatile unsigned charconst vuc8;
typedef enum {FALSE 二 0, TRUE 二!FALSE} bool: typedef enum {RESET = 0, typedef volatile signed char?vs8:
typedef volatile signed long?const vsc32;typedef volatile signed short const vscl6:typedef volatile signed charconst vsc8:
typedef unsigned long?u32; typedef unsigned short ul6:
typedef unsigned char?u8;
typedef unsigned long?const uc32;typedef unsigned short const
ucl6;typedef unsigned charconst uc8; typedef volatile unsigned long?vu32;
typedef volatile unsigned short vul6:
typedef volatile unsigned char?vu8;
typedef volatile unsigned long?const vuc32:typedef volatile unsigned
short const vucl6;typedef
SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;ttdefine
IS_FUNCTIONAL_STATE(STATE) (((STATE)二二DISABLE) | ((STATE)二二ENABLE)) typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
ttdefine U8JIAX? ((u8) 255)
ttdefine S8_MAX?((s8)127)
ttdefine S8_MIN?((s8)-128)
ttdefine U16J1AX? ((ul6) 65535u)
ttdefine S16JIAX?((sl6) 32767)
ttdefine S16_MIN?((sl6)-32768)
ttdefine U32JIAX?
ttdefine S32JIAX?
ttdefine S32_MIN?
ttendif。