51单片机+1602液晶万年历程序
详细的制作教程下载: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);
}
51单片机1602液晶万年 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)