可以借助软件快速生成代码。利用STC-ISP 就可以
1.打开stc-isp后点击软件延时计算器
2.选择好使用的单片机型号、晶振频率、延时的时间
3.点击生成代码 即可。
有时候生成的c代码会有
_nop_(); //这句指令执行仅仅耗费1微秒的时间,可以删除,影响不大
我们可以将这句代码给删除掉 ,不删除程序就会报错(你没有定义_nop_()的前提下)。删除后其实基本上不会产生太大的误差,因为1微妙实在是太短了。
使用心得:
我们可以将生成的代码稍微改造一下,可以让我们的程序更加灵活,例如生成一个一毫秒的延时函数,通过在函数定义时增加一个形参变量,通过形参变量来控制1ms延时程序执行的次数来随意调节时长。
生成后复制过来的代码是这样的:
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
在花括号里面的那一堆程序段就可以空耗CPU一毫秒,从而达到延时。
下面我们对它进行稍微的改造
void Delay(int n) //@11.0592MHz
{
while(n--) //将延时一毫秒的程序循环执行n次,通过形参来调节延时的时长
{
unsigned char i, j;
// _nop_();注释掉这行代码
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
在声明函数时 新增一个形参变量,用来接收执行次数,灵活调整延时的时间。在函数体中包上一个while()循环。这样就改造完成了。
同样 ,汇编语言也可以这样,现象生成一个100毫秒的延时函数
DELAY100MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#180
MOV 31H,#68
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
然后对延时子函数进行改造,例如
DELAY: MOV R7,#5 ;@11.0592MHz
D1:
PUSH 30H
PUSH 31H
MOV 30H,#180
MOV 31H,#68
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
DJNZ R7,D1
RET
第一行多加了 MOV R7,#5 ,倒数第二行多加了 DJNZ R7,D1
可以通过修改第一行#后面的数字来修改延时的时长,例如现在是5 那么延时的就是500ms
改成3 那么就延时300ms 因为我是拿延时100毫秒的汇编代进行改造的。
stc-isp里面除了可以烧写程序外还有很多功能,例如定时器的自动配置、波特率的计算等等