这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 漓东e学堂 » 【1.24更新】36 嵌入式的学习

共11条 2/2 1 2 跳转至
菜鸟
2016-01-24 09:39:02     打赏
11楼

二选一题,第一题:

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

 


共11条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]