找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3878|回复: 3
打印 上一主题 下一主题
收起左侧

STC15F104W和STC15W401AS单片机代码可以通用吗

[复制链接]
跳转到指定楼层
楼主
ID:221879 发表于 2019-3-17 12:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用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;}
        }
}               

        
/********************************************************************
                              结束
*********************************************************************/

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:644425 发表于 2020-4-9 23:32 来自手机 | 只看该作者
头文件用 stc15.h
回复

使用道具 举报

板凳
ID:644425 发表于 2020-4-9 23:44 来自手机 | 只看该作者
头文件用 stc15.h , TMOD =0X00  16位自动重载。 然后,把定时中断里的if,全拉到主程序来,定时中断就留一个tcnt++, 时间就准了。另外,定时器中断太频繁了,建议控制在5ms一次中断比较好,那么200次一秒,累加只需要用到uchar,而不需要用到uint,我用stc15f104至今,定时器误差直局限于下载时调整晶振速率时那点差值,实际使用中连别人说的频飘都没遇到过。
回复

使用道具 举报

地板
ID:213173 发表于 2020-4-10 05:56 | 只看该作者
就楼主这个简单程序,只是使用了定时器0的模式2,没有使用其它任何特殊功能,程序什么都不用改。STC的芯片都能直接用,当然包括STC15W401AS在内。不知楼主使用STC15F104W单片机做的定时器电路下载程序时选择内部时钟是多少频率,从程序中看定时器设置是12MHz/250us。如果下载程序选择内部时钟默认11.0592MHz就会误差很大。在实际应用中STC内部时钟1小时误差在10秒内。其实如果误差比较稳定还可以通过修改if(tcnt==4000)的数值增减使误差控制在每小时1秒内,没有必要加外部晶振。其实TB卖的晶振也准不到那里去。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表