1、本人对单片机编程不在行,也是在不断学习中,我是搞硬件工作的,对一般的硬件电路倒是很熟悉,也用单片机做个一些非常简单的项目,比如一些试验设备也是用单片机来控制,事半功倍啊。但那些程序相对IIC,红外通信,1302来说都简单得不得了。本着利用业余时间不断学习精进的理想,一直在努力向前辈们学习中。平日里自己的作品都不能留在自己的手上,就像看着自己的儿子被人抱走一样,也许没什么技术含量,但自娱自乐一下,还是能提升不少荷尔蒙,为了弥补心中之遗憾,特别做一件留给自己的作品。
我不喜欢在开发板上作东西,那是开发前期试验程序用的,不能算是一件作品。一件作品必须是独立的实现预设的功能指标,所有的相关设计都是围绕这个功能为中心,并且作品具有一定的实用性和便利性。
该作品硬件比较简单,但程序部分花了我不少时间(因为是新手),电波钟解码部分找了些网上的相关解决方案和电波钟的信号编码规则,结合到手上1的程序,试验调试,解决各种BUG,最后完成。
2、材料清单:
1、STC12CXXXX单片机一片
2、1英寸白色数码管和红色小数码管共6只
3、74HC245一块
4、DS1302模块(用的现成的)一块
5、报时语音模块一块
6、电波钟模块一块
7、运放一块
8、光敏,发光二极管,PNP和NPN数只,按键4只,
9、连接线若干
10、透明防水外壳一个
11、杜帮线若干
12、9V线性变压电源一只
13、7805一块,SM1117一块
14、电解电容,钽电容,电阻,贴片电阻容若干
15、洞洞板一块,铜柱4根
16、防浪涌保护TVS管一只
3、开始工作
准备构思如何用好这些材料做出一个像样的作品,前壳为什么要全透明呢,这是为了增加电子作品的艺术性,观赏性(手工板也可以欣赏)能看清内部构造,即增加了作品的透明感,又增加了电子技术的神秘感。
初步构思
理想中,成品应该可能也许大概是这样的
焊接部分模块
焊接几个,试试效果,不断构思,不断改进中。先用的绿色LED作为时分的分隔,后来发现绿光不纯,偏黄,后换成红色。
再次构思
经过一天的焊接(业余时间),初步成型,先试试能不能动起来。嗯,不完美的地方来了,LED看起来亮与不亮的字段区分不明显,对于我这个强迫症来说,一定要加滤光片。不然难受,吃不下饭。
不管了,先把电波钟模块加上,淘宝15元。用热熔胶粘上去。语音模块也装上,喇叭也在侧面开了孔。电波模块用LED试验了一下,晚上能收到信号,白天基本不可能,电磁污染太严重(我就是搞EMC的),经我试验,坐标广州,收到商丘的电波钟信号,要在晚上00点以后,才能在窗户口收到正常的信号。
取个名《大笨钟》,LED已经加了滤光片,现在已经完美了。按键加上了,电波的电源控制等部分也完成了。写入程序,增加自己功能,并调试。白LED太亮,晚上就是小夜灯,所以在夜间要降低亮度,用光敏加运放自动控制。
红色LED在电波对时成功后会关闭,绿色LED是电波钟信号指示,会随信号有无闪动。夜间2-3点自动开启授时,授时失败红色LED亮起提示,直到第二次授时成功后,才会关闭。第4个按键改为强制手动授时。本来第4个键是手动关闭整点报时的。现在程序改为夜间自动关闭报时
最终完成,放在古董收音机上,不错。为什么我的按键要放在里面呢,调时要开盖,不方便??NONO,我的是电波授时,理论上,永远不用调时。所以不需要开盖调整。我也不需要年月日周,所以只要时间就OK。
以下是程序部分,发程序出来,不注释,别人很难看懂,隔几个月,自己可能都看不懂了。哈哈哈。
严正声明:本程序部分纯属个人技术性开发娱乐,无任何商业用途,如认为有侵权行为,速与我联系或与论坛管理员联系并删除。否则本人不承担任何法律责任。
/**************************************************
程序名:《大笨钟》
晶 振:24MHZ
功 能:LED数码管显示,按键可调,电波自动校时,整点报时功能,夜间光感自动亮度
全局变量已达到90个,有点多,后续要完善一下,只用一个程序文件写完。
******************************************************/
- /**************************************************
- 程序名:《大笨钟》
- 晶 振:24MHZ
- 功 能:LED数码管显示,按键可调,电波自动校时,整点报时功能,夜间光感自动亮度
- 全局变量已达到93个
- ******************************************************/
- #include<stc12c5a60s2.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar Dat_su,Dat_num,min,hour,keysetnum;
- uchar s1,m1,h1;
- uchar hourshi,hourge,minshi,minge,secshi,secge;
- sbit DSIO = P2^2; //1302信号脚
- sbit RST = P2^1; //1302复位信号脚
- sbit SCLK = P2^0; //1302时钟信号脚
- sbit keyset = P3^7; //进入设置
- sbit keyshi = P3^6; //时加按键设置
- sbit keyfen = P3^5; //分加按键设置
- sbit keyBPC = P3^4; //电波强制对时按键
- sbit Ring = P2^4; //整点报时输出
- bit flag200ms; //200MS读DS1302标志位
- bit keysetflag; //进入按键设置标志位
- bit alarmflag; //报时标志位
- /******BPC***********/
- sbit BPC = P3^3; //BPC输入,外部输入
- sbit BPC_EN = P2^3; //BPC 使能
- sbit BPC_FailLED = P2^5; //BPC校时失败指示灯
- bit keyBPCflag; //强制对时标志位
- bit BPC_add; //BPC中断标志位
- bit BPC_ok = 1; //对时成功标志位,默认为开启才能开启BPC
- bit Get_time,As_time; //授时标志位
- uchar Dat_su,Dat_num,keyBPCnum;
- uchar data BPC_dat[3][19]; //BPC3列个19组数组
- uint BPC_temp,Dat_add; //BPC脉宽时间记录变量
- uchar data Times[3]; //BPC "分,时,上/下午“数组
- uchar DisplayData[6]; //LED显示缓存数组
- uchar code smgduan[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x78,0x80,0x90}; //LED 0-9
- //DS1302写入和读取时分秒的地址命令
- //秒分时日月周年最低位读写位
- uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- //存储顺序秒分时日月周年,存储格式是用BCD码//
- uchar TIME[7];
- /*************************************
- * 函数名: delay()
- * 按键延时函数,按键使用
- ************************************/
- void delay() //100ms
- {
- unsigned char a,b,c;
- for(c=4;c>0;c--)
- for(b=212;b>0;b--)
- for(a=140;a>0;a--);
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302Write
- * 函数功能 : 向DS1302命令(地址+数据)
- * 输 入 : addr,dat
- *******************************************************************************/
- void Ds1302Write(uchar addr, uchar dat)
- {
- uchar n;
- RST = 0;
- _nop_();
- SCLK = 0; //先将SCLK置低电平。
- _nop_();
- RST = 1; //然后将RST(CE)置高电平。
- _nop_();
- for (n=0; n<8; n++) //开始传送八位地址命令
- {
- DSIO = addr & 0x01;//数据从低位开始传送
- addr >>= 1;
- SCLK = 1; //数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++) //写入8位数据
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1; //数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0; //传送数据结束
- _nop_();
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302Read
- * 函数功能 : 读取一个地址的数据
- * 输 入 : addr
- * 输 出 : dat
- *******************************************************************************/
- uchar Ds1302Read(uchar addr)
- {
- uchar n,dat,dat1;
- RST = 0;
- _nop_();
- SCLK = 0; //先将SCLK置低电平。
- _nop_();
- RST = 1; //然后将RST(CE)置高电平。
- _nop_();
- for(n=0; n<8; n++) //开始传送八位地址命令
- {
- DSIO = addr & 0x01;//数据从低位开始传送
- addr >>= 1;
- SCLK = 1; //数据在上升沿时,DS1302读取数据
- _nop_();
- SCLK = 0; //DS1302下降沿时,放置数据
- _nop_();
- }
- _nop_();
- for(n=0; n<8; n++) //读取8位数据
- {
- dat1 = DSIO; //从最低位开始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0; //DS1302下降沿时,放置数据
- _nop_();
- }
- RST = 0;
- _nop_(); //DS1302复位的稳定时间,必须的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302Init
- * 函数功能 : 初始化DS1302
- *******************************************************************************/
- void Ds1302Init()
- {
- uchar dat;
- RST = 0;
- SCLK = 0;
- dat = Ds1302Read(0x81); //读1302最高位判断掉电时间是否正常
- if((dat&0x80)!=0) //为0,正常运行
- {
- Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
- Ds1302Write(0x84,0x00); //写入时钟最高位为0,定义为24小时制
-
- /******
- 本程序不需要写入年月日和初始时间
- for (n=0; n<7; n++) //写入7个字节的时钟信号:分秒时日月周年
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
- }
- *******/
- Ds1302Write(0x8E,0x80); //打开写保护功能
- }
- }
- /*******************************************************************************
- * 函 数 名 : Ds1302ReadTime
- * 函数功能 : 读取时钟信息
- *******************************************************************************/
- void Ds1302ReadTime()
- {
- uchar n;
- for (n=0; n<7; n++) //读取7个字节的时钟信号:分秒时日月周年
- {
- TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : datapros()
- * 函数功能 : 时间读取处理转换函数
- *******************************************************************************/
- void datapros()
- {
- Ds1302ReadTime(); //先读取1302的时分秒
- DisplayData[0] = smgduan[TIME[2]>>4]; //时十位
- DisplayData[1] = smgduan[TIME[2]&0x0f];
- DisplayData[2] = smgduan[TIME[1]/16]; //分十位
- DisplayData[3] = smgduan[TIME[1]&0x0f];
- DisplayData[4] = smgduan[TIME[0]/16]; //秒十位
- DisplayData[5] = smgduan[TIME[0]&0x0f];
- }
- /*******************************************************************************
- * 函 数 名 :keyscan()
- * 函数功能 :按键设置时间和BPC对时
- *******************************************************************************/
- void keyscan()
- {
- if(keyset == 0)
- {
- delay();
- if(keyset == 1)
- {
- keysetnum++; //按键记录值
- h1 = (TIME[2]>>4)*10+(TIME[2]&0x0f)%10;//先将1302暂停时的小时值转换成十进制赋予变量H1时,以便在此基础上累加调整改然后写入1302
- m1 = (TIME[1]>>4)*10+(TIME[1]&0x0f)%10;//先将1302暂停的的分钟值转换成十进制赋予变量M1时,以便在此基础上累加调整改然后写入1302
- }
- if(keysetnum == 1) //按一次
- {
- keysetflag = 1; //按下KEYSET标志位,用以暂停读1302
- }
- if(keysetnum >= 2) //按二次,恢复读1302,不能==2,可能因按键因素大于2
- {
- keysetnum = 0; //清零
- keysetflag = 0; //标志位清零,恢复读1302
- Ds1302Write(0x8E,0X00); //关闭1302写保护
- Ds1302Write(0x80,0); //向秒寄存器写入0
- Ds1302Write(0x8E,0x80); //打开1302写保护
- }
- }
- if(keyshi == 0) //“时”增加按键
- {
- delay();
- if((keyshi==1)&&(keysetflag==1)) //判断KEYSET标志位,只有KEYSET按下后才运行
- {
- h1++; //小时加1,24小时制
- if(h1>23)
- {
- h1 = 0;
- }
- DisplayData[0] = smgduan[h1/10]; //十进制转换送LED十位显示
- DisplayData[1] = smgduan[h1%10]; //十进制转换送LED个位显示
- hour = (h1/10*16)+(h1%10); //将H1的值转换成BCD码赋给HOUR
- Ds1302Write(0x8E,0X00); //关闭1302写保护
- Ds1302Write(0x84,hour); //向1302“时”寄存器写入小时值
- Ds1302Write(0x8E,0x80); //打开1302写保护
- }
- }
- if(keyfen == 0) //“分”增加键
- {
- delay();
- if((keyfen==1)&&(keysetflag==1)) //判断KEYSET标志位,只有KEYSET按下后才运行
- {
- m1++;
- if(m1>59) //分,十进制
- {
- m1 = 0;
- }
- DisplayData[2] = smgduan[m1/10]; //十进制转换送LED十位显示
- DisplayData[3] = smgduan[m1%10]; //十进制转换送LED个位显示
- min = (m1/10*16)+(m1%10); //将m1的值转换成BCD码赋给min
- Ds1302Write(0x8E,0X00); //关闭写保护
- Ds1302Write(0x82,min); //向"分"寄存器写入分钟值
- Ds1302Write(0x8E,0x80); //打开写保护
- }
- }
- if(keyBPC == 0) //按键强制开启BPC
- {
- delay();
- if(keyBPC == 1)
- {
- keyBPCnum++;
- if(keyBPCnum == 1) //按下一次,开启BPC
- {
- BPC_EN = 0;
- BPC_FailLED = 1;
- keyBPCflag = 1;
- }
- if(keyBPCnum >= 2) //按下第二次,关闭BPC
- {
- keyBPCnum = 0;
- BPC_EN = 1;
- BPC_FailLED = 0;
- keyBPCflag = 0;
- }
- }
- }
- }
- /*********************************************
- * 整点报时函数 :AlarmRing()
- * 函数功能 : 整点报时
- **********************************************/
- void AlarmRing()
- {
- uchar p,q;
- p = (TIME[1]>>4)*10+(TIME[1]&0x0f)%10; //读取1302 变为十进制,分钟为00
- q = (TIME[0]>>4)*10+(TIME[0]&0x0f)%10; //秒钟为00
- if((p|q) == 0) //分与秒相或为0时
- {
- if(alarmflag == 1) //先判断报时标志打开,禁止报时段标志为0
- {
- Ring = 1; //触发报时
- delay();
- delay();
- Ring = 0; //关闭触发
- }
- }
- }
- /************************************************************
- * 整点报时设定函数 : Closealarm()
- **函数功能 : 设置整点报时时段
- ***********************************************************/
- void Closealarm()
- {
- uchar k;
- k = (TIME[2]>>4)*10+(TIME[2]&0x0f)%10; //读1302小时值,转成十进制,设定关闭闹钟时间段
- if((0<=k)&&(k<=5)) //小5点,大于0点时段,关闭整点报时
- {
- alarmflag = 0; //关闭报时标志 0-6点
- //alarmLED = 0; //关闭报时指示灯
- }
- else //打开报时
- {
- alarmflag = 1; //否则打启报时标志位
- //alarmLED = 1;
- }
- }
- /******************************************************
- * BPC接收函数 : recieveBPCtime()
- * 函数功能 : 接收BPC授时和写入DS1302时间
- *******************************************************/
- void recieveBPCtime()
- {
- if(As_time) //正确接收19位数据标志位
- {
- As_time=0; //清零标志,并判断一分钟内3列19组相同的数据,“分时周月年”
- 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) //收到3帧相同的数据后,对Times[]数据赋值授时
- {
- Get_time=0; //标志位清零
- keysetflag = 1; //利用该标志位来暂停读DS1302
- Times[0]=((BPC_dat[0][2]*4)+(BPC_dat[0][3])); //BPC”时“,4进制,第2、3位
- Times[1]=((BPC_dat[0][4]*16)+(BPC_dat[0][5]*4)+(BPC_dat[0][6])+1); //BPC”分“,4进制,第4,5,6位,3帧数据相同后,分的起始点为第2分钟00秒,要加1补偿
- Times[2]=(BPC_dat[0][9]); //判断BPC第10位识别上/下午,0,1为上午,2,3为下午
- if(Times[2]<2) //上下午判断,如果小于2,为上午
- {
- hour = (Times[0]/10*16)+(Times[0]%10); //时转换成BCD
- min = (Times[1]/10*16)+(Times[1]%10); //分转换成BCD
- }
- else //上下午判断,如果大于1,为下午
- {
- hour = ((Times[0]+12)/10*16)+((Times[0]+12)%10); //BPC下午,Times[3]要加12变为24小时制并转换为BCD
- min = (Times[1]/10*16)+(Times[1]%10); //分转成BCD
- }
- Ds1302Write(0x8E,0X00); //关闭写保护
- Ds1302Write(0x84,hour); //向时寄存器写入小时值
- Ds1302Write(0x82,min); //向分寄存器写入
- Ds1302Write(0x80,0); //向秒寄存器写入0,一分钟3帧相同信号,分加1后,秒归0.无需判断
- Ds1302Write(0x8E,0x80); //打开写保护
- keysetflag = 0; //恢复读1302
- BPC_ok = 0; //授时成功标志清零
- BPC_EN = 1; //接收成功后,关闭BPC
- BPC_FailLED = 0; //关闭授时失败指示灯
- keyBPCflag = 0; //取消强制对时标志位
- }
- }
- /**************************************************
- * BPC自动接收函数 : BPC_openset()
- * 函数功能 : 设置BPC开启授时时间
- *************************************************/
- void BPC_openset()
- {
- uchar t;
- t = (TIME[2]>>4)*10+(TIME[2]&0x0f)%10; //先读出1302的小时值,转换成十进制
- if(t == 2) //夜间2点,持续接收BPC。
- {
- if(BPC_ok) //先判断BPC授时成功标志位,授时成功一次,不再执行该程序
- {
- BPC_EN = 0; //打开BPC授时模块
- BPC_FailLED = 1; //打开授时失败指示灯
- }
- }
- if(t == 3) //夜时3点,如未成功授时自动关闭BPC
- {
- if(keyBPCflag == 0) //判断按键强制对时按键标志位,如果有按键强制对时,不执行
- {
- BPC_EN = 1; //1小时内授时不成功,关闭BPC模块,不关指示灯用于提示授时失败
- BPC_ok = 1; // 开授时成功标志位,以便下一个2点能开启BPC模块
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- *******************************************************************************/
- void main()
- {
- Ring = 0; // 整点报时初始值
- BPC_EN = 1; //BPC使能初始
- BPC_FailLED = 0; //授时失败指示灯初始
- EA = 1;
- TMOD = 0x01; //T0
- TH0 = (65536-2000)/256; //LED刷新和定时读DS1302
- TL0 = (65536-2000)%256;
- TR0 = 1;
- ET0 = 1;
- IT1=1; //P33下降沿触发
- EX1=1; //开启外部中断
- PX1=1; //外部中断优先
- //Ds1302Init(); //本程序无需初始化DS1302
- while(1)
- {
- Closealarm(); //整点报时关闭时段
- keyscan(); //按键
- AlarmRing(); //整点报时
- BPC_openset(); // BPC开启函数
- recieveBPCtime(); //BPC接收转换函数
-
- if(flag200ms) //读1302时间标志
- {
- flag200ms = 0;
- if(keysetflag == 0) //有按键调整时,标志位置1,暂停读1302
- {
- datapros(); //数据处理函数
- }
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : interruptimer()
- * 函数功能 : 中断,刷新数码管,BPC时间记时判断脉宽值
- *******************************************************************************/
- void interrutptimer() interrupt 1
- {
- uchar i,ms;
- TH0 = (65536-2000)/256; //1ms
- TL0 = (65536-2000)%256;
- ms++;
- if(ms>=200)
- {
- ms = 0;
- flag200ms = 1; //读1302间隔时间段
- }
- switch(i)
- {
- case 0: P1=0x3e;i++;P0=0x00;P0=DisplayData[5];break; // 秒
- case 1: P1=0x3d;i++;P0=0x00;P0=DisplayData[4];break;
- case 2: P1=0x3b;i++;P0=0x00;P0=DisplayData[3];break; //分
- case 3: P1=0x37;i++;P0=0x00;P0=DisplayData[2];break;
- case 4: P1=0x2f;i++;P0=0x00;P0=DisplayData[1];break; //时
- case 5: P1=0x1f;i=0;P0=0x00;P0=DisplayData[0];break;
- default: break;
- }
-
- Dat_add++; //外部中断内对ADD清零,1500次内,有外部中断,重新清零
- if(Dat_add>1500) //BPC启始信号,每1MS对DAT_add加1,如在1500个周期内没有进入外部中断被清零,1.5S后标志找到超始信号,重新对Dat_num清零,以便重新对19个位赋值
- Dat_num=0; //对数组清零,说明已授收到超始脉冲
- if(BPC_add) //外部中断标志为真
- {
- if(!BPC) // 第1个脉冲负边到来时
- BPC_temp++; //用BPC_temp累加值来判断脉宽
- else
- {
- BPC_add=0; //当第1个脉冲跳变为正边时,对BPC_add标志位清零,等待下个脉冲的中断
- if((BPC_temp>50)&&(BPC_temp<150)) BPC_dat[Dat_su][Dat_num]=0; //判断脉宽值,赋值给二维数组的第[0][0]
- else if((BPC_temp>150)&&(BPC_temp<250))BPC_dat[Dat_su][Dat_num]=1;
- else if((BPC_temp>250)&&(BPC_temp<350))BPC_dat[Dat_su][Dat_num]=2;
- else if((BPC_temp>350)&&(BPC_temp<450))BPC_dat[Dat_su][Dat_num]=3;
- else Dat_num=0; //如果以上有不正确的值,对Dat_num清零重来
-
- Dat_num++; //对第二维的数据的值清零
- if(Dat_num>18)
- {
- Dat_num=0;
- As_time=1; //正确接收19位数据标志位
- Dat_su++; //对第一维的数据增加,最终共3*19组数据
- if(Dat_su>2)
- Dat_su=0;
- }
- BPC_temp=0; //脉冲累加值清零
- }
- }
- }
- /***********************************************************************
- * 电波钟中断检测函数 :Time_EX1()
- * 函数功能 : BPC当外部下降沿时产生中断,标志置位,清零时间累加值
- ***************************************************************************/
- void Time_EX1(void)interrupt 2 //外部中断,优先级为最高,防止漏检
- {
- BPC_add=1; //外部中断标志
- Dat_add=0; //1ms定时中断内对变量加1,用来判断1.5S的超始脉冲
- }
复制代码 发贴不易,敬请评论指点,特别是在程序上,希望能学习时步。
全部资料51hei下载地址:
大笨钟.zip
(53.95 KB, 下载次数: 167)
|