感觉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-28 11:20 编辑
STC-ISP V6.82E软件中“PCA实现16位定时器”的范例程序也有问题,不知怎么回事程序没试过就拿来做范例,真是搞笑,截图如下:
应该改成如下:
增加第42、43行中断就正常了
还有第46、47行不能缺 顺序也不反
我用的MCU是STC15W408AS
xunke 发表于 2015-1-27 21:47
STC-ISP V6.82E软件中PCA实现16位定时器的范例程序也有问题,不知怎么回事程序没试过就来做范例,截图如下 ...
今天我问客服,他那边回复说是工程师的编程习惯。。。有问题居然说成习惯了~ 虽然不怎么熟悉单片机编程(照抄居多),但看到256这个数字,就知道是8位的字节。16位是由2个8位组成的。所以,虽然不怎么清楚是否有问题,但如果是我的话,肯定在单片机上烧录一下来运行验证。象我这种水平的肯定不敢贸然跳出来装大神。 xpxp 发表于 2015-1-28 03:48
虽然不怎么熟悉单片机编程(照抄居多),但看到256这个数字,就知道是8位的字节。16位是由2个8位组成的。所 ...
没有装大神,也不是大神,同样的定时器,同样的功能,一个是65536,一个是256,是逻辑错误了,因为样品还没有到,无法验证,但是,以正常逻辑推算,这样就很矛盾了,因为这几个定时器是固定16位自动装载的
页:
[1]