用C语言怎么在单片机AT89C51上编写一个延时10秒的程序? 5
展开全部
1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。
2、例程:
//假设晶振12MHZ
#include "reg51.h"
unsigned int YSJS=0;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TH1 = 0XFF; //定时器1定时时间=500uS
TL1 = 0X06;
ET1 = 1; //使能定时器1中断
EA =1; //开总中断
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFF; //定时器1定时时间=500us
TL1 = 0X06;
YSJS++;
if(YSJS==20000) //500uS*20000=10000000us=10s
{
P1 = P1 ^ 0X01; //P1.0十秒钟翻转一次
YSJS = 0
}
}
展开全部
这么长的延时,不用循环延时,没实际意义 。单片机在这10s时间里不能做其它事了。要用定时器中断,定时10s。不是很难的,按常规写法,误差+1.6ms。
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==200) //中断200次,10s
{
time=0;
LED=~LED; //P1.0上的LED10s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
如果细调定时初值(包括重装),TH0 = (65536-49993)/256;
TL0 = (65536-49993256;
误差可以减小到+0.3ms
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==200) //中断200次,10s
{
time=0;
LED=~LED; //P1.0上的LED10s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
如果细调定时初值(包括重装),TH0 = (65536-49993)/256;
TL0 = (65536-49993256;
误差可以减小到+0.3ms
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先不知兄弟你玩单片机玩了多久,用C语言编程的话极难做到精确地延时10ms,不过误差不会大,我下了两个,借鉴下:
1.
void delay(uint cnt) //简单的延时
{
uint a=0,b;
for(a=0;a<cnt;a++)
for(b=0;b<110;b++);这样的延时大约是cnt 毫秒
2./********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
3.void delay(int a)
{
while(--a);}用12MHZ的话a=10000
1.
void delay(uint cnt) //简单的延时
{
uint a=0,b;
for(a=0;a<cnt;a++)
for(b=0;b<110;b++);这样的延时大约是cnt 毫秒
2./********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
3.void delay(int a)
{
while(--a);}用12MHZ的话a=10000
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
参考
http://hi.baidu.com/小雕lns/blog/item/27b4fb5208ec6d0b0df3e373.html
http://hi.baidu.com/小雕lns/blog/item/27b4fb5208ec6d0b0df3e373.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你 用KEIL进行调下就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询