×

51单片机电波钟源程序

软件与编程

51单片机电波钟源程序

lixiaoyao lixiaoyao 发表于2016-04-12 浏览2574 评论0

 代码当时只是简单的调出了校时功能,没加奇偶校验。

要修改的地方还不少。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit BPC=P3^2;
bit BPC_add;
uchar BPC_temp,Dat_add,Dat_su,Dat_num;
uchar data BPC_dat[3][19];
bit Get_time,As_time;
uchar Time;
uchar data Times[6];

#include"LCD1602.h"

void Init_T(void)
{
  EA=1;     //总中断允许
  IT0=1;    //IT0=1时下降沿触发,IT0=0时低电平触发,
  EX0=1;    //允许中断0
  TMOD=0x01;  //16计数器
  TH0=(65536-10000)/256;//装初值
  TL0=(65536-10000)%256;
  ET0=1;
  TR0=1;
}

void main(void)
{
  Init_T();//中断初始化
  Init_LCD();//LCD初始化
  while(1)
     {
       if(As_time)//帧结束,两帧对比
         {
           As_time=0;//清零对比标志位
           if(//对比相邻接收到的三帧数据
               (BPC_dat[0][1]==BPC_dat[1][1])&&(BPC_dat[0][1]==BPC_dat[2][1])
               &&(BPC_dat[0][2]==BPC_dat[1][2])&&(BPC_dat[0][2]==BPC_dat[2][2])
               &&(BPC_dat[0][3]==BPC_dat[1][3])&&(BPC_dat[0][3]==BPC_dat[2][3])
               &&(BPC_dat[0][4]==BPC_dat[1][4])&&(BPC_dat[0][4]==BPC_dat[2][4])
               &&(BPC_dat[0][5]==BPC_dat[1][5])&&(BPC_dat[0][5]==BPC_dat[2][5])
               &&(BPC_dat[0][6]==BPC_dat[1][6])&&(BPC_dat[0][6]==BPC_dat[2][6])
               &&(BPC_dat[0][7]==BPC_dat[1][7])&&(BPC_dat[0][7]==BPC_dat[2][7])
               &&(BPC_dat[0][8]==BPC_dat[1][8])&&(BPC_dat[0][8]==BPC_dat[2][8])
               &&(BPC_dat[0][10]==BPC_dat[1][10])&&(BPC_dat[0][10]==BPC_dat[2][10])
               &&(BPC_dat[0][11]==BPC_dat[1][11])&&(BPC_dat[0][11]==BPC_dat[2][11])
               &&(BPC_dat[0][12]==BPC_dat[1][12])&&(BPC_dat[0][12]==BPC_dat[2][12])
               &&(BPC_dat[0][13]==BPC_dat[1][13])&&(BPC_dat[0][13]==BPC_dat[2][13])
               &&(BPC_dat[0][14]==BPC_dat[1][14])&&(BPC_dat[0][14]==BPC_dat[2][14])
               &&(BPC_dat[0][15]==BPC_dat[1][15])&&(BPC_dat[0][15]==BPC_dat[2][15])
               &&(BPC_dat[0][16]==BPC_dat[1][16])&&(BPC_dat[0][16]==BPC_dat[2][16])
               &&(BPC_dat[0][17]==BPC_dat[1][17])&&(BPC_dat[0][17]==BPC_dat[2][17])
             )Get_time=1;//接收成功,较正时钟标志位
         }
       if(Get_time)//判断是否要较正时钟
         {
           Get_time=0;//清零时钟较正标志位
           Times[0]=((BPC_dat[0][15]*16)+(BPC_dat[0][16]*4)+(BPC_dat[0][17]));//年
           Times[1]=((BPC_dat[0][13]*4)+(BPC_dat[0][14]));//月
           Times[2]=((BPC_dat[0][10]*16)+(BPC_dat[0][11]*4)+(BPC_dat[0][12]));//日
           Times[3]=((BPC_dat[0][2]*4)+(BPC_dat[0][3]));//时
           Times[4]=((BPC_dat[0][4]*16)+(BPC_dat[0][5]*4)+(BPC_dat[0][6])+1);//分
           if(Times[4]>59){Times[4]=0;Times[3]++;if(Times[3]>12)Times[3]=0;}
           Times[5]=0;//秒
         }
       display();//液晶显示
     }
}

void Time_EX0(void)interrupt 0
{
  BPC_add=1;//使能计数标志位置1
  Dat_add=0;//起始帧判断清零
}

void Time_T0(void)interrupt 1//中断计数器,每秒100
{
  TH0=(65536-10000)/256;
  TL0=(65536-10000)%256;
  Time++;//时间计数
  if(Time>100)
    {
      Time=0;
      Times[5]++;
      if(Times[5]>59)
        {
          Times[5]=0;
          Times[4]++;
          if(Times[4]>59)
            {
              Times[4]=0;
              Times[3]++;
              if(Times[3]>12)Times[3]=0;
            }
        }
    }
  Dat_add++;//起始帧计数
  if(Dat_add>150)Dat_num=0;//判断帧起始,在一秒内没清零Dat_add就大于100
  if(BPC_add)//计数标志,能计数
    {
      if(!BPC)BPC_temp++;//脉宽计数加加
      else
        {
          BPC_add=0;//一个脉冲结束,清零计数标志
          if((BPC_temp>5)&&(BPC_temp<15))BPC_dat[Dat_su][Dat_num]=0;//0.1秒   按脉宽换算成4进制
          else if((BPC_temp>15)&&(BPC_temp<25))BPC_dat[Dat_su][Dat_num]=1;//0.2秒
          else if((BPC_temp>25)&&(BPC_temp<35))BPC_dat[Dat_su][Dat_num]=2;//0.3秒
          else if((BPC_temp>35)&&(BPC_temp<45))BPC_dat[Dat_su][Dat_num]=3;//0.4秒
          else Dat_num=0;
          
          Dat_num++;//位计数
          if(Dat_num>18)//位满,帧结束
            {
              Dat_num=0;//位重计
              As_time=1;//帧接收完成,两帧对比标志位置1
              Dat_su++;if(Dat_su>2)Dat_su=0;//帧记录,换数组再记
            }
          BPC_temp=0;//脉宽计数器清零
        }
    }
}



#ifndef __LCD1602_H_
#define __LCD1602_H_

/*uchar code number[10]={0x30,0x31,0x32,
0x33,0x34,0x35,0x36,0x37,0x38,0x39};*/
                                
#define DataPort P0
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;

//LCD专用延时
void delay_LCD(uint k)
{
  uchar i;
  while(k--)
     for(i=0;i<121;i++);
}

//写指令
void Write_com(uchar com)
{
  RS=0;
  RW=0;
  DataPort=com;
  EN=1;
  delay_LCD(2);
  EN=0;
}

//写数据
void Write_dat(uchar dat)
{
  RS=1;
  RW=0;
  DataPort=dat;
  EN=1;
  delay_LCD(2);
  EN=0;                      
}

//初始化
void Init_LCD(void)
{
  DataPort=0x00;     //IO口初始化
  RS=1;
  RW=1;
  EN=1;
  Write_com(0x38);     //8位数据口,两行显示
  Write_com(0x06);     //完成一个字符码传送后,光标右移,AC自动加1
  Write_com(0x01);     //清屏
  Write_com(0x0c);     //开显示
}
//Write_com(0x80);//第一行起始地址
//Write_com(0xc0);//第二行起始地址

void display(void)
{
  Write_com(0x80);
  Write_dat('Y');
  Write_dat('e');
  Write_dat('a');
  Write_dat('r');
  Write_dat(':');
  Write_dat('2');
  Write_dat('0');
  Write_dat(0x30+Times[0]/10);
  Write_dat(0x30+Times[0]%10);
  Write_dat('-');
  Write_dat(0x30+Times[1]/10);
  Write_dat(0x30+Times[1]%10);
  Write_dat('-');
  Write_dat(0x30+Times[2]/10);
  Write_dat(0x30+Times[2]%10);
    
  Write_com(0xc0);
  Write_dat('T');
  Write_dat('i');
  Write_dat('m');
  Write_dat('e');
  Write_dat(':');
  Write_dat(0x30+Times[3]/10);
  Write_dat(0x30+Times[3]%10);
  Write_dat('-');
  Write_dat(0x30+Times[4]/10);
  Write_dat(0x30+Times[4]%10);
  Write_dat('-');
  Write_dat(0x30+Times[5]/10);
  Write_dat(0x30+Times[5]%10);
}

#endif



这都是在学校时写的,现在看了,自己都看不下去了。

给想要的朋友个参考吧。

大众车机的模拟解码器

汽车

大众车机的模拟解码器

lixiaoyao lixiaoyao 发表于2016-04-12 浏览3338 评论1

 

一直看到坛友发的模拟器,芯片太多不好做.
我没有自己画图,就借网友的图修改修改做个示意就好了,反正很简单.
蓝牙背光可用并可自己控制。修改了车机can的两根线用于下载程序,下载好了之后这两根又是按键背光和点火.
顺便把我自己写的程序也贡献出来好了.
当时因为数据的来源原因一直没有发布,但是现在已经在网上开始流传了,应该不能怪我头上了.
先贴我的修改好的图,就一张,和示意用的电路图,修改网友的来的.不是抄袭哈.实在是就是这么简单
这些都不重要,重要的是我的c程序.一直用到现在,证明是可靠的.
你可以随意添加适用的数据.我这只有5gg 035 185 和 34d 035 185的
当然也可以加低速的,不过程序可以参考我的,你添加低速的发送程序,
理论上可以高速低速全整合,可以通吃所有的can车机(前提车机只收不发并且你有数据)