戒魔 发表于 2015-1-27 15:07:06

感觉STC15F系列单片机官方给的参考程序有错,大家评评理

感觉STC15F系列单片机官方给的参考程序有错,大家评评理

STC15F2K,参考资 料是定时器2至定时器4都是16位自动装载,小弟看了他们官方软件给的参考程序,
定时器2#define T1MS (65536-FOSC/1000)      //1T模式
与定时器4的#define T38_4KHz (256-18432000/38400/2)         //1T
定时器2是定时1MS,定时器4是38.4K脉冲,但是,觉得定时器4是16位的,怎么官方的工程师用256去减呢,应该是65536才对,而且,两个定时器都是16位,却前后矛盾,请大家来评评理

/本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz

#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

#define FOSC 18432000L

#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式

sfr IE2       = 0xaf;               //中断使能寄存器2
sfr AUXR      = 0x8e;               //辅助寄存器
sfr T2H       = 0xD6;               //定时器2高8位
sfr T2L       = 0xD7;               //定时器2低8位

sbit P10 = P1^0;

//-----------------------------------------------
//中断服务程序
void t2int() interrupt 12         //中断入口
{
    P10 = !P10;                     //将测试口取反
      
//IE2 &= ~0x04;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
//IE2 |= 0x04;                  //然后再开中断即可
}

//-----------------------------------------------

/* main program */
void main()
{
    AUXR |= 0x04;                   //定时器2为1T模式
//AUXR &= ~0x04;                  //定时器2为12T模式
    T2L = T1MS;                     //初始化计时值
    T2H = T1MS >> 8;
    AUXR |= 0x10;                   //定时器2开始计时
   
    IE2 |= 0x04;                  //开定时器2中断
    EA = 1;

    while (1);
}


/本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz

#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

#define FOSC 18432000L

#define T38_4KHz (256-18432000/38400/2)         //1T
//#define T38_4KHz (256-18432000/12/38400/2)    //12T

sfr IE2   = 0xAF;               //中断使能寄存器2
sfr T4T3M   = 0xD1;               //定时器3和定时器4控制寄存器
sfr T4H   = 0xD2;               //定时器4高8位
sfr T4L   = 0xD3;               //定时器4低8位
sfr T3H   = 0xD4;               //定时器3高8位
sfr T3L   = 0xD5;               //定时器3低8位

sbit P10 = P1^0;

//-----------------------------------------------
//中断服务程序
void t3int() interrupt 19         //中断入口
{
    P10 = !P10;                     //将测试口取反
      
//IE2 &= ~0x20;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
//IE2 |= 0x20;                  //然后再开中断即可
}

//-----------------------------------------------

void main()
{
    T4T3M |= 0x02;                  //定时器3为1T模式
//T4T3M &= ~0x02;               //定时器3为12T模式

    T3L = T38_4KHz;               //初始化计时值
    T3H = T38_4KHz >> 8;
   
    T4T3M |= 0x08;                  //定时器3开始计时
    IE2 |= 0x20;                  //开定时器3中断
   
    EA = 1;

    while (1);
}

xunke 发表于 2015-1-27 21:47:50

本帖最后由 xunke 于 2015-1-28 11:20 编辑

STC-ISP V6.82E软件中“PCA实现16位定时器”的范例程序也有问题,不知怎么回事程序没试过就拿来做范例,真是搞笑,截图如下:


应该改成如下:


增加第42、43行中断就正常了
还有第46、47行不能缺 顺序也不反
我用的MCU是STC15W408AS

戒魔 发表于 2015-1-28 00:41:17

xunke 发表于 2015-1-27 21:47
STC-ISP V6.82E软件中PCA实现16位定时器的范例程序也有问题,不知怎么回事程序没试过就来做范例,截图如下 ...

今天我问客服,他那边回复说是工程师的编程习惯。。。有问题居然说成习惯了~

xpxp 发表于 2015-1-28 03:48:07

虽然不怎么熟悉单片机编程(照抄居多),但看到256这个数字,就知道是8位的字节。16位是由2个8位组成的。所以,虽然不怎么清楚是否有问题,但如果是我的话,肯定在单片机上烧录一下来运行验证。象我这种水平的肯定不敢贸然跳出来装大神。

戒魔 发表于 2015-1-28 08:51:20

xpxp 发表于 2015-1-28 03:48
虽然不怎么熟悉单片机编程(照抄居多),但看到256这个数字,就知道是8位的字节。16位是由2个8位组成的。所 ...

没有装大神,也不是大神,同样的定时器,同样的功能,一个是65536,一个是256,是逻辑错误了,因为样品还没有到,无法验证,但是,以正常逻辑推算,这样就很矛盾了,因为这几个定时器是固定16位自动装载的
页: [1]
查看完整版本: 感觉STC15F系列单片机官方给的参考程序有错,大家评评理