期末二选一项目:灯颜色随温度变化而变化
iew plaincopy to clipboardprint?
#include "stdio.h"
#include "stm32f10x.h"
int fputc(int ch,FILE *f);
/********************RCC配置*********************/
void RCC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//*设置PLL输入时钟源8x9=72M
RCC_PLLCmd(ENABLE);//*打开PLL:
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//*等待PLL工作:
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//*设置系统时钟
while(RCC_GetSYSCLKSource() != 0x08);
}
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
/**蜂鸣器*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //#管脚号 关闭蜂鸣器
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //#输出速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //#输入输出模式(推挽输出)
GPIO_Init(GPIOD, &GPIO_InitStructure); //#初始化
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
void delay_us(u32 n) //延时函数
{
u8 j;
while(n--)
for(j=0;j<10;j++);
}
void delay_ms(u32 n) //延时函数
{
while(n--)
delay_us(1000);
}
/*****************************GPIO初始********************************/
void GPIO_Inits(void)
{ /*结构体初始化及开启外设时钟*/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/*GPIOA--RGB初始化*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3)
}
/**************************DS18B20**********************/
uint8_t DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
Set_B20();
DS18B20_Rst();
return DS18B20_Presence ();
}
static void DS18B20_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
static void DS18B20_Rst(void)
{
/* 主机设置为输出 */
DS18B20_Mode_Out_PP();
Reset_B20() ;
delay_us(700);
Set_B20() ;
delay_us(15);
}
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time = 0;
/* 主机设置为上拉输入 */
DS18B20_Mode_IPU();
while( Read_B20() && pulse_time<100 )
{
pulse_time++;
delay_us(1);
}
/* 经过100us后,存在脉冲都还没有到来*/
if( pulse_time >=100 )
return 1;
else
pulse_time = 0;
/* 存在脉冲到来,且存在的时间不能超过240us */
while( !Read_B20() && pulse_time<240 )
{
pulse_time++;
delay_us(1);
}
if( pulse_time >=240 )
return 1;
else
return 0;
}
static uint8_t DS18B20_ReadBit(void)
{
uint8_t dat;
/* 读0和读1的时间至少要大于60us */
DS18B20_Mode_Out_PP();
Reset_B20();
delay_us(10);
DS18B20_Mode_IPU();
//Delay_us(2);
if( Read_B20() == SET )
dat = 1;
else
dat = 0;
delay_us(45);
return dat;
}
static uint8_t DS18B20_ReadByte(void)
{
uint8_t i, j, dat = 0;
for(i=0; i<8; i++)
{
j = DS18B20_ReadBit();
dat = (dat) | (j<<i);
}
return dat;
}
static void DS18B20_WriteByte(uint8_t dat)
{
uint8_t i, testb;
DS18B20_Mode_Out_PP();
for( i=0; i<8; i++ )
{
testb = dat&0x01;
dat = dat>>1;
/* 写0和写1的时间至少要大于60us */
if (testb)
{
Reset_B20();
/* 1us < 这个延时 < 15us */
delay_us(8);
Set_B20();
delay_us(58);
}
else
{
Reset_B20();
/* 60us < Tx 0 < 120us */
delay_us(70);
Set_B20();
delay_us(2);
}
}
}
static void DS18B20_SkipRom ( void )
{
DS18B20_Rst();
DS18B20_Presence();
DS18B20_WriteByte(0XCC); /* 跳过 ROM */
}
static void DS18B20_MatchRom ( void )
{
DS18B20_Rst();
DS18B20_Presence();
DS18B20_WriteByte(0X55); /* 匹配 ROM */
}
float DS18B20_GetTemp_SkipRom ( void )
{
uint8_t tpmsb, tplsb;
short s_tem;
float f_tem;
DS18B20_SkipRom ();
DS18B20_WriteByte(0X44); /* 开始转换 */
DS18B20_SkipRom ();
DS18B20_WriteByte(0XBE); /* 读温度值 */
tplsb = DS18B20_ReadByte();
tpmsb = DS18B20_ReadByte();
s_tem = tpmsb<<8;
s_tem = s_tem | tplsb;
if( s_tem < 0 ) /* 负温度 */
f_tem = (~s_tem+1) * 0.0625;
else
f_tem = s_tem * 0.0625;
return f_tem;
}
void DS18B20_ReadId ( uint8_t * ds18b20_id )
{
uint8_t uc;
DS18B20_WriteByte(0x33); //读取序列号
for ( uc = 0; uc < 8; uc ++ )
ds18b20_id [ uc ] = DS18B20_ReadByte();
}
float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
{
uint8_t tpmsb, tplsb, i;
short s_tem;
float f_tem;
DS18B20_MatchRom (); //匹配ROM
for(i=0;i<8;i++)
DS18B20_WriteByte ( ds18b20_id [ i ] );
DS18B20_WriteByte(0X44); /* 开始转换 */
DS18B20_MatchRom (); //匹配ROM
for(i=0;i<8;i++)
DS18B20_WriteByte ( ds18b20_id [ i ] );
DS18B20_WriteByte(0XBE); /* 读温度值 */
tplsb = DS18B20_ReadByte();
tpmsb = DS18B20_ReadByte();
s_tem = tpmsb<<8;
s_tem = s_tem | tplsb;
if( s_tem < 0 ) /* 负温度 */
f_tem = (~s_tem+1) * 0.0625;
else
f_tem = s_tem * 0.0625;
return f_tem;
}
int main()
{
uint8_t uc, ucDs18b20Id [ 8 ];
RCC_Configuration();
GPIO_Inits();
USART_int(9600);
while( DS18B20_Init() )
printf("\r\n no ds18b20 exit \r\n");
printf("\r\n Yes ds18b20 \r\n");
DS18B20_ReadId ( ucDs18b20Id ); // 读取 DS18B20 的序列号
printf("\r\nDS18B20的序列号是: 0x");
for ( uc = 0; uc < 8; uc ++ ) // 打印 DS18B20 的序列号
printf ( "%.2x", ucDs18b20Id [ uc ] );
for(;;)
{
static unsigned int i=0;
float a,b;
if(i==10)
{
printf ( "\r\n第10秒:温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
a=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
delay_ms(1000); /* 1s 读取一次温度值 */
i++;
}
else{}
if(i<10)
{
printf ( "\r\n温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
delay_ms(1000); /* 1s 读取一次温度值 */
i++;
}
if(i>10)
{
printf ( "\r\n10秒后:温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
b=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
delay_ms(1000); /* 1s 读取一次温度值 */
i++;
if((b-a)>0.9)
{GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
}
else{}
if((b-a)<0.9)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
}
else{}
}
else{}
}
}
int fputc(int ch,FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}
return ch;
}