• 单片机延时函数


    1.51单片机延时,晶振为11.0592MHz

    (1)粗略延时

    
     void delay_ms(uint x)
    {
        uint i,j;
        for(i=x;i>0:i--)
            for(j=110;j>0;j--);
    }
    

    (2)定时器延时

    
    void delay_ms(uint i)
    {
        TMOD=0x01;   //设置定时器工作模式
        while(i != 0)
        {
            TR0=1;   //开启定时器
            TH0=(65535-1000)/256;    //赋初值
            TL0=(65535-1000)%256;
            while(TF0 != 1);   //溢出标志
            TF0=0;
            i--;
        }
        TR0=0;    //关闭定时器
    }
    

    2.stm32l151C8T6延时,外部晶振8MHz

    (1)粗略延时

    
    void delay_us(uint32_t time)     //us延时
    {
        uint32_t i=4*time;
        while(i--);
    }
    void delay_us(uint32_t time)     //ms延时
    {
        uint32_t i=4000*time;
        while(i--);
    }
    

    (2)使用nop延时
    通过使用__NOP()函数进行延时,因为使用了8M晶振4倍频,所以是32MHz,所以一个nop约等于1/32us,所以使用32个nop函数为一个us,然后根据需要的定时时间进行计算。

    
    void delay_us(uint32_t time)      //us延时
    {  
        uint32_t i=0;  
        for(i=0;i

    (3)利用SysTick延时

    
    void delay_init()       //初始化
    {
    	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  //选择外部时钟
    	fac_us=SystemCoreClock/8000000; //为系统时钟的1/8  4
    	fac_ms=1000*fac_us;
    }
    void delay_us(uint16_t nus)        //延时us
    {
    	uint32_t ui_tmp=0x00;
    	SysTick->LOAD=nus*fac_us;
    	SysTick->VAL=0x00;
    	SysTick->CTRL=0x01;	
    	do
    	{
    		ui_tmp=SysTick->CTRL;
    	}while((ui_tmp&0x01) && (!(ui_tmp & (1<<16))));	
    	SysTick->CTRL=0x00;
    	SysTick->VAL=0x00;
    }
    void delay_ms(uint16_t nms)         //延时ms
    {
    	uint32_t ui_tmp=0x00;
    	SysTick->LOAD=nms*fac_ms;
    	SysTick->VAL=0x00;
    	SysTick->CTRL=0x01;
    	do
    	{
    		ui_tmp=SysTick->CTRL;
    	}while((ui_tmp&0x01) && (!(ui_tmp&(1<<16))));	
    	SysTick->VAL=0x00;
    	SysTick->CTRL=0x00;
    }
    void SysTick_Handler(void)
    { 
    	flag=~flag;
    }
    

    (4)定时器延时

    
    void TIM3_Int_Init(uint16_t arr,uint16_t psc)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
    	//设置在下一个更新事件装入活动的自动重装载寄存器周期的值,计数10000为1s;
    	TIM_TimeBaseStructure.TIM_Period = arr; 	
    	//设置用来作为TIMx时钟频率除数的预分频值,10kHz的计数频率
    	TIM_TimeBaseStructure.TIM_Prescaler = psc;	
    	//设置时钟分割:TDIS = Tck_tim
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0;	
    	//设置TIM向上计数模式
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	
    	//初始化TIMx的时间基数单位
    	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);	
    	//使能指定的TIM3中断,允许更新中断
    	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);	
    	//TIM3中断
    	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    	//抢占优先级 0 级
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    	//从优先级 3 级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    	//IRQ通道被使能
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	//初始化外设NVIC寄存器
    	NVIC_Init(&NVIC_InitStructure);	
    	//使能TIMx外设
    	TIM_Cmd(TIM3,ENABLE);
    }
    void TIM3_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)  //检查指定的TIM中断发生与否
    	{
    		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除TIMx的中断待处理位	
    		if(flag==0)  
    		{
    			flag=1;
    			GPIO_ResetBits(GPIOB,GPIO_Pin_0) ;	
    		}
    		else
    		{
    			flag=0;
    			GPIO_SetBits(GPIOB,GPIO_Pin_0);
    		}		
    	}
    }
    注意:定时时间的计算
    定时器时钟为:CK_CLK 
    预分频数值:PSC 
    自动装载寄存器数值:ARR 
    进入中断的次数:time 
    t=time*(ARR+1)*(PSC+1)/(CK_CLK)
    
  • 相关阅读:
    CF 1119 题解
    CF 582 题解
    CF 1098 题解
    CF 1129 题解
    CF 513 题解
    CF 417 D 题解
    ingress nginx遇到502错误,connect() failed (113 Host is unreachable) while connecting to upstream
    MySQL性能剖析
    MySQL的基准测试
    MySQL架构与历史
  • 原文地址:https://www.cnblogs.com/yf4695/p/9220644.html
Copyright © 2020-2023  润新知