c编程时,51单片机怎么用定时器写一个延时1ms的子函数

如题,作用像voiddelay(uint16n){uint16i,j;for(i=n;i>0;i--)for(j=125;j>0;j--);}可以设置参数来决定调用时延长... 如题,作用像
void delay(uint16 n)
{uint16 i,j;
for(i=n;i>0;i--)
for(j=125;j>0;j--);}
可以设置参数来决定调用时延长时间
展开
 我来答
Cindere鞡
推荐于2017-09-18 · TA获得超过7251个赞
知道大有可为答主
回答量:1148
采纳率:84%
帮助的人:500万
展开全部
51单片机的定时器工作方式有4中,其中3种需要在中断函数中重装初值,而且C51明确规定中断函数不能传入参数也不能返回参数,那么这样一来就只能用不用重装初值的工作方式2了,我给出了工作方式2的初始化函数:
void init(unsigned int x)
{
TMOD=0x02;
TH0=x;
TL0=x;
EA=1;
ET0=1;
TR0=1;
}
这样将x作为定时器的初值传入,当TL0计数完成时,TH0会自动将值赋给TL0,TH0不变,当然你自己来定义键盘函数或者什么函数来决定x的值。
希望我的回答能帮助到你。
南柯一梦之小
2013-05-12 · TA获得超过430个赞
知道小有建树答主
回答量:458
采纳率:0%
帮助的人:323万
展开全部
好办
用C51,方式一
void delay(unsigned int T) //T的单位取微秒
{
signed int cnt; //这里用符号数的相反数 就是2^16-n的原码,也可以定义无符号数自己换成2^16-n

cnt=-(fosec*1.0/12)*T; // fosec的单位MHz

TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加这句是为了可以循环使用

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一万光年MEGn0
2013-05-12 · TA获得超过3712个赞
知道大有可为答主
回答量:4602
采纳率:67%
帮助的人:1047万
展开全部
假如使用12MHZ晶振

定时器初始化:

void init(void )
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}

主程序;

main(void)
{
init();

while(1)
{
;
}
}

void inter_t0(void) //1ms中断一次
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;

; // 1毫秒中断后要添加的代码
}
追问
这个好像不能自己定义延长时间呀
追答
你可以在中断中对中断次数进行计数,例如1毫秒中断一次,你要延时1秒,就计数1000次就是1秒了。 计数要用一个整形变量; int cnt;
计数到1000后要对变量清零,再重新 开始计数
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友dd1865dc2e77
2013-05-12 · TA获得超过195个赞
知道答主
回答量:226
采纳率:0%
帮助的人:69.9万
展开全部
void main()
{
TMOD = 0x01;//设置T0为工作方式1
for(;;)
{
TH0 = (65536-1000)/256 //设定初值
TL0 = (65536-1000)%256; //设定初值
TR0 = 1;//启动定时器0
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式