#include "rcc_bpc.h"
#include "hwUart.h"
#include "rtc.h"
#define PULSE_WIDTH_20MS 160000 /* 20MS */
#define PULSE_WIDTH_30MS 240000 /* 30MS */
#define PULSE_WIDTH_35MS 280000 /* 35MS */
#define PULSE_WIDTH_40MS 320000 /* 40MS */
#define PULSE_WIDTH_45MS 360000 /* 55MS */
#define PULSE_WIDTH_80MS 640000 /* 80MS */
#define PULSE_WIDTH_60MS 480000 /* 80MS */
#define PULSE_WIDTH_100MS 800000 /* 100MS */
#define PULSE_WIDTH_500MS ((u4t)PULSE_WIDTH_100MS*5)
#define PULSE_WIDTH_1SEC ((u4t)PULSE_WIDTH_100MS*10)
/* 允许的偏差值 */
#define PULSE_WIDTH_ERROR_MORE PULSE_WIDTH_45MS
#define PULSE_WIDTH_ERROR_LESS PULSE_WIDTH_35MS
#define PULSE_WIDTH_ERROR_BYTE PULSE_WIDTH_40MS
#define PULSE_WIDTH_1SEC_MAX ((u4t)PULSE_WIDTH_1SEC+PULSE_WIDTH_ERROR_LESS)
#define PULSE_WIDTH_1SEC_MIN ((u4t)PULSE_WIDTH_1SEC-PULSE_WIDTH_ERROR_MORE)
#define PULSE_WIDTH_100MS_MAX ((u4t)PULSE_WIDTH_100MS+PULSE_WIDTH_ERROR_LESS) /* '0' */
#define PULSE_WIDTH_100MS_MIN ((u4t)PULSE_WIDTH_100MS-PULSE_WIDTH_ERROR_MORE)
#define PULSE_WIDTH_200MS_MAX ((u4t)PULSE_WIDTH_100MS*2+PULSE_WIDTH_ERROR_LESS) /* '1' */
#define PULSE_WIDTH_200MS_MIN ((u4t)PULSE_WIDTH_100MS*2-PULSE_WIDTH_ERROR_MORE)
#define PULSE_WIDTH_300MS_MAX ((u4t)PULSE_WIDTH_100MS*3+PULSE_WIDTH_ERROR_LESS) /* '2' */
#define PULSE_WIDTH_300MS_MIN ((u4t)PULSE_WIDTH_100MS*3-PULSE_WIDTH_ERROR_MORE)
#define PULSE_WIDTH_400MS_MAX ((u4t)PULSE_WIDTH_100MS*4+PULSE_WIDTH_ERROR_LESS) /* '3' */
#define PULSE_WIDTH_400MS_MIN ((u4t)PULSE_WIDTH_100MS*4-PULSE_WIDTH_ERROR_MORE)
/* 秒与秒间隔1.6秒~1.9秒 */
#define PULSE_WIDTH_BIT_GAP_MAX ((u4t)PULSE_WIDTH_100MS*19+PULSE_WIDTH_ERROR_MORE)
#define PULSE_WIDTH_BIT_GAP_MIN ((u4t)PULSE_WIDTH_100MS*16-PULSE_WIDTH_ERROR_LESS)
/* 1秒的结束,每秒的后脉宽为:0.6秒~0.9秒 */
#define PULSE_WIDTH_BIT_LOW_MAX ((u4t)PULSE_WIDTH_100MS*9+PULSE_WIDTH_ERROR_MORE)
#define PULSE_WIDTH_BIT_LOW_MIN ((u4t)PULSE_WIDTH_100MS*6-PULSE_WIDTH_ERROR_LESS)
/* 秒周期 */
#define PULSE_WIDTH_BIT_MAX ((u4t)PULSE_WIDTH_1SEC+PULSE_WIDTH_ERROR_BYTE)
#define PULSE_WIDTH_BIT_MIN ((u4t)PULSE_WIDTH_1SEC-PULSE_WIDTH_ERROR_BYTE)
#define IDLE_LEVEL 0
#define VALID_LEVEL 1
#define FRAME_BIT_NUMBER 19 /* 19 double bit */
#define ENCODE_DATE_TIME(year,month,day,hour,minute,second) Encode_date_time(year,month,day,hour,minute,second)
typedef enum
{
RCC_BPC_SYNC_BIT,
RCC_BPC_CODE_WORD,
}rcc_bpc_rx_status_en;
typedef enum
{
CODE_WORD_STATUS_IDLE,
CODE_WORD_STATUS_READY,
}code_word_status_en;
typedef struct
{
code_word_status_en status;
u1t code_word[5];
}code_word_status_t;
rcc_rtc_t rcc_rtc;
static u4t _bpc_encode_date_time;
static u1t _code_word[5];
static rcc_bpc_rx_status_en _rcc_bpc_rx_status;
static code_word_status_t _code_word_status;
static u1t _pulse_counter; /* 同时作为上一帧结束的标志 */
static u4t _pulse_total; /* 每秒的前脉宽 */
u1t err1;
u1t err2;
u1t err3;
u1t err4;
#if 1
static boolt Obtain_double_bit(u4t pulse_width)
{
u1t double_bit,byte_index;
#if 1 /* 严格要求 */
if (pulse_width>PULSE_WIDTH_100MS_MIN && pulse_width<PULSE_WIDTH_100MS_MAX)
{
double_bit = 0;
}
else if (pulse_width>PULSE_WIDTH_200MS_MIN && pulse_width<PULSE_WIDTH_200MS_MAX)
{
double_bit = 1;
}
else if (pulse_width>PULSE_WIDTH_300MS_MIN && pulse_width<PULSE_WIDTH_300MS_MAX)
{
double_bit = 2;
}
else if (pulse_width>PULSE_WIDTH_400MS_MIN && pulse_width<PULSE_WIDTH_400MS_MAX)
{
double_bit = 3;
}
#else /* 增强接收能力 */
if (pulse_width<PULSE_WIDTH_100MS+PULSE_WIDTH_50MS)
{
double_bit = 0;
}
else if (pulse_width<PULSE_WIDTH_100MS*2+PULSE_WIDTH_50MS)
{
double_bit = 1;
}
else if (pulse_width<PULSE_WIDTH_100MS*3+PULSE_WIDTH_50MS)
{
double_bit = 2;
}
else if (pulse_width<PULSE_WIDTH_100MS*4+PULSE_WIDTH_50MS)
{
double_bit = 3;
}
#endif
else
{
return(FALSE);
}
byte_index = ((FRAME_BIT_NUMBER-1)-_pulse_counter)/4;
_code_word[byte_index] <<= 2;
_code_word[byte_index] |= double_bit;
return (TRUE);
}
/* wave_level现在所处的电平 */
void Bpc_pulse(u4t pulse_width, wave_level_en wave_level)
{
u4t wave_width;
o_led = wave_level;
/* 秒与秒间隔1.6秒~1.9秒 */
if (wave_level==IDLE_LEVEL && (pulse_width>PULSE_WIDTH_BIT_GAP_MIN && pulse_width<PULSE_WIDTH_BIT_GAP_MAX))
{
/* 上一帧数据的结束在这里处理 */
if (_pulse_counter==(FRAME_BIT_NUMBER-1))
{
if (Obtain_double_bit(_pulse_total)==TRUE)
{
memcpy(_code_word_status.code_word, _code_word, 5);
_code_word_status.status = CODE_WORD_STATUS_READY;
}
}
/* 新周期的开始(20秒一个周期) */
_pulse_counter = 0;
_pulse_total = 0;
_rcc_bpc_rx_status = RCC_BPC_CODE_WORD;
return;
}
if (_rcc_bpc_rx_status == RCC_BPC_CODE_WORD)
{
/* 1秒的结束,每秒的后脉宽度为:0.6秒~0.9秒 */
if (wave_level==IDLE_LEVEL && (pulse_width>PULSE_WIDTH_BIT_LOW_MIN && pulse_width<PULSE_WIDTH_BIT_LOW_MAX))
{
wave_width = _pulse_total + pulse_width;
if (wave_width>PULSE_WIDTH_BIT_MAX || wave_width<PULSE_WIDTH_BIT_MIN)
{
_pulse_counter = 0;
_rcc_bpc_rx_status = RCC_BPC_SYNC_BIT;
if (err1<99)
{
++err1;
}
return;
}
if (Obtain_double_bit(_pulse_total)==FALSE)
{
_pulse_counter = 0;
_rcc_bpc_rx_status = RCC_BPC_SYNC_BIT;
if (err2<99)
{
++err2;
}
return;
}
++_pulse_counter;
if (_pulse_counter>(FRAME_BIT_NUMBER-1))
{
_pulse_counter = 0;
_rcc_bpc_rx_status = RCC_BPC_SYNC_BIT;
return;
}
_pulse_total = 0;
}
else
{
/* 有效电平脉宽(受干扰脉冲群处理为有效脉宽) */
_pulse_total += pulse_width;
}
}
}
#else
static u2t _pulse_previous;
/* wave_level脉冲状态,比如高电平脉冲的话现在处于低电平 */
void Bpc_pulse(u4t pulse_width, wave_level_en wave_level)
{
u4t wave_width;
u1t double_bit, byte_index;
/* 秒与秒间隔1.6秒~1.9秒 */
o_led = wave_level;
if (wave_level==IDLE_LEVEL && (pulse_width>PULSE_WIDTH_BIT_GAP_MIN && pulse_width<PULSE_WIDTH_BIT_GAP_MAX))
{
_pulse_counter = 0;
_rcc_bpc_rx_status = RCC_BPC_CODE_WORD;
return;
}
if (_rcc_bpc_rx_status == RCC_BPC_CODE_WORD)
{
/* 每秒的前脉宽 */
if (wave_level == VALID_LEVEL)
{
_pulse_previous = pulse_width;
if (pulse_width>PULSE_WIDTH_100MS_MIN && pulse_width<PULSE_WIDTH_100MS_MAX)
{
double_bit = 0;
}
else if (pulse_width>PULSE_WIDTH_200MS_MIN && pulse_width<PULSE_WIDTH_200MS_MAX)
{
double_bit = 1;
}
else if (pulse_width>PULSE_WIDTH_300MS_MIN && pulse_width<PULSE_WIDTH_300MS_MAX)
{
double_bit = 2;
}
else if (pulse_width>PULSE_WIDTH_400MS_MIN && pulse_width<PULSE_WIDTH_400MS_MAX)
{
double_bit = 3;
}
else
{
_rcc_bpc_rx_status = RCC_BPC_SYNC_BIT;
return;
}
byte_index = ((FRAME_BIT_NUMBER-1)-_pulse_counter)/4;
_code_word[byte_index] <<= 2;
_code_word[byte_index] |= double_bit;
++_pulse_counter;
if (_pulse_counter==19)
{
memcpy(_code_word_status.code_word, _code_word, 5);
_code_word_status.status = CODE_WORD_STATUS_READY;
_rcc_bpc_rx_status = RCC_BPC_SYNC_BIT;
没有合适的资源?快使用搜索试试~ 我知道了~
bpc-time.rar_BPC TIME_BPC时钟_bpctime_bpm_bpc_www.bpc time.com
共188个文件
lst:38个
r90:38个
s90:38个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 140 浏览量
2022-09-21
07:27:54
上传
评论
收藏 592KB RAR 举报
温馨提示
bpm精确时钟,没有比这更精确的了。。。
资源推荐
资源详情
资源评论
收起资源包目录
bpc-time.rar_BPC TIME_BPC时钟_bpctime_bpm_bpc_www.bpc time.com (188个子文件)
iar.cspy.bat 2KB
rcc_bpc.c 10KB
hcs201.c 8KB
hcs_66bitcode.c 6KB
复件 hcs_66bitcode.c 5KB
program_eeprom.c 4KB
pt2262dec.c 4KB
intTimer1.c 4KB
app.c 3KB
ocmj12232c.c 2KB
eeprom.c 2KB
buzzer.c 2KB
multi_led.c 2KB
main.c 2KB
hwUart.c 2KB
keypad.c 2KB
lcm.c 2KB
keeloq_decode.c 2KB
rtc.c 1KB
signle_led.c 1KB
intTimer2Comp.c 1020B
ds18b20.c 926B
sysCheck.c 509B
iar.d90 84KB
iar.dbgdt 6KB
iar.dep 40KB
iar.dni 438B
iar.ewd 42KB
iar.ewp 51KB
iar.eww 157B
type.h 19KB
ATmega8.h 18KB
rcc_bpc.h 2KB
common.h 2KB
hcs201.h 2KB
hcs301.h 1KB
rtc.h 825B
eeprom.h 691B
keypad.h 581B
keeloq_chip.h 538B
intTimer1.h 420B
program_eeprom.h 367B
eeprom_assign.h 367B
hwUart.h 347B
buzzer.h 345B
hcs_66bitcode.h 338B
pt2262dec.h 296B
sysCheck.h 287B
multi_led.h 233B
signle_led.h 229B
intTimer2Comp.h 189B
ocmj12232c.h 181B
keeloq_decode.h 169B
app.h 166B
lcm.h 134B
ds18b20.h 75B
IAR.HEX 10KB
e.hex 1KB
si.IAB 72KB
si.IAD 1KB
si.IMB 28KB
si.IMD 608B
hcs201.lst 51KB
hcs201.lst 51KB
rcc_bpc.lst 48KB
rcc_bpc.lst 44KB
hcs_66bitcode.lst 27KB
hcs_66bitcode.lst 27KB
hwUart.lst 26KB
hwUart.lst 26KB
pt2262dec.lst 26KB
pt2262dec.lst 26KB
intTimer1.lst 22KB
intTimer1.lst 22KB
app.lst 21KB
app.lst 20KB
program_eeprom.lst 20KB
lcm.lst 20KB
program_eeprom.lst 20KB
eeprom.lst 19KB
eeprom.lst 19KB
multi_led.lst 17KB
keeloq_decode.lst 17KB
keeloq_decode.lst 17KB
main.lst 17KB
main.lst 17KB
ocmj12232c.lst 17KB
ocmj12232c.lst 17KB
lcm.lst 16KB
rtc.lst 15KB
keypad.lst 13KB
keypad.lst 13KB
buzzer.lst 12KB
buzzer.lst 12KB
intTimer2Comp.lst 10KB
intTimer2Comp.lst 10KB
signle_led.lst 10KB
signle_led.lst 10KB
sysCheck.lst 4KB
sysCheck.lst 4KB
共 188 条
- 1
- 2
资源评论
JaniceLu
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab开发的根据rvm回归模型自己编的matlab程序.rar
- 高效C++学生成绩管理系统:教育技术+C++17编程+数据管理+教务自动化
- 基于matlab开发的Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行.rar
- 一个点击正反转程序实例,可实现案件电机正反转
- 搜索链接淘特搜索引擎共享版-tot-search-engine.rar
- 第十八届全国大学生智能汽车竞赛 摄像头组/镜头组
- 基于matlab开发的AUV惯性导航系统matlab仿真程序,包括轨迹生成、gps和sins组合、gps和dvl组合.rar
- 基于SSM的“个性化电子相册”的设计与实现.zip
- 如何在撰写科研文献时,使用ai工具辅助去完成科研工作
- 吉林大学计组笔记 自用 基于b站翼云图灵的课.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功