单片机代码执行时间自测试方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机代码执行时间自测试方法

摇控解码需要精确延时,操作DS18B20需要精确延时,写一个简单的循环语句,或写一个延时函数,怎样知道它执行了多少时钟周期?

原理很简单,用单片机本身的定时器来测试被测代码,数码管显示,我用AVR单片机ATMEGA16做试验,先看一段代码:

unsigned int number;//定时器计数存放在这里
void main(void)
{ unsigned char i,j;
io_init();//io口初始化,数码管显示驱动
//////////////以下是代码执行时间测试//////////////////////
TCNT1=0;//TCNT1值清零
TCCR1A=0;
TCCR1B=1<for(j=0;j<200;j++);//测试此段代码时钟计数
TCCR1B=0;//关闭定时器
number=TCNT1;//读取TCNT1值
//////////////////////////////////////////////////////////
while(1)
{
display(number);//数码管显示
}
}
/////在定时器开起与关闭之间的代码是被测试代码
//////ICCAVR编译生成HEX文件,再下载到实验板,数码管显示807
/////如果去掉for(j=0;j<200;j++);这段代码,重新编译下载实验,数码管显示1
////说明for(j=0;j<200;j++);这段代码走了806个时钟周期,对于1M晶振时钟就是806微秒
////对于8M晶振就是100微秒了,以下是我更改被测试代码的实验记录,方便设计精确延时程序
//i=10;//显示2
//i=1;while(i--);//显示14
//i=10;while(i--);//显示68
//i=100;while(i--);//显示608
//i=250;while(i--);//显示1508 总结 ix6+8 减去1就是ix6+7
/////////////////////////////////////////////////
//i=1;while(--i);//显示8
//i=10;while(--i);//显示62
//i=100;while(--i);//显示602
//i=250;while(--i);//显示1502 总结 ix6+2 减去1就是ix6+1
//8M晶振100us ix6+2=800+1得i=131 i=131;while(--i);显示801
//8M晶振1us 代码: i=1;while(--i);i=0;//显示9
/////////////////////////////////////////////////
//for(i=0;i<1;i++){}//显示11
//for(i=0;i<2;i++){}//显示15
//for(i=0;i<10;i++){}//显示47
//for(i=0;i<100;i++){}//显示407
//for(i=0;i<199;i++);//显示803 8M时100US
//for(i=0;i<200;i++){}//显示807 8M时100US
//for(i=0;i<250;i++){}//显示1007 总结 ix4+7 减去1就是ix4+6
/////////////////////////////////////////////////
//for(j=0;j<1;j++){for(i=0;i<200;i++){}}//显示816
//for(j=0;j<2;j++){for(i=0;i<200;i++){}}//显示1625
//for(j=0;j<5;j++){for(i=0;i<200;i++){}}//显示4052
//for(j=0;j<10;j++){for(i=0;i<200;i++){}}//显示8097
////////调用一个带参或不带参的延时函数一样实用////////////
///////以下是8M时钟1微秒延时带参函数,写在main()前面,经测试,我发觉参数大于2才正确///
void delay8RC_us(unsigned int time) //8Mhz内部RC震荡延时Xus
{
do
{
time--;
}
while(time>1);
}
//delay8RC_us(10); //显示82 准确
//delay8RC_us(100); //显示802 准确
//delay8RC_us(500); //显示4002 准确
//delay8RC_us(1); //显示18 不准确
//del

ay8RC_us(2); //显示18 不准确
//delay8RC_us(3); //显示26 准确
//调用一个空函数delay(){};显示9


相关文档
最新文档