51單片機(jī)實(shí)現(xiàn)BPC電波鐘解碼C程序
//數(shù)碼管是使用動(dòng)態(tài)掃描的方式,四位數(shù)碼管顯示
#include
#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; //電波鐘模塊信號(hào)引腳
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); //延時(shí)16mS
shu++;
}
else shu=0;
}
delay(2000); tt=0;
while(!MKin)delay(2000); //等待高電平結(jié)束
delay(12000);
/////////////////////////////////////////////////////////////////////////////
while(MKin)delay(2000); //這是第一個(gè)脈沖;//根據(jù)協(xié)議該位只能是0、1、2,不能是3否則超出范圍,表示接收錯(cuò)誤,從新同步
delay(12000);
while(!MKin)delay(2000);
delay(12000);
while(MKin)delay(2000); //這是第二個(gè)脈沖;//根據(jù)協(xié)議,該位必須為0,否則就是錯(cuò)誤,認(rèn)為丟失同步,故也不需要進(jìn)行效驗(yàn)積累計(jì)算
delay(12000);
while(!MKin)delay(2000);
delay(2000);
while(MKin) //第三位//這是小時(shí)的十位
{
delay(12000);
a[0]++;
}
delay(12000);
while(!MKin)delay(2000);
delay(2000);
while(MKin) //第四位 //這是小時(shí)的個(gè)位
{
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();
}
}
評(píng)論