杜洋的智能电子钟.docx
《杜洋的智能电子钟.docx》由会员分享,可在线阅读,更多相关《杜洋的智能电子钟.docx(21页珍藏版)》请在冰点文库上搜索。
杜洋的智能电子钟
//---程序说明---//
/*
名字:
main.c
作者:
杜洋(doyoung)
创建日:
2006-11-26
工程:
智能助理电子钟(AI-timer)
*/
//---修改日志---//
/*
*/
//---硬件说明---//
/*
P0.0~0.7NC
P1.0右上角LED-G低电平有效(L)
P1.1右下角LED-GL
P1.2左下角LED-GL
P1.3左上角LED-GL
P1.44个LED-RL
P1.5~1.7ISP下载用~
P2.1LCM-5SID串行数据输入,~
P2.2LCD-6CLK串行时钟,~
P2.3左上角KEY-
P2.4左下角KEY-
P2.5右上角KEY-
P2.6右下角KEY-
P2.7背后LED-BL
P3.0温度单总线~
P3.1BEEPL
P3.2KEY中断-
P3.3DS1302-5RST_低电平复位(L)
P3.4DS1302-6IO~
P3.5DS1302-7SCLK~
P3.624C02-6SCL~
P3.724C02-5SDA~
*/
/****************************************************************************/
//头文件
#include
#include
/*****************************************************************************/
//灯与蜂鸣器定义
sbitled_b=P2^7;
sbitled_r=P1^4;
sbitled_g1=P1^3;
sbitled_g2=P1^2;
sbitled_g3=P1^0;
sbitled_g4=P1^1;
sbitbeep=P3^1;
/*****************************************************************************/
//温度传感器定义
sbitDQ=P3^0;//ds18B20
/*****************************************************************************/
//键盘引脚定义
sbitKEY_1=P2^3;//左上
sbitKEY_2=P2^4;//左下
sbitKEY_3=P2^6;//右上
sbitKEY_4=P2^5;//右下
sbitKEY_I=P3^2;//常0
/****************************************************************************/
//引脚定义
sbitSID=P2^1;//数据
sbitSCLK=P2^2;//时钟
/*****************************************************************************/
//定义DS1302时钟接口
sbitclock_clk=P3^5;//ds1302_clk(时钟线)
sbitclock_dat=P3^4;//ds1302_dat(数据线)
sbitclock_Rst=P3^3;//ds1302_Rst(复位线)
/*****************************************************************************/
//定义累加器A中的各位
sbita0=ACC^0;
sbita1=ACC^1;
sbita2=ACC^2;
sbita3=ACC^3;
sbita4=ACC^4;
sbita5=ACC^5;
sbita6=ACC^6;
sbita7=ACC^7;
/****************************************************************************/
//定义全局变量
unsignedcharyy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bitw=0;//调时标志位
staticunsignedcharmenu=0;//定义静态小时更新用数据变量
staticunsignedcharkeys=0;//定义静态小时更新用数据变量
staticunsignedchartimecount=0;//定义静态软件计数器变量
/****************************************************************************/
voidDelayM(unsignedinta){//延时函数1MS/次
unsignedchari;
while(--a!
=0){
for(i=0;i<125;i++);//一个;表示空语句,CPU空转。
}//i从0加到125,CPU大概就耗时1毫秒
}
/****************************************************************************/
//函数声明
voidlcm_w_word(unsignedchar*str);//写字符例:
lcm_w_word("您好!
");
voidlcm_w_test(bitstart,unsignedcharddata);//(0,指令)(1,数据)
voidlcm_w_byte(unsignedcharbbyte);//写一个字节给lcm
voiddelaynms(unsignedintdi);//延时
voidlcm_init(void);//lcm初始化
voidlcm_clr(void);//清屏
voiddays(viod){//公历节日数据库
lcm_w_test(0,0x80);
lcm_w_word("[Dis][Set]");
lcm_w_test(0,0x98);
//----|----------------|
if(mo==0x01&&dd==0x01){lcm_w_word("HappyNewYear!
!
");}//1月
if(mo==0x01&&dd==0x28){lcm_w_word("世界麻风日");}
if(mo==0x02&&dd==0x02){lcm_w_word("世界湿地日");}//2月
if(mo==0x02&&dd==0x13){lcm_w_word("明天情人节了");}
if(mo==0x02&&dd==0x14){lcm_w_word("今天是情人节");}
if(mo==0x03&&dd==0x01){lcm_w_word("国际海豹日");}//3月
if(mo==0x03&&dd==0x03){lcm_w_word("全国爱耳日");}
if(mo==0x03&&dd==0x08){lcm_w_word("3.8妇女节");}
if(mo==0x03&&dd==0x12){lcm_w_word("植树节");}
if(mo==0x03&&dd==0x14){lcm_w_word("国际警察日");}
if(mo==0x03&&dd==0x15){lcm_w_word("消费者权益日");}
if(mo==0x03&&dd==0x17){lcm_w_word("国际航海日");}
if(mo==0x03&&dd==0x21){lcm_w_word("世界森林日");}
if(mo==0x03&&dd==0x22){lcm_w_word("世界水日");}
if(mo==0x03&&dd==0x23){lcm_w_word("世界气象日");}
if(mo==0x03&&dd==0x24){lcm_w_word("世界防治结核病日");}
if(mo==0x04&&dd==0x01){lcm_w_word("愚人节小心上当");}//4
if(mo==0x04&&dd==0x07){lcm_w_word("世界卫生日");}
if(mo==0x04&&dd==0x08){lcm_w_word("复活节");}
if(mo==0x04&&dd==0x13){lcm_w_word("黑色星期五");}
if(mo==0x05&&dd==0x01){lcm_w_word("劳动节放假");}//5
if(mo==0x05&&dd==0x04){lcm_w_word("青年节");}
if(mo==0x05&&dd==0x08){lcm_w_word("世界红十字日");}
if(mo==0x05&&dd==0x12){lcm_w_word("国际护士节");}
if(mo==0x05&&dd==0x05){lcm_w_word("近日注意母亲节");}
if(mo==0x05&&dd==0x15){lcm_w_word("国际家庭日");}
if(mo==0x05&&dd==0x31){lcm_w_word("世界无烟日");}
if(mo==0x06&&dd==0x01){lcm_w_word("国际儿童节");}//6
if(mo==0x06&&dd==0x05){lcm_w_word("世界环境日");}
if(mo==0x06&&dd==0x26){lcm_w_word("国际禁毒日");}
if(mo==0x06&&dd==0x06){lcm_w_word("全国爱眼日");}
if(mo==0x06&&dd==0x13){lcm_w_word("近日注意父亲节");}
if(mo==0x06&&dd==0x15){lcm_w_word("近日注意父亲节");}
if(mo==0x07&&dd==0x01){lcm_w_word("香港回归记念日");}//7
if(mo==0x07&&dd==0x07){lcm_w_word("抗日战争记念日");}
if(mo==0x07&&dd==0x11){lcm_w_word("世界人口日");}
if(mo==0x08&&dd==0x01){lcm_w_word("八一建军节");}//8
if(mo==0x08&&dd==0x08){lcm_w_word("中国男子节");}
if(mo==0x08&&dd==0x15){lcm_w_word("抗战胜利记念日");}
if(mo==0x09&&dd==0x10){lcm_w_word("中国教师节");}//9
if(mo==0x09&&dd==0x18){lcm_w_word("九·一八事变记念");}
if(mo==0x09&&dd==0x20){lcm_w_word("国际爱牙日");}
if(mo==0x09&&dd==0x27){lcm_w_word("世界旅游日");}
if(mo==0x10&&dd==0x01){lcm_w_word("中国国庆节");}//10
if(mo==0x10&&dd==0x04){lcm_w_word("世界动物日");}
if(mo==0x10&&dd==0x24){lcm_w_word("联合国日");}
if(mo==0x10&&dd==0x12){lcm_w_word("明天国际教师节");}
if(mo==0x10&&dd==0x13){lcm_w_word("国际教师节");}
if(mo==0x11&&dd==0x10){lcm_w_word("世界青年节");}//11
if(mo==0x11&&dd==0x17){lcm_w_word("世界学生节");}
if(mo==0x12&&dd==0x01){lcm_w_word("世界艾滋病日");}//12
if(mo==0x12&&dd==0x23){lcm_w_word("明晚平安夜");}
if(mo==0x12&&dd==0x24){lcm_w_word("今晚平安夜");}
if(mo==0x12&&dd==0x25){lcm_w_word("圣诞快乐");}
if(mo==0x12&&dd==0x31){lcm_w_word("明日新年");}
else{
if(hh>=0x04&&hh<0x06){lcm_w_word("★★__▲▲__凌晨");}
if(hh>=0x06&&hh<0x08){lcm_w_word("☆○__▲△__早晨");}
if(hh>=0x08&&hh<0x12){lcm_w_word("__●__▲▲__上午");}
if(hh==0x12){lcm_w_word("____▲●▲__中午");}
if(hh>=0x13&&hh<0x18){lcm_w_word("__▲▲__●__下午");}
if(hh>=0x18&&hh<0x22){lcm_w_word("△▲__●☆__晚上");}
if(hh>=0x22&&hh<=0x23){lcm_w_word("△▲__★☆__夜里");}
if(hh>=0x00&&hh<0x04){lcm_w_word("__★▲▲★__深夜");}
}
}
/****************************************************************************/
//初始化LCM
voidlcm_init(void){
delaynms(100);//启动等待,等LCM讲入工作状态
lcm_w_test(0,0x30);//8位介面,基本指令集
lcm_w_test(0,0x0c);//显示打开,光标关,反白关
lcm_w_test(0,0x01);//清屏,将DDRAM的地址计数器归零
delaynms(100);//启动等待,等LCM讲入工作状态
}
/******************************************************************************/
//写指令或数据(0,指令)(1,数据)
voidlcm_w_test(bitstart,unsignedcharddata){
unsignedcharstart_data,Hdata,Ldata;
if(start==0)
start_data=0xf8;//0:
写指令
else
start_data=0xfa;//1:
写数据
Hdata=ddata&0xf0;//取高四位
Ldata=(ddata<<4)&0xf0;//取低四位
lcm_w_byte(start_data);//发送起始信号
delaynms(5);//延时是必须的
lcm_w_byte(Hdata);//发送高四位
delaynms(5);//延时是必须的
lcm_w_byte(Ldata);//发送低四位
delaynms(5);//延时是必须的
}
/******************************************************************************/
//发送一个字节(底层函数)
voidlcm_w_byte(unsignedcharbbyte){
unsignedchari;
for(i=0;i<8;i++){
SID=bbyte&0x80;//取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1;//左移
}
}
/******************************************************************************/
//延时(LCM占用)
voiddelaynms(unsignedintdi){
unsignedintda,db;
for(da=0;da="\0"while(*str*str){lcm_w_word(unsigned应用:
lcm_w_word(?
您好!
?
);向LCM发送一个字符串,长度64字符之内。
*****************************************************************************启动等待,等LCM讲入工作状态delaynms(40);lcm_w_test(0,0x01);lcm_clr(void){清屏函数for(db="0;db<10;db++);">0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
voidWriteOneChar(unsignedchardat)//写一个字节
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
/******************************************************************************/
unsignedintReadTemperature(void)//读取温度
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//读低8位
b=ReadOneChar();//读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;//放大10倍输出并四舍五入
return(t);
}
/*****************************************************************************/
//声明
voidlcm_w_ss(void