專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機實現BPC電波鐘解碼C程序

作者:佚名   來源:本站原創(chuàng)   點擊數:  更新時間:2013年10月30日   【字體:

//使用STC12C5202單片機,晶振使用12M的,速度是12倍速的,電波鐘模塊引腳是接在單片機P3^2口的
//數碼管是使用動態(tài)掃描的方式,四位數碼管顯示
#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(); 
}
}
 

關閉窗口

相關文章