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万年历电子钟温度显示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]