宠物定时喂食器设计论文程序_第1页
宠物定时喂食器设计论文程序_第2页
宠物定时喂食器设计论文程序_第3页
宠物定时喂食器设计论文程序_第4页
宠物定时喂食器设计论文程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、论文程序#include <reg52.h>#include <intrins.h> include ”lcd12864.h” include ”ds1302.hn include "ds18b20.h" #include "nongli.h”include "displaytime.h” #include zk.h" include nbell.hn include hw.h"#include "delay.h"#include "main_moto.h" #defin

2、e uint unsigned int #define uchar unsigned char/*定义按键*/sbitkl =poao;/k1-设罝sbit k2 =p0al;/k2-确认、返回sbit k3 = p0a2; /k3-加sbit k4 二 p0a3;/k4-减/k5=p1a4,k5-控制闹钟的打幵与关闭,在hw.h"屮定义/sbitjl = p0a6;sbit j2 = po 八 7;/*函数声明*/void ds_wo(void);void ds_w(void);void conver_week(bit c,uchar year,uchar month,uchar

3、day);/*定义全局变量-*/bit w=0;/调时标志位uchar into_flag=o;uint into_flag_l=o;unsigned charyy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontempl,moontemp2;/定义时间映射全局变量(专用寄存器)signed char address,item,iterno,max,mini;unsigned char clk_ala2=0x00,0x00;/闹钟数据存放初,始值为 00:00 unsigned char hour,minute,tim

4、e;/用 丁 闹铃白设置 void main_moto(void);/*日期、时间设置函数*/void tiaozheng(void)yy = read_clock(0x8d);/调用1302时钟数据中的年数据,从地址0x8d中 mo = read_clock(0x89);/调用1302时钟数据中的刀数据,从地址0x89中 dd = read_clock(0x87);/从1302芯片中读取日数据,从地址0x87中 week = read_clock(0x8b);/从1302芯片中读取星期数据,从地址0x8b中/lcm_w_test(0,0x80); lcm_w_word(20n);/显示内容字

5、符 20 lcm_w_test( 1,(yy/l 6)+0x30);/函数参数1,代表本行写数据,yy/16+0x30得出年十位数字的显示码地址,送 显示lcm_w_test( 1 ,yy% 16+0x30);/函数 icm_w_word(n年”);/lcm_w_test( 1 ,(mo/l 6)+0x30); lcm_w_test( 1 ,mo%l 6+0x30);/与数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显 示lcm_w_word("月);/调用字_符显示函数,显示文字月 /*lcm_w_test(o,ox88);/第一个参0,表示木行写入lcm的是指令,指

6、定显示位置88h (第三行左端) lcm_w_word("星期*);/调用字_符显示函数,显示文字星期lcm_w_test( 1,mo% 16+0x30);与16故秦数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示*/lcm_w_test(l,(dd/16)+0x30); lcm_w_test( 1 ,dd% 16+0x30);/第一个1参数,表示本行写数据,r数据与16取余得个位数,加0x30得到显 示码lcm_w_word(日 );/显示字符日/if(read_clock(0x85) != hh)/如程序中的小吋与1302芯片中的不同,hh = read_cloc

7、k(0x85);/刷新程序屮的小时数据lcm_w_test(0,0x91);/第一个参& 0,表示本行写入lcm的是指令,指定显示位置88h (第三行左端) lcm_w_test( 1,(hh/l 6)+0x30);/显示十位 lcm_w_test(l ,hh% 16+0x30);/显示个位 lcm_w_word(” 时n);/if(read_clock(0x83) != mm)/如f 1302芯片中的分钟数据与程序中的分钟变量不相等 mm = read_clock(ox83);/则新程序屮的分钟数据lcm_w_test( 1 ,(mm/l6)+0x30);/向液品写数据,显示分钟的十

8、位数 lcm_w_test( 1 ,mm%l 6+0x30);/向液晶写数据,显示分钟的个位数 lcm_w_word("分/if(read_clock(0x81) != ss)/如果1302"芯片中的分钟数据与程序中的秒钟变量不相等(0x81为读秒数据0x80 为写秒数据)ss = read_clock(0x81);/刷新程序中的秒钟数据lcm_w_test(l,(ss/16)+0x30);/向液晶写数据,显示分钟的十位数 lcm_w_test(l,ss%16+0x30);/向液晶写数据,显示分钟的个位数 lcm_w_word("秒);/=显示闹钟的设置时间=ho

9、ur=clk_ala0; /取出上一次的闹钟小时值 minute=clk_alal; /取出上一次的闹钟分钟值lcm_w_test(0,0x88);lcm_w_word( 闹钟/lcm_w_test( 1,(hour/10)+0x30);/显示小时十位 lcm_w_test( 1,(hour% 10)+0x30);/显示小时个位 /lcm_w_word(n:n);/lcm_w_test( 1,(minute/l 0)+0x30);/显示分钟的十位 lcm_w_test( 1,(minute% 10)+0x30);/显示分钟的个位 /lcm_w_word("");hihhhi

10、hiihhiiiiiihiiiihiiiiihihhiiiiiiiihihhhhiiihiiiii/被调数据加一或减一,并检查数据范围,写入1302指定地址保存void ds_w(void)itemo=time;item=(read_clock(address+1)/16)*10 + (read一clock(address+1 )%16; /川寸间的调整if(k3 = 0|key_add=l)/如果按动上调键 item+;/数加 1if(k4 = 0|key_minish=l)/如果按动下调键 item-;/数减 1if(item>max) item=mini;/查看数值是否在有效范围之

11、内 if(item<mini) item=max;/如果数值小于最小值,则自动等于最大值 write_clock(0x8e,0x00);/允许写 1302 芯片操作write_clock(address,(item/10)*16+item%10);/转换成 16 进制写入 1302 write_clock(0x8e,0x80);/写保护,禁止写操作f 鼇p觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝觚j麝f/ rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw

12、 rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw rjw /= i闹钟时间的加减设置=void ds_w0(void)itemo=time;if(k3 = 0|key_add=l)/如果按动上调键 item0+;/数加 1 if(k4 = 0|ke

13、y_minish=l)/如果按动下调键 itemo-;/数减 1 if(itemomax) itemo=mini;/查看数值是否在有效范围之内 if(itemo<mini)itemo=max;/如果数值小于最小值,则自动等于最大值 time=itemo;/调整后的时间重新赋值给time(time为hour或minute),这步很重要,没有将无法 更新闹钟数据f/1 <1 %i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,/调整吋间子函数,设置键、数据范围、上调加一,下调减一功能。void set_time(unsigned char sel)/根据i择调

14、整的相应项目加1并写入ds1302,函数参数是按动设罝键的次数write_com(0x30); write_com(0x06);lcm_w_test(0,0x98);/第一参数0表示本行写入指令,指定i面行的调整显示起始位置为9ah lcm_w_word(调整<«<n);/调用字_符显示函数,显示调整字样/* if(sel=8) lcm_w_word(n星期");address=0x8a; max=7;mini=l; tiaozhengo; ds_w(); tiaozhengo;lcm_ w_tes t(0,0x9c);if(sel=7) lcm_w_word(

15、'闹钟分); time=minute;max=59;mini=0; tiaozheng();/显示调整前的内容 ds_wo();/设置闹钟clk_alall=time;/把更新后的分钟数据重新保存 tiaozhengo;/显示调整后的内容/按动8次显示调整闹钟的分钟部分if(sel=6) lcm_w_word(”闹钟时);time=hour; max=23;mini=0; tiaozhengo; ds 一 w0();clk_alao=time;/把更新后的小时数据重新保存 tiaozhengo;/按动7次显示调整闹钟的小时部分if(sel=5) lcm_w_word("秒钟n

16、);address=0x80; max=59;mini=0; tiaozhengo; /调用日期、时间调整函数 ds_w();/被调数据加一或减一函数tiaozhengo; /秒6,按动6次显75调整秒钟/并指定秒钟数据写入1302芯片的写入地址是0x80,秒钟数据的最大值 是59,最小值是0if(sel=4) lcm_w_word(分钟”);address=0x82; max=59;mini=0;tiaozhengo;ds_w();tiaozhengo; /分钟5,按动5次显示调整分钟/并指定分钟数据写入1302芯片的地址是0x82,分钟数据的最大值是59,最小值是0if(sel=3) lc

17、m_w_word("小时");address=0x84; max=23;mini=0;tiaozhengo;ds_w();tiaozhengo;/小时4,按动4次显示调整小时/规定小时数据写入1302芯片的位置是0x84,小时数据最大值23,最小值是0if(sel=2) lcm_w_word(. h 期 ”);address=0x86;mo = read_clock(ox89);/读月数据 moontemp 1 =mo/16; moontemp2=mo% 16;mo=moontempp 10+moontemp2;/转换成 10 进制71 份数据yy = read_clock

18、(0x8d);/读年数据 moontemp 1 =yy/16; moontemp2=yy% 16;yy=moontempp10+moontemp2;/转换成 10 进制年份数据if(mo=2&&yy%4!=0)max=28;mini=l;/平年 2 月 28 天 if(mo=2&&yy%4=0)max=29;mini=l;/闰年 2 月 29 天if(mo=l |mo=3|mo=5|mo=7|mo=8|mo=l 0|mo= 12) max=31 ;mini= 1; /31天的月份if(mo=4|mo=6|mo=9|mo=ll)max=30;mini=l;/30

19、天的月份tiaozheng();ds_w();tiaozhengo; /调用口期、时间调整函数 /日3,按动3次显示调整曰期/规定日期数据写入1302的位置地址是0x86,日期最大值31,最小值是1if(sel= 1)lcm_w_word("j份");address=0x88; max= 12;mini=l;tiaozhengo; ds_w(); tiaozhengo;/月2,按动2次显示调整月份/规定月份写入1302的位置地址是0x88,月份最大值12,最小值1if(sel=o) lcm_w_word(”年份");address=0x8c; max=99; mi

20、ni=0; tiaozhengo;ds_w();/被调数据加一或减一函数tiaozheng(); /调用闩期、时间调整函数/年1,按动1次显示调整年份,/规定年份写入1302的地址是0x8c,年份的最大值99,最小值0/ fj|y 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 叫丨 i jry | i 1 hf、| 矛不/* void into(void) interrupt 0if(!jl)jl=l;/elsej 1=0;/*/fkj kj kj kj kj kj

21、 kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj kj/<y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> &l

22、t;y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y> <y>氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺jjr氺氺氺氺氺氺氺氺氺氺氺氺氺氺

23、氺氺,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、,:、氺/ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£

24、k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£ k£>/fj* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* j* 7*/ void main()u

25、nsigned char e=0,f二0,tmp,i; j2=0; /jl =/ 、ie = 0x81;/允许总中断中断,使能into外部屮断tcon = 0x01; /触发方式为脉冲负边沿触发 irin=1;/io 口 初始化beep=1;k1=1;k2=1;k3=1;k4=1;/中断初始化it0=l;ex0=l;ea=1;init_ 1302();"时钟芯片初始化lcm_init();/液品初始化welcome0(); /调用欢迎信息1delaym(2000);/延时/welcome();delaym(1000); /调用欢迎信息 2 lcm_clr();"清屏clea

26、n12864_gdram(); /清屏/ for(“) while(l) while(l) while(l)if(into_flag=l) into_flag=o;main_moto();if(k5=0|key_alarm=l)/闹钟的开与关的设置标志位 delaym(20);if(k5=0|key_alarm= 1) beep();while(!k5);/松手检测key_alarm=o;ala_flag=ala_flag;while(!k5);/松手检测 key alarm=0;if (w = 0)/正常走时displaydate(); /显示円期 displaynl(); /显示农历 di

27、splay time();/显示时间read_temp(); /读取温度 dsl 820disp();/显示温度displayxq(); /显示星期/!=以下是闹钟的相关处理=if(ala_fl ag= 1) / 闹钟标志位set 1616pic(6,1,0,2); /显示”闹钟图标"elseset 1616pic(6,l,0,3); /关闭闹钟图标显示/tmp=read_clock(0x85);/取岀 1302 小时 i = tmp/16;tmp = tmp&oxof; tmp = tmp + i*10;if(clk_alao=tmp)/与闹钟设定的小时值和同 tmp=re

28、ad_clock(0x83);/取出 1302 分钟i = tmp/16;tmp = tmp&oxof;tmp = tmp + i*10;/ /j2=0;if(clk_alal =tmp)/与闹钟设定的分钟値相同 if(ala_flag=l)/闹钟打开 j2=l;into_flag=l;alarmbeepo;/闹铃声响1分钟后自动关闭,delay m(200);/控制闹钟响的间隔即频率 else beep=1;/关闭蜂鸣器 else beep=1;/关闭蜂鸣器 / into_flag=l;闹钟处理结束=else /=否则点动调时=1按键及红外遥控设罝时间*/if (kl = 0| |k

29、ey_manue= 1)delaym(8);/按键消抖/*当是调时状态本键用于调整下一项*/if(kl = 0 && w = 1 )|(key_manue= 1 &&w= 1)/e+;if (e >= 8 ) e = 0;while(! kl );/等待键松开key_manue=o;set_time(e); beep();"调整/*当是正常状态时就进入调时状态*/if(k1 = 0 && w = 0)|(key_manue=1 &&w=0) /key_manue=o;lcm_clr();clean. 12864_gdram();/清屏w=l;/进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论