社区
单片机/工控
帖子详情
在keilc51中我用c语言要写个精确的时间,怎么写?(不可以用中断)
StudyBoy_3w
2007-04-16 06:23:47
在keilc51中我用c语言要写个精确的时间,怎么写?(不可以用中断)
如:12MHz晶振
void dalay()
{
uchar i,j,k;
for(i=0;i<100;i++);
for(j=0;j<100;j++)
for(k=0;k<100;k++);
}
有人会算吗? 包括调用程序的时间 总共是延时多少时间?
能把算法写出来吗 或者举个例子说明也可以!
...全文
831
20
打赏
收藏
在keilc51中我用c语言要写个精确的时间,怎么写?(不可以用中断)
在keilc51中我用c语言要写个精确的时间,怎么写?(不可以用中断) 如:12MHz晶振 void dalay() { uchar i,j,k; for(i=0;i<100;i++); for(j=0;j<100;j++) for(k=0;k<100;k++); } 有人会算吗? 包括调用程序的时间 总共是延时多少时间? 能把算法写出来吗 或者举个例子说明也可以!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
无线图传无线HDMI视频传输
2007-04-18
打赏
举报
回复
如果用c51 12M的晶振,
最短的时间能做到多少us?
StudyBoy_3w
2007-04-17
打赏
举报
回复
哦 对于WARNING L1: UNRESOLVED EXTERNAL SYMBOL 已经解决了 我之前用嵌入汇编 设置了keil环境参数 没改回来 改回来就ok了
StudyBoy_3w
2007-04-17
打赏
举报
回复
今天试一试sz_04022(帮别人开启一扇窗,也就是让自己看到更完整的天空)的程序 但出现错误了
#include<reg51.h>
//# define InfData P3^3 //define Infrared Data p3.3是红外线接受数据pinout
# define uchar unsigned char
# define uint unsigned int
void delay_8us(unsigned char us);
void delay_ms(uint ms);
void delay_8us(unsigned char us)
{
while(--us);
}
//*===================delay_ms(uint ms),延时函数,参数为毫秒数=========================
void delay_ms(uint ms) //
{uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<113;j++)
;
}
void main(void)
{
int i=0;
delay_8us(8);
delay_ms(9);
}
linking...
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: ?C_START
MODULE: STARTUP.obj (?C_STARTUP)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: ?C_START
MODULE: STARTUP.obj (?C_STARTUP)
ADDRESS: 003DH
Program Size: data=11.0 xdata=0 code=66
我看工程没有reg51.h include不进去啊
为什么啊
StudyBoy_3w
2007-04-17
打赏
举报
回复
//*************
请问lbing7(向青润老大学习!!!) 这样可以吗 有个问题就是难以保证R4 R5不被其他调用了哦
不就完了?
呵呵
//***************
我在网上找了点资料:"被c程序调用的汇编函数可以用所有的寄存器,而不用担心会修改c程序中使用的寄存器."
这个对吗? 如果这句不对 也不用换另一个寄存器组 因为我也不知道那个寄存器组用了没有啊!
可以 push 我所用的寄存器 最后返回在pop出来就可以了吧!
我第一次用嵌套 还不会用 汇编也很少用 还不太懂!
东文-桑晨
2007-04-17
打赏
举报
回复
void Delay(uchar us)
{
while(--us);
}
编译后看看汇编的代码吧,非常精简
xiuhai
2007-04-17
打赏
举报
回复
学习
liu_binq63
2007-04-17
打赏
举报
回复
用c来实现精确定时是不可能的。
lbing7
2007-04-17
打赏
举报
回复
linuxhaha() ( ) 信誉:100 Blog 加为好友 2007-04-17 09:49:53 得分: 0
配置计时器。
在第一句中TM0CE = 1;
然后在最后一句读出16 bits counter的剩余的值,就是周期数。
安你自已的实现情况写。
-------------------------------------------------------
这个也不是可靠的,想想,如果定时器停了呢?
可是超过一个周期了...
呵呵,如果要去掉这些个可能,那事情也同样就多了起来,也就不准了...
linuxhaha
2007-04-17
打赏
举报
回复
配置计时器。
在第一句中TM0CE = 1;
然后在最后一句读出16 bits counter的剩余的值,就是周期数。
安你自已的实现情况写。
lbing7
2007-04-17
打赏
举报
回复
请问lbing7(向青润老大学习!!!) 这样可以吗 有个问题就是难以保证R4 R5不被其他调用了哦
换另一个寄存器组不就完了?
呵呵
yangb2014#
2007-04-17
打赏
举报
回复
数下编译出来的汇编指令就行了,
linuxhaha
2007-04-17
打赏
举报
回复
lbing7:不可能超过一个计时周期,0xFFFF个时钟周期够长了,几条指令不可能超的。
时钟停了是什么意思?
StudyBoy_3w
2007-04-17
打赏
举报
回复
"跟你学习一下" 还是不要好了
我只会这个
void Delay_500us(void) //T=[2DTime + 4] * (12 / Fosc)
{
DTime=0xf7;
while(--DTime);
}
kunshanbaby
2007-04-17
打赏
举报
回复
现在延时程序时间怎么样啊
把汇编部分分析下
跟你学习一下
StudyBoy_3w
2007-04-17
打赏
举报
回复
当我T1 T0的中断都用别的程序了 我要加个红外线接收的 那个时间9ms 和4.5ms 1.125ms 2.5ms
该怎么用c比较准确延时呢?
StudyBoy_3w
2007-04-17
打赏
举报
回复
这是我用延时函数
void delay_8us(uchar us)
{uchar i;
for(i=0;i<us;i++);
}
在main函数调用 delay_8us(1) 生成汇编如下(+n 表示指令周期)
C:0x002F 7F01 MOV R7,#0x01 +1
C:0x0031 12003B LCALL delay_8us(C:003B) +2
5: void delay_8us(uchar us)
6: {uchar i;
7: for(i=0;i<us;i++);
C:0x003B E4 CLR A +1
C:0x003C FE MOV R6,A +1 +1
C:0x003D EE MOV A,R6 +1 +1
C:0x003E C3 CLR C +1 +1
C:0x003F 9F SUBB A,R7 +1 +1
C:0x0040 5003 JNC C:0045 +2 +2
C:0x0042 0E INC R6 +1
C:0x0043 80F8 SJMP C:003D +1
8: }
C:0x0045 22 RET +2
计算它的调用时间: 23*1us(晶振为12MHz)=23us
如果我调用delay_8us(n)
那么计算它的调用时间: [(12*n+1+2+1+1+2)*1us]/n=12us (当n比较大时)
不知道是不是这样算 有没有错? 它为什么是说是延时8us呢?
这种方法搞延时也太难了吧
StudyBoy_3w
2007-04-16
打赏
举报
回复
一开始我是想用汇编嵌入的
比如:
void Delay_865us(void)
{
#progam asm
MOV R4,#12 ; 1.09*(2R5+4)*R4+2延时子程序1,精确延时865微秒
D1: MOV R5,#31
DJNZ R5,$
DJNZ R4,D1
#end asm
}
EA=0中断是在外部关掉的 恩 那个嵌入语句应该是#progam asm ..#end asm 只看过 没用过
请问lbing7(向青润老大学习!!!) 这样可以吗 有个问题就是难以保证R4 R5不被其他调用了哦
lbing7
2007-04-16
打赏
举报
回复
又想马儿跑,又想马儿不吃草,这做不到的
权衡,中间做取舍,呵呵
StudyBoy_3w
2007-04-16
打赏
举报
回复
不错 好办法 但这又影响我的秒表和时间的精确性啊
我学做一个红外线接收器 不知道那个时间的同步性要很准!
lbing7
2007-04-16
打赏
举报
回复
void dalay()
{
uchar i,j,k;
EA =0;//关中断
for(i=0;i<100;i++);
for(j=0;j<100;j++)
for(k=0;k<100;k++);
EA = 1;//开中断
}//利用关总中断把其它的可能给毙了,这样就可以不被打断了
然后查看,编译后关/开中断间的生成的代码,然后计算循环指令的时间,慢慢算...
51单片机
c语言
Keil
C51
全集
51开发资料
C语言
精确
延时程序 51单片机
keil
C
void delay(uchar i) { while(i--); } 经
keil
C编译后为……
KEIL
c51
入门教程---30个实例并附源码
共30课,通过30个实例来学习
KEIL
的各种操作 并同时附有调试通过的源码
win7
Keil
C51
一款win7/XP可用的c语音编辑器,非常好用
KEIL
C51
教程,单片机
C语言
初学者的好东西
用来学单片机的一个资料,感觉还可以,和大家分享分享
单片机/工控
27,520
社区成员
28,799
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章