不是单片机运行太快了,换电容是一点用都没用的,改一下程序吧。我估计是你的程序有BUG,看一下变量的数据类型是否定义正确。
初学者最容易犯的错误就是数据类型使用错误,例如定义了一个字符型的变量,在程序中却当整型变量使用。举例来说,如果你用循环等待的办法来延时,你定义了一个变量x,你是这么定义的:
unsigned char x;
使用中你却这么使用
// 等待开始
for(x=0; x<1000; x++);
这样肯定要出乱的。
因为 unsigned cha 型变量的范围是 0 - 255,你让它数到1000 是不可能的,它永远也数不到,就死机在那了。
如果你这么写:
// 等待开始
for(x=1000; x!=0; x--);
这样有可能就出现你上述的那种情况了,明明给的时间已经足够长了,怎么还这么快呢?
因为程序赋给x的值并不是 1000,而是 232,只把低字节给了x.
我猜,你是在proteus上仿真时看到的是30秒吧?
记住,proteus仿真的速度取决于计算机的运行速度,但是绝对不会等于实时仿真!所以在单片机上正常运行的速度,在计算机上都模拟时都明显的变慢!
如果真的要做到准确的30秒,那就必须以单片机为基础计算延时。
快到这个程度大概不是晶振起振电容的问题了,可能你的单片机是高速单片机吧,高速单片机去掉了12分频又优化看代码执行速度,速度是普通单片机的12倍以上。
如果是STC的单片机,名字以STC12开头的都是高速型的,其公司的就不清楚了
这个不是单片机的问题,看看你的定时程序,如把软件延时的数值或定时器的数值改大,或增加软件延时或定时器的次数。
定时器设置的时间问题,晶振 12MHz 可以设置成 50mS 再计数 20次为一秒 30次一秒