利用定时器扫描的问题 点击:782 | 回复:4



猎隼

    
  • 精华:1帖
  • 求助:1帖
  • 帖子:151帖 | 1661回
  • 年度积分:0
  • 历史总积分:8983
  • 注册:2005年9月28日
发表于:2007-08-16 07:36:00
楼主
#include<reg51.h>
#define V_MOD0 0    /*定时器/计数器0 方式控制字*/
#define V_T0 0x1e0c  /*时间常数值*/
main()
{
/*下列语句初始化定时器/计数器0 */
TMOD=V_MOD0;
TL0=V_T0&0xff;
/*下列语句开放CPU中断并启动定时器/计数器0 */
TR0=1;
ET0=1;
EA=1;
/*无限循环等待P1.0引脚上输出方波信号*/
while(1);
}
void timer()(void)interrupt 1 using 3
{
/*重装时间常数值并将P1.0取反后输出*/
TL0=V_T0&0xff;
TH0=V_T0>>8;
P10=~P10;
}

这个CPU的晶振是6兆的,想做一个周期为2毫秒的闪烁指示,输出口P1.0每1毫秒动作一次,我不明白的就是它的时间常数值的设定,是根据什么设定的?

这个示例说1毫秒的延时,要由1000个机器周期来实现,那为什么时间常数值是十六进制的1e0c呢,照我想6兆的CPU要实现1毫秒的话,应该需要500个机器周期的.



周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2007-08-17 09:58:00
1楼
注意定时过程是[b]从给定值到0FFFFH[/b],再加1翻转成0000H时刻产生中断。
比如你要加1000个数,是从64535到65535,而不是从0加到1000。这里的64535才是你设定的数值。

猎隼

  • 精华:1帖
  • 求助:1帖
  • 帖子:151帖 | 1661回
  • 年度积分:0
  • 历史总积分:8983
  • 注册:2005年9月28日
发表于:2007-08-17 13:51:00
2楼
周公,这个示例我是在书上找到的,但是在我的KEIL软件上编译怎么会有错误呢?
定时中断.C(16): error C169: 'timer': function returns function
定时中断.C(21): error C202: 'P10': undefined identifier
错误共两处.

周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2007-08-17 17:56:00
3楼
脑子概念不要错,具体程序你就自己看吧。

猎隼

  • 精华:1帖
  • 求助:1帖
  • 帖子:151帖 | 1661回
  • 年度积分:0
  • 历史总积分:8983
  • 注册:2005年9月28日
发表于:2007-08-18 14:08:00
4楼
我晕了,我的KEIL软件的头文件居然没起作用,不识别P10,只能换成使用P1_0了,且我的中断函数timer后面多加了一个(),应该是0的.

热门招聘
相关主题

官方公众号

智造工程师