主控用的STC15W408AS,时钟芯片用带温度补偿功能的R8025T,以前用了不少精度也还不错。VFD用SL041MG,驱动用了比较常见的PT6312。电源直接用MicroUSB数据线连接手机充电器等供电。
遥控手动调节,一组闹钟,亮度自动手动控制,掉电记忆等,由于时间关系暂未加入年月日温度等轮回显示
用SL041MG 制作VFD显示屏时钟
电路原理图如下:
SL041MG VFD R8025单片机源程序如下:
- //SL041MG VFD 小琼数码 2018-2-6 V1.0 无温度
- //PT6312+STC15W408AS+R8025T
- #include<STC15.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #include"IIC.h" //IIC驱动
- #include"PT6312.H" //VFD驱动
- #include"NEC6121.h" //遥控解码
- #include"STC_ADC.h" //内部ADC
- #include"STC_EEPROM1T.h" //内部EEPROM
- // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 空 H L P U
- uchar code table[] = {0x7d,0x05,0x6e,0x4f,0x17,0x5b,0x7b,0x0d,0x7f,0x5f,0x3f,0x73,0x78,0x67,0x7a,0x3a,0x02,0x00,0x37,0x70,0x3a,0x75}; //0~9显示代码
- sbit beep = P5^5; //蜂鸣器
- sbit kaiping = P3^2; //开关屏
- sbit k1 = P1^5; //按键1
- sbit k2 = P1^3; //按键2
- bit kk1=0,kk2; //按键标志
- uchar tiao; //调整
- uint fan; //自动返回
- uint liangcai; //光控采集间隔
- uchar shan; //秒点闪
- uchar beeshu; //beep计时用
- bit nao=0; //闹钟标志 0 不响 1 响
- char naoshi=0,naofen=0; //闹钟时间
- uchar naoji=0; //闹钟计数
- uchar guanji=0; //待机
- uchar naokaiguan=0; //闹钟开关
- uchar zishou=0; //自动手动亮度
- char shoushu=0; //手动亮度数值 0-7
- char liangdu=5; //亮度实际数值
- char hour,minute,second; //时间
- uchar disp[5]={0,0,0,0,0}; //显示缓存
- uchar liangshu; //亮度ADC
- #define liang1 50 //可以修改亮度数据
- #define liang2 70
- #define liang3 100
- #define liang4 120
- #define liang5 150
- #define liang6 170
- #define liang7 200
- void delay(uint z) //延时子程序 约1MS
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=1000;y>0;y--);
- }
- void init() //初使化
- {
- delay(100);
- P3M0=0x04; //P3.2强上拉
- P3M1=0x00;
- init_IIC(); //IIC初使化
-
- AUXR |= 0x80;//Timer0 1T Timer1 12T
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- TMOD=0x00; //定时器0,1模式0 自动重装
- TL0 = T125US; //Initial timer0 low byte
- TH0 = T125US>>8; //Initial timer0 high byte
- TR0=1; //开定时器0运行
- AUXR &= 0xFB; //定时器时钟12T模式
- T2L = 0x00; //设置定时初值
- T2H = 0xB8; //设置定时初值
- AUXR |= 0x10; //定时器2开始计时
- IE2|=0x04; //开定时器2中断
- PT6312_1(); //设置显示方式 8位20段
- PT6312_2(); //数据设定 写显存 固定地址 正常模式
- beep=0;
- delay(100);
- beep=0;
- guanji=STC_read(0x0000);
- if(guanji>1)
- {
- guanji=1;
- STC_del(0x0000);
- STC_write(0x0000,guanji);
- }
-
- naokaiguan=STC_read(0x0200);
- if(naokaiguan>1)
- {
- naokaiguan=0;
- STC_del(0x0200);
- STC_write(0x0200,naokaiguan);
- }
-
- naoshi=STC_read(0x0400);
- if(naoshi>23)
- {
- naoshi=8;
- STC_del(0x0400);
- STC_write(0x0400,naoshi);
- }
-
- naofen=STC_read(0x0600);
- if(naofen>59)
- {
- naofen=0;
- STC_del(0x0600);
- STC_write(0x0600,naofen);
- }
-
- zishou=STC_read(0x0800);
- if(zishou>1)
- {
- zishou=0;
- STC_del(0x0800);
- STC_write(0x0800,zishou);
- }
-
- shoushu=STC_read(0x0A00);
- if(shoushu>7)
- {
- shoushu=5;
- STC_del(0x0A00);
- STC_write(0x0A00,shoushu);
- }
- }
- void read_RX8025() //读时期和时间
- {
- uchar dat1,dat2,number;
- number=read_IIC(RX8025,0);
- dat1=number&0x7f;
- dat2=dat1/16; //数据进制转换
- dat1=dat1%16; //十六进制转十进制
- dat1=dat1+dat2*10;
- second=dat1;
- number=read_IIC(RX8025,1);
- dat1=number&0x7f;
- dat2=dat1/16; //数据进制转换
- dat1=dat1%16; //十六进制转十进制
- dat1=dat1+dat2*10;
- minute=dat1;
- number=read_IIC(RX8025,2);
- dat1=number&0x3f;
- dat2=dat1/16; //数据进制转换
- dat1=dat1%16; //十六进制转十进制
- dat1=dat1+dat2*10;
- hour=dat1;
- }
- void huancun() //显示数据送入缓存
- {
- switch(tiao)
- {
- case 0: //平时显示
- if((hour/10)==0)
- disp[0]=17;
- else
- disp[0]=hour/10;
- disp[1]=hour%10;
- if(shan<25)
- disp[2]=0x44;
- else
- disp[2]=0x00;
- disp[3]=minute/10;
- disp[4]=minute%10;
-
- break;
- case 1: //调整小时
- if(shan<25)
- {
- disp[0]=hour/10;
- disp[1]=hour%10;
- disp[2]=0x44;
- }
- else
- {
- disp[0]=17;
- disp[1]=17;
- disp[2]=0;
- }
- disp[3]=minute/10;
- disp[4]=minute%10;
- break; //调整分钟
- case 2:
- disp[0]=hour/10;
- disp[1]=hour%10;
- if(shan<25)
- {
- disp[2]=0x44;
- disp[3]=minute/10;
- disp[4]=minute%10;
- }
- else
- {
- disp[2]=0;
- disp[3]=17;
- disp[4]=17;
- }
- break;
- case 3: //调整秒
- disp[0]=17;
- disp[1]=17;
- if(shan<25)
- disp[2]=0x44;
- else
- disp[2]=0x00;
- disp[3]=second/10;
- disp[4]=second%10;
- break;
- case 4: //闹钟开关
- disp[0]=10;
- disp[1]=19;
- disp[2]=0x40;
- if(shan<25)
- {
- if(naokaiguan)
- {
- disp[3]=1;
- disp[4]=1;
- }
- else
- {
- disp[3]=0;
- disp[4]=15;
- }
- }
- else
- {
- disp[3]=17;
- disp[4]=17;
- }
- break;
- case 5: //闹钟小时
- if(shan<25)
- {
- disp[0]=naoshi/10;
- disp[1]=naoshi%10;
- }
- else
- {
- disp[0]=17;
- disp[1]=17;
- }
- disp[2]=0x04;
- disp[3]=naofen/10;
- disp[4]=naofen%10;
- break;
- case 6: //闹钟分钟
- disp[0]=naoshi/10;
- disp[1]=naoshi%10;
- disp[2]=0x04;
- if(shan<25)
- {
- disp[3]=naofen/10;
- disp[4]=naofen%10;
- }
- else
- {
- disp[3]=17;
- disp[4]=17;
- }
- break;
- case 7: //自动手动亮度
- disp[0]=19;
- disp[1]=19;
- disp[2]=0x40;
- if(shan<25)
- {
- if(zishou)
- {
- disp[3]=5;
- disp[4]=13;
- }
- else
- {
- disp[3]=10;
- disp[4]=21;
- }
- }
- else
- {
- disp[3]=17;
- disp[4]=17;
- }
- break;
- case 8: //手动亮度数
- disp[0]=5;
- disp[1]=13;
- disp[2]=0x40;
- if(shan<25)
- {
- disp[3]=0;
- disp[4]=shoushu;
- }
- else
- {
- disp[3]=17;
- disp[4]=17;
- }
- break;
- }
- }
- void display() //送显示数据
- {
- PT6312_3();
- write_PT6312(table[disp[4]]);
- write_PT6312(0x00);
-
- write_PT6312(table[disp[3]]);
- write_PT6312(0x00);
- write_PT6312(disp[2]);
- write_PT6312(0x00);
- write_PT6312(table[disp[1]]);
- write_PT6312(0x00);
- write_PT6312(table[disp[0]]);
- write_PT6312(0x00);
-
- PT6312_4(liangdu);
- }
- void yaokong() //遥控功能
- {
- if(IR_code==daiji)
- {
- if(guanji==0) guanji=1;
- else if(guanji==1)
- {
- guanji=0;
- tiao=0;
- }
- STC_del(0x0000);
- STC_write(0x0000,guanji);
- beep=0;
- }
- if(guanji)
- {
- if(IR_code==xiaoshi)
- {
- tiao++;
- if(tiao>=9)
- {
- tiao=0;
- beep=0;
- delay(100);
- }
- beep=0;
- fan=0;
- }
- if(IR_code==jing)
- {
- nao=0;
- naoji=0;
- beep=0;
- }
- if(tiao!=0)
- {
- if(IR_code==jia)
- {
- switch(tiao)
- {
- case 1:
- hour++;
- if(hour>=24)
- hour=0;
- write_IIC(RX8025,2,(hour/10)<<4|(hour%10));
- break;
- case 2:
- minute++;
- if(minute>=60)
- minute=0;
- write_IIC(RX8025,1,(minute/10)<<4|(minute%10));
- break;
- case 3:
- second++;
- if(second>=60)
- second=0;
- write_IIC(RX8025,0,(second/10)<<4|(second%10));
- break;
- case 4:
- if(naokaiguan==0) naokaiguan=1;
- else if(naokaiguan==1) naokaiguan=0;
- STC_del(0x0200);
- STC_write(0x0200,naokaiguan);
- break;
- case 5:
- naoshi++;
- if(naoshi>23)
- naoshi=0;
- STC_del(0x0400);
- STC_write(0x0400,naoshi);
- break;
- case 6:
- naofen++;
- if(naofen>59)
- naofen=0;
- STC_del(0x0600);
- STC_write(0x0600,naofen);
- break;
- case 7:
- if(zishou==0) zishou=1;
- else if(zishou==1) zishou=0;
- STC_del(0x0800);
- STC_write(0x0800,zishou);
- break;
- case 8:
- shoushu++;
- if(shoushu>=8)
- shoushu=0;
- STC_del(0x0A00);
- STC_write(0x0A00,shoushu);
- break;
- }
- beep=0;
- fan=0;
- }
-
- if(IR_code==jian)
- {
- switch(tiao)
- {
- case 1:
- hour--;
- if(hour<0)
- hour=23;
- write_IIC(RX8025,2,(hour/10)<<4|(hour%10));
- break;
- case 2:
- minute--;
- if(minute<0)
- minute=59;
- write_IIC(RX8025,1,(minute/10)<<4|(minute%10));
- break;
- case 3:
- second--;
- if(second<0)
- second=59;
- write_IIC(RX8025,0,(second/10)<<4|(second%10));
- break;
- case 4:
- if(naokaiguan==0) naokaiguan=1;
- else if(naokaiguan==1) naokaiguan=0;
- STC_del(0x0200);
- STC_write(0x0200,naokaiguan);
- break;
- case 5:
- naoshi--;
- if(naoshi<0)
- naoshi=23;
- STC_del(0x0400);
- STC_write(0x0400,naoshi);
- break;
- case 6:
- naofen--;
- if(naofen<0)
- naofen=59;
- STC_del(0x0600);
- STC_write(0x0600,naofen);
- break;
- case 7:
- if(zishou==0) zishou=1;
- else if(zishou==1) zishou=0;
- STC_del(0x0800);
- STC_write(0x0800,zishou);
- break;
- case 8:
- shoushu--;
- if(shoushu<0)
- shoushu=7;
- STC_del(0x0A00);
- STC_write(0x0A00,shoushu);
- break;
- }
- beep=0;
- fan=0;
- }
- }
- }
- }
-
- void keyscan()
- {
-
- if(!k1)
- kk1=1;
- if(kk1&&k1)
- {
- if(guanji==0)
- {
- tiao=0;
- guanji=1;
- beep=0;
- STC_del(0x0000);
- STC_write(0x0000,guanji);
- }
- else if(nao==1)
- {
- naoji=0;
- nao=0;
- }
- else
- {
- tiao++;
- if(tiao>=9)
- {
- tiao=0;
- beep=0;
- delay(100);
- }
- }
- beep=0;
- kk1=0;
- fan=0;
-
- }
- if(guanji==1)
- {
- if(!k2)
- kk2=1;
- if(kk2&&k2)
- {
- if(nao==1)
- {
- naoji=0;
- nao=0;
- }
- else
- {
- switch(tiao)
- {
- case 1:
- hour++;
- if(hour>=24)
- hour=0;
- write_IIC(RX8025,2,(hour/10)<<4|(hour%10));
- break;
- case 2:
- minute++;
- if(minute>=60)
- minute=0;
- write_IIC(RX8025,1,(minute/10)<<4|(minute%10));
- break;
- case 3:
- second++;
- if(second>=60)
- second=0;
- write_IIC(RX8025,0,(second/10)<<4|(second%10));
- break;
- case 4:
- if(naokaiguan==0) naokaiguan=1;
- else if(naokaiguan==1) naokaiguan=0;
- STC_del(0x0200);
- STC_write(0x0200,naokaiguan);
- break;
- case 5:
- naoshi++;
- if(naoshi>23)
- naoshi=0;
- STC_del(0x0400);
- STC_write(0x0400,naoshi);
- break;
- case 6:
- naofen++;
- if(naofen>59)
- naofen=0;
- STC_del(0x0600);
- STC_write(0x0600,naofen);
- break;
- case 7:
- if(zishou==0) zishou=1;
- else if(zishou==1) zishou=0;
- STC_del(0x0800);
- STC_write(0x0800,zishou);
- break;
- case 8:
- shoushu++;
- if(shoushu>=8)
- shoushu=0;
- STC_del(0x0A00);
- STC_write(0x0A00,shoushu);
- break;
- }
- }
- beep=0;
- kk2=0;
- fan=0;
- }
- }
- }
-
- void main()
- {
- init(); //初使化
- init_ADC(); //ADC初使化
-
- while(1)
- {
- if(tiao!=0) //自动返回
- {
- fan++;
- if(fan>400)
- {
- fan=0;
- tiao=0;
- beep=0;
- delay(100);
- beep=0;
- }
- }
- keyscan(); //按键扫描
-
- if(jie) //红外线遥控数据解码
- {
- yaokong();
- jie =0;
- }
- liangcai++;
- if(liangcai>300)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
用51单片机制作VFD显示屏时钟.rar
(1.16 MB, 下载次数: 148)
|