Delay_ms延时函数详解

void Delay_ms(unsigned int time)
{
    unsigned char  n;
   while(time>0)
    {
    for(n=0;n<187;++n)
  {
asm("nop");
}
time--;
}
}

在流程中加入延时函数的原因是:单片机执行命令的速度太快(如果选择1MHz的晶振频率,AVR执行大多数指令的时间仅仅是1),任由单片机;连续改变端口输出的话,由于人眼辨别物体的速度跟不上,我们将看不到任何闪烁的效果,所以加入延时来放慢端口电平的变化速度


软件延时的基本原理是多次重复执行指令,比如1条指令执行需要1微妙的时间,那么执行一千条这个指令 就会消耗一毫秒的时间;  其中asm("nop");语句是插入汇编指令的写法。表示在for循环中插入一条nop指令,这是一个空操作指令;它的执行将消耗掉一个cpu周期,因为我们的目的就是延时,所以空操作就可以;

但是C语言书写的fof循环编译器会加入很多我们看不到的底层实现代码,它们的执行也需要时间,所以循环次数远小于1000;


注意:软件延时只能用到要求不高的场合,因为软件延时会无端的浪费掉单片机的资源,延时也容易被打断就不准确了
void PCBA_ICT() { uint PCBA_ICT_TIMES=0; UART2_SEND_STR("PCBA_ICT"); UART2_SEND_STR("\r\n"); while(1) { if(PCBA_ICT_TIMES++>500)break; delay_ms(1); if(PCBA_ICT_BIT==1) { PCBA_ICT_BIT=0; IO_ICT_INIT(); delay_ms(500); UART2_SEND_STR("MODEL:C252"); UART2_SEND_STR("\r\n"); delay_ms(500); UART2_SEND_STR("REV:V1.0"); UART2_SEND_STR("\r\n"); delay_ms(500); UART2_SEND_STR("HEAT.TEST"); //\为转义字符 UART2_SEND_STR("\r\n"); HEAT_DATA=1; delay_ms(500); HEAT_DATA=0; UART2_SEND_STR("VALVE.TEST"); UART2_SEND_STR("\r\n"); VALVE_DATA=1; delay_ms(500); VALVE_DATA=0; UART2_SEND_STR("PUMP.TEST"); UART2_SEND_STR("\r\n"); PUMP_DATA=1; delay_ms(500); PUMP_DATA=0; UART2_SEND_STR("VOL.TEST"); UART2_SEND_STR("\r\n"); delay_ms(500); UART2_SEND_STR("CN6.TEST"); UART2_SEND_STR("\r\n"); IOPOUT1_O=IOPOUT2_O=IOPOUT3_O=IOPOUT4_O=IOPOUT5_O=IOPOUT6_O=0; delay_ms(500); UART2_SEND_STR("CN5.TEST"); UART2_SEND_STR("\r\n"); IOPOUT7_O=IOPOUT8_O=IOPOUT9_O=IOPOUT10_O=0; delay_ms(500); UART2_SEND_STR("CN4.TEST"); UART2_SEND_STR("\r\n"); FLOW_O=0; delay_ms(500); UART2_SEND_STR("CN1.TEST"); UART2_SEND_STR("\r\n"); NOTE_O=0; delay_ms(500); UART2_SEND_STR("CN3.TEST"); UART2_SEND_STR("\r\n"); NTC1_O=0; delay_ms(500); UART2_SEND_STR("CN7.TEST"); UART2_SEND_STR("\r\n"); PIC1_O=PIC2_O=0; delay_ms(500); UART2_SEND_STR("CN2.TEST"); UART2_SEND_STR("\r\n"); LED1_O=LED2_O=0; delay_ms(500); UART2_SEND_STR("PCBA ICT END"); UART2_SEND_STR("\r\n"); delay_ms(500); //WWDG_SWReset(); //复位寄存器软件复位 } /*****************串口接收数据*******************/ UART2_Receive_Data_Processing(); //LIN串口接收数据判断 UART2_Data_processing(); //串口接收数据处理 } }
最新发布
04-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值