打印
[国产单片机]

STC单片机遇到的问题,请大家帮忙分析下~~!

[复制链接]
楼主: 3654532
手机看帖
扫描二维码
随时随地手机跟帖
61
3654532|  楼主 | 2014-7-10 11:34 | 只看该作者 回帖奖励 |倒序浏览
aydf369 发表于 2014-7-10 08:10
楼主可以试试勾选P.0 P1.1低电平下载程序

勾选的好处是什么 不是很清楚?我的这两个脚位都是悬空的 ,你这样下载的话第二次下载就要这两个脚位为低电平才能把程序下载进去了~~!

使用特权

评论回复
62
aydf369| | 2014-7-10 11:38 | 只看该作者
如果是累积误差,肯定是时钟频率不同引起的,定时器的装载值每个模块都不同,每个模块都用同一个信号源来校正,把得到值存储在EEPROM中,再上电时把EEPROM中的值装载到定时器中。这样的话单片机就得用11F01E的,程序中还要增加一段校正代码,不知道1K的够不够?

使用特权

评论回复
63
3654532|  楼主 | 2014-7-10 11:38 | 只看该作者
aydf369 发表于 2014-7-10 08:10
楼主可以试试勾选P.0 P1.1低电平下载程序

勾选这个的好处是什么呢?这样第二次下载只有这两个脚位为低电平才能下载程序进去了。

使用特权

评论回复
64
aydf369| | 2014-7-10 11:43 | 只看该作者
10个模块不用同一个电源,你能保证同时上电吗?

使用特权

评论回复
65
3654532|  楼主 | 2014-7-10 11:45 | 只看该作者
aydf369 发表于 2014-7-10 11:38
如果是累积误差,肯定是时钟频率不同引起的,定时器的装载值每个模块都不同,每个模块都用同一个信号源来校 ...

我用的就是11F01E的,矫正代码
include <STC11F.h>
#define uchar unsigned char
#define uint  unsigned int

sbit LED=P1^7;
sbit buz=P1^5;
uint m ; //计数中断次数
unsigned char fixtime; //定义修正值变量
void Init_Timer0(void)
{
   EA=0;
        TR0=0;
        TMOD|=0X01;
        fixtime=TL0+0X06;
        TL0=0X58+fixtime;
        TH0=0X9E+(char)CY;
  // TMOD|=0X01;
  // TH0=0X9E;
  // TL0=0X58;
   TR0=1;
   ET0=1;
   EA=1;
}
这样写对么?

使用特权

评论回复
66
aydf369| | 2014-7-10 11:47 | 只看该作者
如果同时上电程序启动时间不同,就要在下载选项上勾选P.0 P1.1低电平下载程序和内复位不延长复位时间,多试试,最好用逻辑分析仪同时测试10个模块

使用特权

评论回复
67
aydf369| | 2014-7-10 11:55 | 只看该作者
我的意思是用单片机测量外部标准信号源,比如10HZ,因为每个单片机的时钟不同,那么测量的值就不同,有的是0x1234,有的是0x1236,你把这个值保存到EEPROM中,上电时把这个值装载到定时器。

使用特权

评论回复
68
aydf369| | 2014-7-10 12:00 | 只看该作者
勾选这个的好处是什么呢?这样第二次下载只有这两个脚位为低电平才能下载程序进去了
如果不勾选的话,STC的单片机在上电时先检测串口有没有下载流,然后才允许用户程序,如果有干扰的话,会造成几百毫秒时间的误差,用户程序启动时间不相同

使用特权

评论回复
69
aydf369| | 2014-7-10 12:01 | 只看该作者
这样写对么?
这样没有意义!

使用特权

评论回复
70
3654532|  楼主 | 2014-7-10 12:09 | 只看该作者
aydf369 发表于 2014-7-10 11:43
10个模块不用同一个电源,你能保证同时上电吗?

我用的是同一个电源供电的·~!

使用特权

评论回复
71
aydf369| | 2014-7-10 12:10 | 只看该作者
关键是每个模块的定时器装载值要不相同!

使用特权

评论回复
72
3654532|  楼主 | 2014-7-10 19:29 | 只看该作者
aydf369 发表于 2014-7-10 12:10
关键是每个模块的定时器装载值要不相同!

更本的问题也是这个 ,批量生产的时候操作起来就困难很大了。不同的装载值

使用特权

评论回复
73
aydf369| | 2014-7-10 20:18 | 只看该作者
你用1个脚,比如P1.2,低电平运行矫正程序,高电平运行正常程序。P1.3脚输入标准信号源

MAIN:JNB P1.2,TEST
.....
TEST:CLR TR0
MOV TH0,#00H
MOV TL0,#00H
JB P1.3,$
SETB TR0
SETB EA
SETB ET0
JNB P1.3,$
CLR TR0
把这时的24位定时器值读出来,根据需要变换成16装载值保存到EEPROM中。
批量的话每个模块把P1。2脚接地,P1。3脚输入信号源,执行一次矫正程序,之后把P1。2脚拉高就行了。多了几十秒的时间,批量影响不大

使用特权

评论回复
74
aydf369| | 2014-7-10 20:19 | 只看该作者
定时器中断:INC R7
RETI

使用特权

评论回复
75
aydf369| | 2014-7-10 20:36 | 只看该作者
矫正后就算你的一个模块用12M晶振,另一个用15M晶振都能同步了

使用特权

评论回复
76
aydf369| | 2014-7-10 22:34 | 只看该作者
或者用6M的矫正源输入到P3.4脚,用定时器0计数:
TMOD=0x05;
TH0=100ms初值;//LED的闪烁频率
TL0=TH0;
TH1=0x00;
TL1=0x00;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TR0=0;
根据R7和TH1 TL1的值算出需要的装载值保存到EEPROM中

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
3654532 + 2 赞一个!
77
aydf369| | 2014-7-10 22:36 | 只看该作者
如果需要更高的精度就把矫正源和晶振频率都提高。

使用特权

评论回复
78
aydf369| | 2014-7-10 22:37 | 只看该作者
晶振频率必须是矫正源的2倍以上!

使用特权

评论回复
79
aydf369| | 2014-7-10 22:40 | 只看该作者
用C的话误差大点,高精度最好用汇编

使用特权

评论回复
80
xg3469| | 2014-7-10 22:54 | 只看该作者
非要同步,而且价格不敏感(或不计成本),可用FE5860铷钟,二手的,30分钟误差0.1微秒。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则