标题:
STC15F104W和STC15W401AS单片机代码可以通用吗
[打印本页]
作者:
xbox007
时间:
2019-3-17 12:12
标题:
STC15F104W和STC15W401AS单片机代码可以通用吗
最近使用STC15F104W单片机做的定时器电路,时钟误差很大,现在想用外接晶振的方法解决问题。由于STC15F104W本身不支持外接晶振,所以查手册得知STC15W401AS可以外接晶振,现在就是不知道STC15F104W和STC15W401AS代码可以通用不,如果要修改要怎么改,先谢谢了。
使用芯片:STC15F104E
晶振:11.0592MHZ
波特率:9600
编译环境:Keil
*********************************************************************/
/********************************************************************/
#include<reg52.h> //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
/********************************************************************
初始定义
*********************************************************************/
uint sec = 0; //定义计数值,每过1/10 秒,sec 加一
uint tcnt = 0; //键值判断
uchar Start_Flag = 1;//定义一个全局变量,值初始化为1,用来判断首次上电的
/********************************************************************
I/O定义
*********************************************************************/
sbit OUT1=P3^3;//定义输出口为P3.3口 用以控制继电器
sbit IN1=P3^5; //定义输入口为P3.5口 用以输入信号
/********************************************************************
定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
tcnt++;
if(tcnt==4000)
{
tcnt=0;
sec++;
if(Start_Flag == 1)
{
if(sec==10)
{
OUT1=1;
}
if(sec==20)
{
OUT1=0;
sec=0;
Start_Flag = 0;
}
}
else
{
if(sec==30)
{
OUT1=1;
}
if(sec==40)
{
OUT1=0;
sec=0;
}
}
}
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
TMOD=0x02; //定时器工作在方式2
TH0=0x06; //对TH0 TL0 赋值
TL0=0x06;
TR0=1; //开始定时
ET0=1;
EA=1;
sec=0;
OUT1=0;//模块通电继电器吸合
while(1)
{
if(IN1==0){OUT1=1;while(!IN1);OUT1=0;}
}
}
/********************************************************************
结束
*********************************************************************/
作者:
13764578747
时间:
2020-4-9 23:32
头文件用 stc15.h
作者:
13764578747
时间:
2020-4-9 23:44
头文件用 stc15.h , TMOD =0X00 16位自动重载。 然后,把定时中断里的if,全拉到主程序来,定时中断就留一个tcnt++, 时间就准了。另外,定时器中断太频繁了,建议控制在5ms一次中断比较好,那么200次一秒,累加只需要用到uchar,而不需要用到uint,我用stc15f104至今,定时器误差直局限于下载时调整晶振速率时那点差值,实际使用中连别人说的频飘都没遇到过。
作者:
wulin
时间:
2020-4-10 05:56
就楼主这个简单程序,只是使用了定时器0的模式2,没有使用其它任何特殊功能,程序什么都不用改。STC的芯片都能直接用,当然包括STC15W401AS在内。不知楼主使用STC15F104W单片机做的定时器电路下载程序时选择内部时钟是多少频率,从程序中看定时器设置是12MHz/250us。如果下载程序选择内部时钟默认11.0592MHz就会误差很大。在实际应用中STC内部时钟1小时误差在10秒内。其实如果误差比较稳定还可以通过修改if(tcnt==4000)的数值增减使误差控制在每小时1秒内,没有必要加外部晶振。其实TB卖的晶振也准不到那里去。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1