单片机输出TTL信号
1 #include <reg52.h>
2
3 sbit motor1 = P0^0;
4
5 unsigned int count,b;
6 main()
7 {
8 b=20;
9 TMOD = 0x01;
10 TH0 = 100;
11 TL0 = 100;
12 TR0 = 1;
13 while(1)
14 {
15 if(1 == TF0)
16 {
17 TF0 = 0;
18 count=65536-b;
19 TH0=(65536-b)/256;
20 TL0=(65536-b)%256;
21 motor1 = ~motor1;
22 }
23 }
24 }
这是在运算过程中所花费的时间,向一个变量或者寄存器赋值的时候赋值直接数速度就越快,越有计算就越慢,尤其对于技术要求严格的,特别需要注意
你用的是6.8M的晶振吗?
18、19、20行的运行需要时间的。而且,你用的是65536-b,这个65536可是unsigned long型的常数(占4字节),4字节数据运算很慢(你的晶振频率不高)。你可以用定时器单独计算这几行的执行时间。
我比较怀疑在执行这几行的时候,你的定时中断已经了生了。
在18行前插入EA = 0,在20行后插入EA = 1试试。
小编你好!
我感觉用65536-X这种方法计算初值不是很好,建议你老老实实用初值的计算方法计算准确点吧!做技术的要求严谨!
还有注意变量的定义,要多少定义多大,资源很宝贵!
我用的晶振频率是11.0592M的.
在程序第8行有b=20,我把19,20行中的b换成20时,输出结果也不一样,因为b就等于20,我想输出结果应该是一样的.这似乎不是计算时间的问题,我还是先来试一下你的提议吧.
刚试过了楼上几位的建议,运行结果没有任何改变,18,19,20这几行在修改前后的运行时间没有改变.
65536-20和65536-b是不一样的。前一个只是个立即数。编译器不会真的让两个立即数在程序中做减法的,编译器会做处理。后一个则是真正的4字节减法。
另:你的初值才20个数,为何不用初值重装?然后在中断中(或者查询)做状态翻转?
65536-20和65536-b如果有微小的差别是可以理解的,但是运行结果却有数量级的差别.
大哥,您为什么不亲自去测试一下这些代码的执行时间?有了数据不就好说话了?
我测试过这些代码的执行时间,是一样的,所以才发帖询问。
才疏学浅,无能为力了。帮顶。