16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx

上传人:b****5 文档编号:11850193 上传时间:2023-04-06 格式:DOCX 页数:45 大小:26.67KB
下载 相关 举报
16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx_第1页
第1页 / 共45页
16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx_第2页
第2页 / 共45页
16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx_第3页
第3页 / 共45页
16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx_第4页
第4页 / 共45页
16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx

《16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx》由会员分享,可在线阅读,更多相关《16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx(45页珍藏版)》请在冰豆网上搜索。

16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20 C 程序.docx

16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20C程序

/***************************************************************

16X64双色点阵4字LED点阵屏DS1302万年历电子钟温度显示DS18B20C程序

/***************************************************************

单片机:

STC89C52或者其他型号都可以

晶振30M如果换用其他晶振DS18B20延时函数需修改见voiddelay_18B20(unsignedinti)说明

功能简介:

上电移动一下广告,然后进入时间显示

切换显示时间星期月日年温度

4个按键分别进行调时设置

切换间隔时间可设置

/*

点阵屏管脚定义

SHCPGND

STCPGND

R1GND

G1GND

OEGND

AGND

BGND

CD

*/

/*接口说明*/

//ABCD是138行扫描信号

//SHCP是595的移位信号

//STCP是595的锁存信号

//OE是屏的使能端可以控制亮度

//R是红色信号线

//G是绿色信号线

/********************************************************

DS1302接线图

Vcc2CLKI/O/RST

||||

-------------------

|8765|

|DS1302|

||

|1234|

-------------------

||||

VCC1GND

1脚接+5V2,3脚32768HZ晶振4脚接地5脚接S51的P026脚接S51的P017接S51的P00

8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容

电压在2.5V以上即可维持

595连级输出数据,138行驱动。

*/

#include"NEW_8051.H"

#defineucharunsignedchar

#defineuintunsignedint

#definelight3//定义亮度

ucharcodehanzi[];//汉字字模

ucharcodeshengri[];//生日字模

ucharcodetimer[14][16];//0~9数字

ucharcodesw[];//138驱动数据

ucharU8FLAG;

bitzz=0,rr=0;

ucharFLAG;

ucharucTemp;

ucharU8count,U8temp;

ucharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

ucharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

ucharucComdata;

voidShow_word();//待机显示按三秒间隔分别显示年、月日、星期、时分秒。

voidShow_pass();//不显示一个字

voidSend_data(unsignedchard);/*发送一个字节红色数据*/

voidSend_data1(unsignedchard);/*发送一个字节绿色数据*/

voidSend_data2(unsignedchard);/*发送一个字节黄色色数据*/

/******************************************/

/*按键定义*/

sbitresget=P1^5;//时钟复位

sbitkey_moda=P1^7;//模式转换

sbitkey_up=P4^3;//时钟加

sbitkey_Down=P3^3;//时钟减

/*DS1302数据IO定义*/

sbitT_CLK=P0^7;//DS1302引脚连接

sbitT_IO=P0^6;

sbitT_RST=P0^5;

sbitACC0=ACC^0;//1bit数据存储位

sbitACC7=ACC^7;

/*定义DS18B20IO接口*/

sbitDQ=P3^6;//ds1820data(单总线)请根据实际定义接口

/*****************************点阵接口定义********************************/

sbitSHCP=P2^7;//595的移位信号

sbitSTCP=P4^1;//是595的锁存信号/*如果用的是普通单片机没有P4.1口请改为其他口*/

sbitSDA_R=P2^3;//红数据

sbitSDA_G=P2^5;//绿数据

sbitOE=P0^4;//输出使能

sbitID=P4^0;//行控制线D/*如果用的是普通单片机没有P4.0口请改为其他口*/

sbitIC=P2^0;//行控制线C

sbitIB=P2^1;//行控制线B

sbitIA=P2^2;//行控制线A

/********************************************************************/

#definescan0{IA=0;IB=0;IC=0;ID=0;}

#definescan1{IA=1;IB=0;IC=0;ID=0;}

#definescan2{IA=0;IB=1;IC=0;ID=0;}

#definescan3{IA=1;IB=1;IC=0;ID=0;}

#definescan4{IA=0;IB=0;IC=1;ID=0;}

#definescan5{IA=1;IB=0;IC=1;ID=0;}

#definescan6{IA=0;IB=1;IC=1;ID=0;}

#definescan7{IA=1;IB=1;IC=1;ID=0;}

#definescan8{IA=0;IB=0;IC=0;ID=1;}

#definescan9{IA=1;IB=0;IC=0;ID=1;}

#definescan10{IA=0;IB=1;IC=0;ID=1;}

#definescan11{IA=1;IB=1;IC=0;ID=1;}

#definescan12{IA=0;IB=0;IC=1;ID=1;}

#definescan13{IA=1;IB=0;IC=1;ID=1;}

#definescan14{IA=0;IB=1;IC=1;ID=1;}

#definescan15{IA=1;IB=1;IC=1;ID=1;}

//秒分时日月星期年所以初始化时间是12年-12月07日-星期2-22点10分0秒

ucharstarts_time[7]={0x00,0x10,0x22,0x07,0x12,0x02,0x12};//初始化后设置

ucharidataMove,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week;//时间温度变量

uchara,b,f,h,msec,id,x;//标志计数器a为自动转换显示时间,b为手动与自动标志

uintzimuo;//字模计数器

ucharBUFF[10];//缓存

voidRTInputByte(uchar);//*输入1Byte*/

ucharRTOutputByte(void);//*输出1Byte*/

voidW1302(uchar,uchar);//向DS1302写入一个字节

ucharR1302(uchar);//从DS1302读出一个字节

voidSet1302(uchar*);//写DS1302时间

voiddu1302();//读时间

voidDelayMs(void);//延时

voidSet(uchar,uchar);//变量调整

voidin_data();//调整移动数据

voidrxd_data();//串口发送移动数据

read_temp();//*读取温度值并转换*/

voidRH(void);

ucharnn=0,mm=0;

/*****不影响其他端口的扫描*************************/

voidscan(unsignedcharValue)

{switch(Value)

{case0:

scan0;break;

case1:

scan1;break;

case2:

scan2;break;

case3:

scan3;break;

case4:

scan4;break;

case5:

scan5;break;

case6:

scan6;break;

case7:

scan7;break;

case8:

scan8;break;

case9:

scan9;break;

case10:

scan10;break;

case11:

scan11;break;

case12:

scan12;break;

case13:

scan13;break;

case14:

scan14;break;

case15:

scan15;break;

default:

break;

}

}

/*******************************************/

voidSendOneByte(unsignedcharc)

{

SBUF=c;

while(!

TI);

TI=0;

}

/**************************************************/

/*主函数*/

voidmain()

{

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;//0xfb:

30MHz,12T,SMOD=0,9600bps

AUXR|=0x11;

SendOneByte(0X55);

while(zimuo<512)//上电显示一段广告

{

while(Move<16)//数据移位。

{

for(Speed=0;Speed<10;Speed++)//移动速度

{

for(line=0;line<16;line++)

{

in_data();//调整移动数据

rxd_data();

scan(line);

STCP=1;//锁存

STCP=0;

OE=0;//打开屏使能端

DelayMs();//延时,等待一问奔洌谜饬邢允镜哪谌菰谌搜勰诓笆泳踉萘簟毕窒蟆?

/

}

}

Move++;//移动一步

}

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();

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;msec=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();//待机显示按三秒间隔分别显示年、月日、星期、时分秒。

}

}

/************************************************/

voidShow_word()//串行输出显示

{ucharh;

for(h=0;h<16;h++)

{

if((id==0)&(f==0)|(id==1))//f为三秒转换显示

{

Send_data(timer[0][0]);//不显示

if((Flicker==1)&(id==1))//闪烁标志为1时不亮,为零时亮

{Show_pass();//不显示一个字

Show_pass();

}

else

{

Send_data(timer[2][h]);//20年

Send_data(timer[0][h]);

Send_data(timer[Year/16][h]);//年值

Send_data(timer[Year%16][h]);

}

Send_data(hanzi[h*2+641]);//年字符

Send_data(hanzi[h*2+640]);

Send_data(timer[0][0]);//不显示

}

if((id==0)&(f==1)|(id==2)|(id==3))

{

if((Flicker==1)&(id==2))//闪烁标志为1时不亮,为零时亮

{Show_pass();//不显示一个字

}

else

{

if(Month/16<1)

Send_data1(timer[0][0]);//月十位为零时不显示

else

Send_data1(timer[Month/16][h]);//月值

Send_data1(timer[Month%16][h]);

}

Send_data1(hanzi[h*2+673]);//月字符

Send_data1(hanzi[h*2+672]);

if((Flicker==1)&(id==3))//闪烁标志为1时不亮,为零时亮

{Show_pass();//不显示一个字

}

else

{

Send_data1(timer[Day/16][h]);//日值

Send_data1(timer[Day%16][h]);

}

Send_data1(hanzi[h*2+961]);//日字符

Send_data1(hanzi[h*2+960]);

}

if((id==0)&(f==2)|(id==4))//f为三秒转换显示

{

Send_data2(timer[0][0]);//不显示

Send_data2(hanzi[h*2+705]);//星字符

Send_data2(hanzi[h*2+704]);

Send_data2(hanzi[h*2+737]);//期字符

Send_data2(hanzi[h*2+736]);

if((Flicker==1)&(id==4))//闪烁标志为1时不亮,为零时亮

{Show_pass();//不显示一个字

}

else

{

Send_data2(hanzi[Week%16*32+h*2+737]);//星期值

Send_data2(hanzi[Week%16*32+h*2+736]);

}

Send_data(timer[0][0]);//不显示

}

if((id==0)&(f==3)|(id>4))//f为三秒转换显示

{

if((Flicker==1)&(id==5))//闪烁标志为1时不亮,为零时亮

{

Show_pass();//不显示一个字

}

else

{

if(Hour/16<1)

Send_data(timer[0][0]);//时十位小于1时不显示

else

Send_data(timer[Hour/16][h]);//时值

Send_data(timer[Hour%16][h]);

}

Send_data(timer[10][h]);//两个点

if((Flicker==1)&(id==6))//闪烁标志为1时不亮,为零时亮

{

Show_pass();//不显示一个字

}

else

{

Send_data(timer[Cent/16][h]);

Send_data(timer[Cent%16][h]);//分值

}

Send_data(timer[10][h]);//两个点

if((Flicker==1)&(id==7))//闪烁标志为1时不亮,为零时亮

{

Show_pass();//不显示一个字

}

else

{

Send_data(timer[Sec/16][h]);//秒

Send_data(timer[Sec%16][h]);

}

}

if((id==0)&(f==4))//f为三秒转换显示

{

Send_data1(hanzi[h*2+1185]);//温字符

Send_data1(hanzi[h*2+1184]);

Send_data1(hanzi[h*2+1217]);//度字符

Send_data1(hanzi[h*2+1216]);

Send_data1(timer[10][h]);//两个点

if(U8T_data_H/10==0x00)

Send_data(timer[0][0]);

else

Send_data1(timer[U8T_data_H/10][h]);//温度值的十位值

Send_data1(timer[U8T_data_H%10][h]);//温度值的个位

Send_data1(timer[11][h]);//温度值的符号

}

if((id==0)&(f==5))//f为三秒转换显示

{

Send_data(hanzi[h*2+1249]);//湿字符

Send_data(hanzi[h*2+1248]);

Send_data(hanzi[h*2+1217]);//度字符

Send_data(hanzi[h*2+1216]);

Send_data(timer[10][h]);//两个点

Send_data(timer[U8RH_data_H/10][h]);//湿度值的十位值

Send_data(timer[U8RH_data_H%10][h]);//湿度值的个位

Send_data(timer[13][h]);//湿度值的符号

}

if(id>7)//id大于7时为对显示转换模式设置

{if((Flicker==1)&(id==8))

{Show_pass();

Show_pass();

Show_pass();

Show_pass();

}

elseif(b==0)

{

Send_data(hanzi[h*2+993]);//显示汉字“自”

Send_data(hanzi[h*2+992]);

Send_data(hanzi[h*2+1057]);//显示汉字“动”

Send_data(hanzi[h*2+1056]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1