专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机实现BPC电波钟解码C程序

作者:佚名   来源:本站原创   点击数:  更新时间:2013年10月30日   【字体:

//使用STC12C5202单片机,晶振使用12M的,速度是12倍速的,电波钟模块引脚是接在单片机P3^2口的
//数码管是使用动态扫描的方式,四位数码管显示
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar xiaoshi,fenzon;
uchar tt=0;
#define duan P1
uchar code tab[]={       0x12,/*0*/
          0xD7,/*1*/
          0x4A,/*2*/
          0x43,/*3*/
          0x87,/*4*/
          0x23,/*5*/
          0x22,/*6*/
          0x57,/*7*/
          0x02,/*8*/
             0x03,/*9*/
    };
sbit fen=P3^3;
sbit sf =P3^4;
sbit si =P3^5;
sbit ss =P3^7;
sbit led=P3^0;
/////////////////////////////////////////////////////////////////////////////
sbit MKin =P3^2; //电波钟模块信号引脚
uint shu=0;
uchar a[7];
void delay(uint k)
{
while(k--);
}
void duo_MoKuai()
{
uchar i=0;
for(;i<6;i++)
{
  a[i]=0;
}
shu=0;
while(shu<116)  //找启始码1.8秒低电平
{
  if(!MKin)
  {
   delay(12000); //延时16mS
   shu++;
  }
  else shu=0;
}
delay(2000);   tt=0;
while(!MKin)delay(2000); //等待高电平结束
delay(12000);
/////////////////////////////////////////////////////////////////////////////
while(MKin)delay(2000);  //这是第一个脉冲;//根据协议该位只能是0、1、2,不能是3否则超出范围,表示接收错误,从新同步
delay(12000);
while(!MKin)delay(2000);
delay(12000);
while(MKin)delay(2000);   //这是第二个脉冲;//根据协议,该位必须为0,否则就是错误,认为丢失同步,故也不需要进行效验积累计算
delay(12000);
while(!MKin)delay(2000);
delay(2000);
while(MKin)  //第三位//这是小时的十位
{
  delay(12000);
  a[0]++;
}
delay(12000);
   while(!MKin)delay(2000);
   delay(2000);
while(MKin) //第四位 //这是小时的个位
{
  delay(12000);
  a[1]++;
}
delay(12000);
   while(!MKin)delay(2000);
   delay(2000);
while(MKin) //第五位//这是分钟的高位
{
  delay(12000);
  a[2]++;
}
delay(12000);
   while(!MKin)delay(2000);
   delay(2000);
while(MKin)  //第六位//这是分钟的中位
{
  delay(12000);
  a[3]++;
}
delay(12000);
   while(!MKin)delay(2000);
   delay(2000);
while(MKin)  //第七位//这是分钟的低位
{
  delay(12000);
  a[4]++;
}
delay(12000);
}
void Zuan_Huan()
{
uchar k;
duo_MoKuai();   //读电波钟模块
for(k=0;k<5;k++)
{
  if(27>(a[k])>23) a[k]=0x03;
  else if(17<(a[k])<21) a[k]=0x02;
  else if(11<(a[k])<15) a[k]=0x01;
  else if(8>(a[k])>5) a[k]=0;
}

xiaoshi=((a[0])*4)|(a[1]);
fenzon=(((a[2])*16)|((a[3])*4)|(a[4]));
}
/////////////////////////////////////////////////////////////////
void desplay()
{
duan=tab[xiaoshi/10];
ss=0;
delay(2000);
ss=1;
duan=tab[xiaoshi%10];
si=0;
delay(2000);
si=1;
duan=tab[fenzon/10];
sf=0;
delay(2000);
sf=1;
duan=tab[fenzon%10];
fen=0;
delay(2000);
fen=1;
}  

void main()
{
uint aa;
while(1)
{
  Zuan_Huan();
  for(aa=0;aa<1000;aa++)
   desplay(); 
}
}
 

关闭窗口

相关文章