延时1us程序12mhz晶振c语言,51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)...
一. 500ms延时子程序
void delay500ms(void)
{
unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);
}
产生的汇编:
C:0x0800 7F0F MOV R7,#0x0F
C:0x0802 7ECA MOV R6,#0xCA
C:0x0804 7D51 MOV R5,#0x51
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
计算分析:
程序共有三层循环
一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us
循环外: 5us子程序调用2us +子程序返回2us + R7赋值1us = 5us
延时总时间=三层循环+循环外= 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
二. 200ms延时子程序
void delay200ms(void)
{
unsignedchari,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);
}
产生的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E84 MOV R6,#0x84
C:0x0804 7D96 MOV R5,#0x96
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
三. 10ms延时子程序
void delay10ms(void)
{
unsignedchari,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);
}
产生的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E04 MOV R6,#0x04
C:0x0804 7DF8 MOV R5,#0xF8
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
四. 1s延时子程序
void delay1s(void)
{
unsignedcharh,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);
}
对1s延时的验证:
1.设置仿真的晶振为12MHz
2.在延时函数设置断点
3.单步运行程序,到达延时函数的入口
4.先记下进入延时函数的时间
5.step out跳出函数,记下此时时间,两个时间相减即为延时函数运行时间
函数运行时间=1.00041400-0.00041600≈1s
产生的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E04 MOV R6,#0x04
C:0x0804 7D74 MOV R5,#0x74
C:0x0806 7CD6 MOV R4,#0xD6
C:0x0808 DCFE DJNZ R4,C:0808
C:0x080A DDFA DJNZ R5,C:0806
C:0x080C DEF6 DJNZ R6,C:0804
C:0x080E DFF2 DJNZ R7,C:0802
C:0x0810 22 RET
在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.
void mDelay(unsigned int Delay) //Delay = 1000 时间为1S
{
unsignedinti;for(;Delay>0;Delay--)
{for(i=0;i<124;i )
{;}
}
}void waitms(inti)
{charm;for( ; i ;i--)
{for(m = 203; m ; m--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
延时1ms的函数时钟频率12MHz
unsigned intsleepTime;
unsingedchar inSleep = 0;void sleepService(void)
{if (inSleep) sleepTime--;if (sleepTime == 0) inSleep = 0;
}void isr_timer(void) //假定定时器中断1ms 中断一次。
{
...
sleepService();
...
}void sleep(unsigned int ms) //延时子程序
{
sleepTime=ms;
inSleep= 1;while(inSleep);
}void main(void)
{
....
sleep(1000); //延时 1秒
...
}
如果要求是秒级的这么长的延时,单片机中一般采取不占CPU时间的延时,利用定时器来实现延时,如果非得用循环延时,在C中也通常嵌入汇编实现,这样误差比较小。
转载自:http://www.cnblogs.com/heiyue/p/3246988.html
==========================================================================
如下程序能实现ms毫秒级的比较精确的延时
void Delayms(unsigned intn)
{
unsignedinti,j;for(j=n;j>0;j--)for(i=112;i>0;i--);
}
用keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。
进入Delayms前,sec=0.00042209s
延时后,sec=0.00142253s
可以知道Delayms(1)实际延时0.00142253s—0.00042209s=0.00100044s≈1ms
同样如果想延时15ms的话,用Delayms(15),实际延时0.01480903s≈15ms,延时还是挺精确的。
=======================================================
延时1us程序12mhz晶振c语言,51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)...相关推荐
- 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc
30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...
- 机械手编程用c语言,51单片机机械手控制C程序.doc
51单片机机械手控制C程序 //包含所需头文件 #include #define uchar unsigned char /***************------宏定义------******** ...
- 机械手 c语言,51单片机机械手控制C程序
51单片机机械手控制C程序 //包含所需头文件 #include #define uchar unsigned char /***************------宏定义------******** ...
- 单片机热敏电阻测温度c语言,51单片机热敏电阻测温程序.doc
//本程序是通过热敏电阻测温度(30c-50c #include #include #include #define uchar unsigned char #define uint unsigned ...
- 延时1us程序12mhz晶振c语言,51单片机12M晶振的延时程序
这是本人慢慢调出来的参数,有误差是必须的,除非用汇编才会精确,后续我会更新修改,尽量精确. 调试环境:Keil V4.02本文引用地址:http://www.eepw.com.cn/article/2 ...
- ds18b20温控报警c语言,51单片机DS18B20温度控制报警程序(可设置温控范围)
DS18B20的管脚定义: 1.GND 2.DQ 3.VCC DQ → P1.7 K1 → P3.2 K2 → P3.4 K3 → P3.6 K4 → P3.7 温度显示 ...
- 51单片机直流电机调速c语言,51单片机直流电机调速程序
#includereg52.h>本文引用地址:http://www.eepw.com.cn/article/170917.htm sbit KEY1 = P3^1; //定义调速按键 sbit ...
- pid控制器c51语言编程,51单片机电机pid控制系统程序
51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证. /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码 ...
- c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能
原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...
最新文章
- ArcGIS水文分析实战教程(9)雨量计算与流量统计
- img.width一直是0的问题--记录(二)
- Qt Creator常用快捷键及技巧提升编码效率
- 怎么使用ar打包静态库
- flex布局怎么设置子元素大小_Web前端(三):前端布局
- java设计模式中的动态代理
- 火狐浏览器 附件组件 Xpath 安装
- Gartner首发中国数据库市场指南,巨杉数据库代表数据库领域厂商入选
- TF-IDF算法原理和公式
- 25岁从零开始学习平面设计会不会晚
- VMware虚拟机备份和恢复
- 3D-AVS2参考软件RFD10.0的配置
- Matlab数值分析编程:牛顿下山法解方程
- 安卓四大组件(小白篇)
- python通讯录管理系统姓名年龄号码_基于互联网的移动通讯录管理系统的制作方法...
- 活用async/await,实现一些让Vue更好用的装饰器
- Linux系统下rar软件的安装以及如何解压文件
- 畅捷通t6选择服务器信息,用友软件t6服务器地址
- 音视频系列 - 云游戏产业分析与技术剖析
- Linux FTP服务安装步骤
热门文章
- 非域环境修改域用户密码一直提示你的新密码不符合域的长度、复杂性或历史记录要求。请尝试选择其他新密码。
- MySQL数据库用户密码连续5次输入错误限定用户登录
- Spring之父Rod Johnson
- 社群经济与组织社群化 (2)
- 大厂技术专家:云原生与软件供应链安全的思考
- 宏杉科技针对传统RAID缺陷推CRAID 3.0
- 计算不同高度下的大气密度
- 其他干货——大气人计算机必备技能——不同编程语言比较(Matlab, python, fortran, NCL, IDL)
- [EOS源码分析]6.EOS特殊智能合约eosio
- 一年时间,从小白到进入阿里巴巴核心部门