X双色点阵字LED点阵屏DS万年历电子钟温度显示DSB C 程序.doc_第1页
X双色点阵字LED点阵屏DS万年历电子钟温度显示DSB C 程序.doc_第2页
X双色点阵字LED点阵屏DS万年历电子钟温度显示DSB C 程序.doc_第3页
X双色点阵字LED点阵屏DS万年历电子钟温度显示DSB C 程序.doc_第4页
X双色点阵字LED点阵屏DS万年历电子钟温度显示DSB C 程序.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* 16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序/*单片机:STC89C52 或者其他型号都可以晶振 30M 如果换用其他晶振 DS18B20延时函数需修改 见void delay_18B20(unsigned int i)说明功能简介:上电移动一下广告,然后进入时间显示 切换显示时间 星期 月日 年 温度4个按键 分别进行调时设置切换间隔时间可设置 /*点阵屏管脚定义SHCP GNDSTCP GNDR1 GNDG1 GNDOE GNDA GNDB GNDC D/接口说明/A B C D 是138行扫描信号/ SHCP 是595的移位信号/ ST

2、CP 是595的锁存信号/ OE 是屏的使能端 可以控制亮度/ R 是红色信号线/ G 是绿色信号线 /* DS1302 接线图 Vcc2 CLK I/O /RST | - 8 7 6 5 DS1302 | | 1 2 3 4 | - | | VCC1 GND1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P008脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容电压在2.5V以上即可维持 595连级输出数据,138行驱动。/include”NEW_8051.H”#define uchar u

3、nsigned char#define uint unsigned int#define light 3 /定义亮度uchar code hanzi; /汉字字模uchar code shengri;/生日字模uchar code timer1416;/09数字uchar code sw; /138驱动数据uchar U8FLAG;bit zz=0,rr=0;uchar FLAG;uchar ucTemp;uchar U8count,U8temp;uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;uchar U8T_

4、data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;uchar ucComdata;void Show_word(); /待机显示按三秒间隔分别显示年、月日、星期、时分秒。void Show_pass(); /不显示一个字void Send_data(unsigned char d); /发送一个字节红色数据*/void Send_data1(unsigned char d); /*发送一个字节绿色数据*/void Send_data2(unsigned char d);/*发送一个字节黄

5、色色数据/*/*按键定义*/sbit resget=P15;/时钟复位sbit key_moda=P17;/模式转换sbit key_up=P43;/时钟加sbit key_Down=P33;/时钟减/*DS1302 数据IO定义/sbit T_CLK=P07;/DS1302引脚连接sbit T_IO =P06;sbit T_RST=P05;sbit ACC0=ACC0;/1bit数据存储位sbit ACC7=ACC7;/*定义DS18B20 IO接口*/sbit DQ= P3 6;/ds1820data(单总线) 请根据实际 定义接口/* 点阵接口定义*/sbit SHCP=P27;/595

6、的移位信号 sbit STCP=P41;/是595的锁存信号 /*如果用的是普通单片机 没有P4。1口 请改为其他口/ sbit SDA_R=P23;/红数据 sbit SDA_G=P25;/绿数据 sbit OE=P04;/输出使能 sbit ID=P40;/行控制线D /*如果用的是普通单片机 没有P4.0口 请改为其他口*/ sbit IC=P20;/行控制线C sbit IB=P21;/行控制线B sbit IA=P22;/行控制线A /*/define scan0 IA=0;IB=0;IC=0;ID=0;#define scan1 IA=1;IB=0;IC=0;ID=0;#defin

7、e scan2 IA=0;IB=1;IC=0;ID=0;#define scan3 IA=1;IB=1;IC=0;ID=0;define scan4 IA=0;IB=0;IC=1;ID=0;define scan5 IA=1;IB=0;IC=1;ID=0;define scan6 IA=0;IB=1;IC=1;ID=0;define scan7 IA=1;IB=1;IC=1;ID=0;define scan8 IA=0;IB=0;IC=0;ID=1;#define scan9 IA=1;IB=0;IC=0;ID=1;define scan10 IA=0;IB=1;IC=0;ID=1;#defi

8、ne scan11 IA=1;IB=1;IC=0;ID=1;#define scan12 IA=0;IB=0;IC=1;ID=1;#define scan13 IA=1;IB=0;IC=1;ID=1;#define scan14 IA=0;IB=1;IC=1;ID=1;#define scan15 IA=1;IB=1;IC=1;ID=1; /秒 分 时 日 月 星期 年 所以初始化时间是 12年-12月07日星期222点10分0秒uchar starts_time7=0x00,0x10,0x22,0x07,0x12,0x02,0x12; /初始化后设置uchar idata Move,Spee

9、d,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; /时间温度变量uchar a,b,f,h,msec,id,x; /标志计数器 a为自动转换显示时间,b为手动与自动标志uint zimuo; /字模计数器uchar BUFF10; /缓存void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出 1Byte /void W1302(uchar, uchar); / 向DS1302写入一个字节uchar R1302(uchar); / 从DS1302读出一个字节vo

10、id Set1302(uchar ); / 写DS1302时间void du1302(); / 读时间 void DelayMs(void); / 延时void Set(uchar,uchar ); / 变量调整void in_data(); / 调整移动数据void rxd_data(); / 串口发送移动数据read_temp(); /*读取温度值并转换/void RH(void);uchar nn=0,mm=0;/*不影响其他端口的扫描*/void scan(unsigned char Value)switch(Value) case 0: scan0;break; case 1: sc

11、an1;break; case 2: scan2;break; case 3: scan3;break; case 4: scan4;break; case 5: scan5;break; case 6: scan6;break; case 7: scan7;break; case 8: scan8;break; case 9: scan9;break; case 10:scan10;break; case 11:scan11;break; case 12:scan12;break; case 13:scan13;break; case 14:scan14;break; case 15:sca

12、n15;break; default:break; /*/void SendOneByte(unsigned char c) SBUF = c; while(!TI); TI = 0;/*/主函数/void main() Move=0; zimuo=0; TMOD=0x11;/16位定时 TH0=0xC5; /15ms晶振为12M TL0=0x68; TH1 = 0x92;/ 18。2ms TL1 = 0x0CD; ET1=1; EA=1; /开总中断 TR0=1; /开定时器计数 ET0=1; /开定时器中断0 rr=1;SCON = 0x50;/TMOD= 0x20;BRT = 0xf8;

13、 /0xfb: 30MHz,12T,SMOD=0,9600bpsAUXR |= 0x11;SendOneByte(0X55); while(zimuo512)/上电显示一段广告 while(Move16) /数据移位。 for(Speed=0;Speed10;Speed+) /移动速度 for(line=0;line16;line+) in_data(); /调整移动数据 rxd_data(); scan(line); STCP=1;/锁存 STCP=0; OE=0;/打开屏使能端 DelayMs(); /延时,等待一问奔洌谜饬邢允镜哪谌菰谌搜勰诓笆泳踉萘簟毕窒蟆?/ Move+; /移动一步

14、 Move=0; zimuo=zimuo+32; zimuo=0; while(1) /重复(无限)循环显示 if(resget=0) DelayMs(); if(resget=0) Set1302(starts_time); /初始化 W1302(0x8e,0x00); /控制命令,WP=0,写操作 W1302(0x90,0xa5); /打开充电二级管 一个二级管串联一个2K电阻 du1302(); /读取 秒 分 时 日 月 星期 年 if (nn=1) /调用温湿度读取子程序 RH(); /读取温湿度 zimuo=0; if (key_moda=0) /设置和选择项目键 DelayMs(

15、); if(key_moda=0) if(id+=10) id=0; h=0;msec=0; /清闪烁标志 while(key_moda=0) Show_word(); if(id!=0) if (key_up=0) /增加 DelayMs(); if(key_up=0) while(key_up=0)Show_word(); /调用显示 h=0;msec=0; /清闪烁标志 Set(id,0); /调用时间调调整 if (key_Down=0) /减少 DelayMs(); if(key_Down=0) while(key_Down=0) Show_word(); /调用显示 h=0;mse

16、c=0; /清闪烁标志 Set(id,1); /调用时间调调整 else if (key_up=0) /增加 DelayMs(); if(key_up=0) while(key_up=0)Show_word(); /调用显示 h=0;msec=0; /清闪烁标志 if(b!=0) /手动调整显示的内容 if(f+=5) /f为显示转换标志 f=0; Show_word(); /待机显示按三秒间隔分别显示年、月日、星期、时分秒. /*/void Show_word() /串行输出显示 uchar h; for(h=0;h16;h+) if((id=0)&(f=0)|(id=1)/f为三秒转换显示

17、 Send_data(timer00); /不显示 if((Flicker=1)&(id=1) /闪烁标志为1时不亮,为零时亮 Show_pass(); /不显示一个字 Show_pass(); else Send_data(timer2h); /20年 Send_data(timer0h); Send_data(timerYear/16h); /年值 Send_data(timerYear%16h); Send_data(hanzih2+641); /年字符 Send_data(hanzih2+640); Send_data(timer00); /不显示 if(id=0)(f=1)(id=2

18、)(id=3) if((Flicker=1)(id=2)/闪烁标志为1时不亮,为零时亮 Show_pass(); /不显示一个字 else if(Month/161) Send_data1(timer00); /月十位为零时不显示 else Send_data1(timerMonth/16h); /月值 Send_data1(timerMonth%16h); Send_data1(hanzih2+673); /月字符 Send_data1(hanzih*2+672); if((Flicker=1)(id=3) /闪烁标志为1时不亮,为零时亮 Show_pass(); /不显示一个字 else

19、Send_data1(timerDay/16h); /日值 Send_data1(timerDay16h); Send_data1(hanzih*2+961); /日字符 Send_data1(hanzih2+960); if((id=0)&(f=2)|(id=4)) /f为三秒转换显示 Send_data2(timer00); /不显示 Send_data2(hanzih*2+705); /星字符 Send_data2(hanzih2+704); Send_data2(hanzih2+737); /期字符 Send_data2(hanzih*2+736); if((Flicker=1)&(i

20、d=4) /闪烁标志为1时不亮,为零时亮 Show_pass(); /不显示一个字 else Send_data2(hanziWeek1632+h*2+737); /星期值 Send_data2(hanziWeek%1632+h*2+736); Send_data(timer00); /不显示 if((id=0)(f=3)(id4)) /f为三秒转换显示 if(Flicker=1)(id=5) /闪烁标志为1时不亮,为零时亮 Show_pass(); /不显示一个字 else if(Hour/167) /id大于7时为对显示转换模式设置 if(Flicker=1)&(id=8)) Show_p

21、ass(); Show_pass(); Show_pass(); Show_pass();else if(b=0) Send_data(hanzih2+993); /显示汉字 “自 Send_data(hanzih2+992); Send_data(hanzih2+1057); /显示汉字“动” Send_data(hanzih2+1056); Send_data(hanzih*2+1089); /显示汉字“模” Send_data(hanzih2+1088); Send_data(hanzih*2+1121); /显示汉字“式 Send_data(hanzih2+1120); else Se

22、nd_data1(hanzih*2+1025); /显示汉字“手 Send_data1(hanzih2+1024); Send_data1(hanzih2+1057); /显示汉字“动” Send_data1(hanzih2+1056); Send_data1(hanzih*2+1089); /显示汉字“模 Send_data1(hanzih*2+1088); Send_data1(hanzih*2+1121); /显示汉字“式” Send_data1(hanzih2+1120); if(id=9) if(b=1) /手动模式 id=0;f=0; else Send_data(hanzih*2

23、+993); /显示汉字“自” Send_data(hanzih2+992); Send_data(hanzih*2+1057); /显示汉字“动 Send_data(hanzih2+1056); if(Flicker=1) Show_pass(); else Send_data(timera/10h); /转换时间 Send_data(timera%10h); Send_data(hanzih2+1153); /显示汉字“秒” Send_data(hanzih*2+1152); scan(h); /输出行信号 STCP=1;STCP=0; OE=0; /锁存为高,595锁存信号 DelayM

24、s(); /延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。/ /*/void timer_0(void) interrupt 3 /中断入口,闪烁TH1 = 0x92;/18。432M 18.2ms TL1 = 0x0CD; zz=1;TR1=0; /temp=255temp;/return temp; void timer_1(void) interrupt 1 /中断入口,闪烁 TH0=0xC5; /15ms定时 晶振12M TL0=0x68; if(msec+=120) /1000ms msec=0; if(mm+=3) nn=1;/mm=0; x+; if(x=a)

25、 x=0; if(b=0) /自动模式 if(f+=5) f=0; /f显示转换计数器 ,d为用户设置的自动转换时间的值。 if(h+=4) /5秒后进入正常走时. id=0;h=0; if(msec=0;s-) /i为向后先择字节计数器,zimuoo为向后先字计数器 BUFF2s+1=hanzizimuo+32s+2*line; /把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中 BUFF2*s=hanzizimuo+1+32s+2*line; /把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中/*发送移动的数据*/void r

26、xd_data(void) /串行发送数据 uchar s; uchar inc,tempyid,temp,k; if(Move8) inc=0; else inc=1; for(s=0+inc;s8+inc;s+) /发送8字节数据 if(Movetempyid)|(BUFFs+1(8tempyid));/h1左移tempyid位后和h2右移8tempyid相或,取出移位后的数据. temp=255temp; SDA_G=1; for(k=0;k1; /字节移位 准备送下一位 SHCP=1; /*/void Send_data(unsigned char d) /*发送红色数据*/uchar

27、 temp,k;temp=d;for(k=0;k8;k+)/一个字节8位 发送给595SHCP=0; /上升沿移位595 SDA_R=(bit)(temp0x01);/通过IO口送一个位给 595 发送最低位SDA_G=1;temp=temp1; /字节移位 准备送下一位 SHCP=1;/*/void Send_data1(unsigned char d)/*发送绿色数据*/uchar temp,k;temp=d;for(k=0;k8;k+)/一个字节8位 发送给595SHCP=0; /上升沿移位595 SDA_G=(bit)(temp&0x01);/通过IO口送一个位给 595 发送最低位S

28、DA_R=1;temp=temp1; /字节移位 准备送下一位 SHCP=1;/*/void Send_data2(unsigned char d)/发送黄色数据/uchar temp,k;temp=d;for(k=0;k1; /字节移位 准备送下一位 SHCP=1;/*/根据选择调整相应项目void Set(uchar sel,uchar sel_1) uchar address,time; uchar max,min; if(sel=9) address=0xc2; max=20;min=1; /自动转换时间时最大为20秒。 if(sel=8) address=0xc0; max=1;mi

29、n=0; /显示自动转换或手动转换.为零自动,为1手动。 if(sel=7) address=0x80; max=59;min=0; /秒 if(sel=6) address=0x82; max=59;min=0; /分钟 if(sel=5) address=0x84; max=23;min=0; /小时 if(sel=4) address=0x8a; max=7; min=1; /星期 if(sel=3) address=0x86; max=31;min=1; /日 if(sel=2) address=0x88; max=12;min=1; /月 if(sel=1) address=0x8c; max=99;min=0; /年 time=R1302(address+1)/1610+R1302(address+1)%16; if (sel_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论