您的位置 首页 应用

51单片机+1602液晶万年历程序

详细的制作教程下载:http:www51heicombbsdpj-20625-1html*制作人:伍浩荣报时:7:00-24:00(加灯光)之后的只有灯光提

具体的制造教程下载:http://www.51hei.com/bbs/dpj-20625-1.html
/*
制造人:伍浩荣
报时:7:00-24:00(加灯火) 之后的只要灯火提示
两个led灯在左右两头(紫,黄)
参加节日提示功用和温度提示功用
按键在后面 ,背光操控键在旁边面
一起按下加减键初始化时刻(先加后减)。
阴历显现(其他:Have a good day!)
晚安:正午 早上 提示
百度空间:http://hi.baidu.com/haorongwu/home
*/
#include
#include “intrins.h”
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,keynum,temp,flagtime,ledcount,count,alarmflag,flagT/*时刻分段标志*/,year1,month1,day1,lednum;
uintflag;//取温度

bitc_moon;
data uchar year_moon,month_moon,day_moon;

#define h1 0x80 //LCD榜首行的初始化方位
#define h2 0x80+0x40 //LCD第二行初始化方位
sbit Gled=P1^6;//界说粉色led灯的管脚
sbit Yled=P3^7;//界说黄色led灯的管脚

//界说1602相关管脚
sbit rs=P2^7;
sbit en=P2^5;
sbit rw=P2^6;
//sbit led=P2^3;/*操控背光:15脚(串联10欧电阻)背光源正极*/
//sbit busy=P0^7;//测忙线
//DS1302芯片的管脚界说
sbit IO=P2^2;
sbit SCLK=P2^1;
sbit RST=P2^3;

sbit DQ=P2^0;/*界说DS18b20管脚*/

sbit ACC0=ACC^0;//设置累加器
sbit ACC7=ACC^7;

//按键
sbit key1=P3^0;//设置按键
sbit key2=P3^4;
sbit key3=P3^6;
sbit beep=P1^7;//蜂鸣器,用于报时

sbit lcdbusy=P0^7;

void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
void testbusy()//测忙函数
{
P0=0xff;//留意是P0组
rs=0;
rw=1;
en=1;
while(lcdbusy);//等候不忙
en=0;
}
void writecom(uchar com)//写入指令函数
{
testbusy();
P0=com;
rs=0;
rw=0;
en=1;
en=0;
}
void writedata(uchar dat)//写入数据函数
{
testbusy();//先测忙
P0=dat;
rs=1;
rw=0;
en=1;
en=0;
}
void print(uchar a3,uchar *str)//写字符串函数(没有延时)
{
writecom(a3|0x80);
while(*str!=)
{
//delay(100);//延时一下
writedata(*str++);
}
*str=0;
}
void print2(uchar a2,uchar *str)//用于头字条的显现延时
{
writecom(a2|0x80);
while(*str!=)
{
delay(130);//延时一下
writedata(*str++);
}
*str=0;
}
void lcdinit()//1602初始化函数
{
writecom(0x38);//设置为两行显现,8位显现
writecom(0x0c);//开显现,不显现光标
writecom(0x06);//光标右移
writecom(0x01);//清零
print2(0x80,”^_^ @_@ U_U -_-“);//榜首行显现制造者
print2(0x40,”Enjoy Your Life!”);//第二行显现制造人
delay(3000);// 延时3秒
//writecom(0x01);//再次清零
//writecom(h1);//榜首行榜首个字开端写入
}
/*和DS1302时钟芯片有关的函数*/

void write_byte(uchar dat)//写一个字节函数
{
ACC=dat;
RST=1;
for(a=8;a>0;a–)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//读一个字节函数
{
RST=1;
for(a=8;a>0;a–)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
void write_1302(uchar add,uchar dat)//向时钟芯片写入函数,指定地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//从芯片读出数据,指定地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar turnBCD(uchar bcd)//BCD码转化为十进制函数
{
uchar shijin;
shijin=bcd>>4;
return(shijin=shijin*10+(bcd&=0x0f));//回来十进制数
}
voidds1302_init()//1302时钟芯片初始化函数
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);//答应写
/*write_1302(0x80,0x00);//秒:00
write_1302(0x82,0x00);//分:00
write_1302(0x84,0x12);//时:12
write_1302(0x8a,0x04);//周:4
write_1302(0x86,0x15);//日:15
write_1302(0x88,0x03);//月:3
write_1302(0x8c,0x11);//年:11*/
write_1302(0x8e,0x80);//翻开维护
}
/*以下是温度芯片DS18b20的相关函数*/
void delay2(uint s)//延时,用于温度程序部分
{
while(s–);//区别i,用s表明
}
void Init_DS18B20(void)//初始化DS18b20
{
uchar W=0;//留意是w
DQ=1;
delay2(8);
DQ=0;//拉低
delay2(29);//延时大于480us(此处延时时刻不确定,实践时修正)
DQ=1;//拉高
delay2(3);//(时刻不确定)
W=DQ;//稍作延时后如W=0则初始化成功
delay2(20);
}
uchar ReadOneChar(void)//DS18b20读一个字节函数
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i–)
{
DQ=0;//给脉冲信号
dat>>=1;//右移一位
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay2(4);
}
return(dat);
}
void WriteOneChar(uchar dat)//写一个字节函数
{
uchar i=0;
for(i=8;i>0;i–)
{
DQ=0;
DQ=dat&0x01;
delay2(5);
DQ=1;
dat>>=1;
}
}
uint ReadTemperature(void)//读取温度
{
uchar a1=0;//用于兼并
uchar b1=0;
uint t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//越过读取序列号的操作
WriteOneChar(0x44);//发动温度转化
Init_DS18B20();//再次初始化
WriteOneChar(0xCC);//越过读取序列号
WriteOneChar(0xBE);//读取温度寄存器
a1=ReadOneChar();//先读取低位
b1=ReadOneChar();//后读取高位
t=b1;
t<<=8;
t=t|a1;
tt=t*0.0625;
t=tt*10+0.5;//扩大10倍并四舍五入
return(t);
}

/*下面是相关数据的显现函数*/
//温度显现函数
void writetemp(uchar add,uint dat)//写入温度值函数指定方位
{
uchar gw,sw,xw;//个位,十位,小数位(留意得到为三位有用数)
gw=dat%100/10;/*特别留意此处*/
sw=dat/100;
xw=dat%10;
writecom(h2+add);//h2为头文件规则的值0x80+0x40
writedata(0x30+sw);//数字+30得到显现码
writedata(0x30+gw);//个位数
writedata(0x2e);//小数点
writedata(0x30+xw);//小数位
writedata(0xdf);//显现“°”(度)
//writedata(0x43);//显现“C”符号,为液晶字符的地址码(考虑是否要)
}
//时分秒显现函数
void writetime(uchar add,uchar dat)//写入时分秒
{
uchar gw,sw;
gw=dat%10;//获得个位数
sw=dat/10;//获得十位数
writecom(h2+add);//第二行显现
writedata(0x30+sw);//显现该数字
writedata(0x30+gw);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/318231.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部