找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6494|回复: 27
打印 上一主题 下一主题
收起左侧

C51单片机万年历 带pcb工程文件,原理图,源程序

  [复制链接]
跳转到指定楼层
楼主
基于C51单片机万年历,资料很全有ad画的原理图  pcb工程文件.



     该多功能万年历采用12864液晶屏显示,DS18B20采集温度,DS1302芯片实时记录时间
(单片断电仍可以正常计时),按键调整温度及阳历农历的切换,蜂鸣器整点报时。供电
可以用干电池或USB,任意切换。
     12864液晶屏显示的有:阳历:年份,生肖,日期,时间,星期,温度,国际节日。
                          阴历:天干地支,阴历日期,时间,星期,温度。
     源程序中有各子程序的详细说明,便于你更了解各语句的意思及程序的大体思路。
     

     最后,希望各电子爱好者能够进入我的群一起探讨交流,分享经验


万年历原理图


pcb工程文件 ad画的

源程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /************************12864端口定义*******************************************/
  5. #define dataport P0   //12864数据口
  6. sbit rs=P2^0; //指令/数据端口
  7. sbit rw=P2^1; //读/写端口
  8. sbit en=P2^2; //使能端口
  9. sbit psb=P2^3; //并口/串口端口(本万年历采用并口)
  10. sbit rst=P2^5; //复位端口
  11. /********************************************************************************/
  12. /***********************DS1302端口定义*******************************************/
  13. sbit clock_rst=P3^7;  //1302复位管脚定义
  14. sbit clock_dat=P2^6;  //1302I/O管脚定义
  15. sbit clock_clk=P2^7;  //1302时钟管脚定义  
  16. /***************寄存器定义(用于记录1302IO的输入和输出)*************************/
  17. sbit a0=ACC^0;
  18. sbit a1=ACC^1;
  19. sbit a2=ACC^2;
  20. sbit a3=ACC^3;
  21. sbit a4=ACC^4;
  22. sbit a5=ACC^5;
  23. sbit a6=ACC^6;
  24. sbit a7=ACC^7;
  25. /********************DS18B20端口定义*********************************************/
  26. /********************************************************************************/
  27. sbit DQ=P3^4; //DS18B20数据端口
  28. /********************************************************************************/
  29. /******************18B20全局变量定义*********************************************/
  30. uchar temp;     //温度全局变量(整数部分)
  31. uint xs;     //温度全局变量(小数部分)
  32. /********************************************************************************/

  33. /**********************1302全局变量定义******************************************/
  34. uchar sec,min,hour,day,month,week,year1,year2=20;//秒,分,时,日,月,星期,年
  35. /************************蜂鸣器端口定义******************************************/
  36. sbit beep=P3^5;
  37. uchar num;
  38. /***********************按键定义*************************************************/
  39. sbit key1=P3^0;
  40. sbit key2=P3^1;
  41. sbit key3=P3^2;
  42. sbit key4=P3^3;
  43. uchar set=0; //set=0时显示首页,1时显示次页
  44. uchar status=0;//按键功能选择定义(年0,月1,日2,时3,分4 )
  45. /********************************************************************************/
  46. uchar code month_week[12]={6,2,3,6,1,4,6,2,5,7,3,5}; //2000年各月头天星期表
  47. uchar code year_code[300]={0x0C,0x96,0x45, /*2000*/  0x4d,0x4A,0xB8, /*2001*/   //2002~2099年农历表
  48. 0x0d,0x4A,0x4C, /*2002*/   0x0d,0xA5,0x41, /*2003*/  0x25,0xAA,0xB6, /*2004*/
  49. 0x05,0x6A,0x49, /*2005*/   0x7A,0xAd,0xBd, /*2006*/  0x02,0x5d,0x52, /*2007*/
  50. 0x09,0x2d,0x47, /*2008*/   0x5C,0x95,0xBA, /*2009*/  0x0A,0x95,0x4e, /*2010*/
  51. 0x0B,0x4A,0x43, /*2011*/   0x4B,0x55,0x37, /*2012*/  0x0A,0xd5,0x4A, /*2013*/
  52. 0x95,0x5A,0xBf, /*2014*/   0x04,0xBA,0x53, /*2015*/  0x0A,0x5B,0x48, /*2016*/
  53. 0x65,0x2B,0xBC, /*2017*/   0x05,0x2B,0x50, /*2018*/  0x0A,0x93,0x45, /*2019*/
  54. 0x47,0x4A,0xB9, /*2020*/   0x06,0xAA,0x4C, /*2021*/  0x0A,0xd5,0x41, /*2022*/
  55. 0x24,0xdA,0xB6, /*2023*/   0x04,0xB6,0x4A, /*2024*/  0x69,0x57,0x3d, /*2025*/
  56. 0x0A,0x4e,0x51, /*2026*/   0x0d,0x26,0x46, /*2027*/  0x5e,0x93,0x3A, /*2028*/
  57. 0x0d,0x53,0x4d, /*2029*/   0x05,0xAA,0x43, /*2030*/ 0x36,0xB5,0x37, /*2031*/
  58. 0x09,0x6d,0x4B, /*2032*/   0xB4,0xAe,0xBf, /*2033*/  0x04,0xAd,0x53, /*2034*/
  59. 0x0A,0x4d,0x48, /*2035*/   0x6d,0x25,0xBC, /*2036*/  0x0d,0x25,0x4f, /*2037*/
  60. 0x0d,0x52,0x44, /*2038*/   0x5d,0xAA,0x38, /*2039*/  0x0B,0x5A,0x4C, /*2040*/
  61. 0x05,0x6d,0x41, /*2041*/   0x24,0xAd,0xB6, /*2042*/  0x04,0x9B,0x4A, /*2043*/
  62. 0x7A,0x4B,0xBe, /*2044*/   0x0A,0x4B,0x51, /*2045*/  0x0A,0xA5,0x46, /*2046*/
  63. 0x5B,0x52,0xBA, /*2047*/   0x06,0xd2,0x4e, /*2048*/  0x0A,0xdA,0x42, /*2049*/
  64. 0x35,0x5B,0x37, /*2050*/   0x09,0x37,0x4B, /*2051*/  0x84,0x97,0xC1, /*2052*/
  65. 0x04,0x97,0x53, /*2053*/   0x06,0x4B,0x48, /*2054*/  0x66,0xA5,0x3C, /*2055*/
  66. 0x0e,0xA5,0x4f, /*2056*/   0x06,0xB2,0x44, /*2057*/  0x4A,0xB6,0x38, /*2058*/
  67. 0x0A,0xAe,0x4C, /*2059*/   0x09,0x2e,0x42, /*2060*/  0x3C,0x97,0x35, /*2061*/
  68. 0x0C,0x96,0x49, /*2062*/   0x7d,0x4A,0xBd, /*2063*/  0x0d,0x4A,0x51, /*2064*/
  69. 0x0d,0xA5,0x45, /*2065*/   0x55,0xAA,0xBA, /*2066*/  0x05,0x6A,0x4e, /*2067*/
  70. 0x0A,0x6d,0x43, /*2068*/   0x45,0x2e,0xB7, /*2069*/  0x05,0x2d,0x4B, /*2070*/
  71. 0x8A,0x95,0xBf, /*2071*/   0x0A,0x95,0x53, /*2072*/  0x0B,0x4A,0x47, /*2073*/
  72. 0x6B,0x55,0x3B, /*2074*/   0x0A,0xd5,0x4f, /*2075*/  0x05,0x5A,0x45, /*2076*/
  73. 0x4A,0x5d,0x38, /*2077*/   0x0A,0x5B,0x4C, /*2078*/  0x05,0x2B,0x42, /*2079*/
  74. 0x3A,0x93,0xB6, /*2080*/   0x06,0x93,0x49, /*2081*/  0x77,0x29,0xBd, /*2082*/
  75. 0x06,0xAA,0x51, /*2083*/   0x0A,0xd5,0x46, /*2084*/  0x54,0xdA,0xBA, /*2085*/
  76. 0x04,0xB6,0x4e, /*2086*/   0x0A,0x57,0x43, /*2087*/  0x45,0x27,0x38, /*2088*/
  77. 0x0d,0x26,0x4A, /*2089*/   0x8e,0x93,0x3e, /*2090*/  0x0d,0x52,0x52, /*2091*/
  78. 0x0d,0xAA,0x47, /*2092*/   0x66,0xB5,0x3B, /*2093*/  0x05,0x6d,0x4f, /*2094*/
  79. 0x04,0xAe,0x45, /*2095*/   0x4A,0x4e,0xB9, /*2096*/  0x0A,0x4d,0x4C, /*2097*/
  80. 0x0d,0x15,0x41, /*2098*/   0x2d,0x92,0xB5, /*2099*/
  81. };
  82. uint code month_day1[12]={0,31,59,90,120,151,181,212,243,273,304,334};//平年月份累计天数表
  83. uint code month_day2[12]={0,31,60,91,121,152,182,213,244,274,305,335};//闰年月份累计天数表
  84. uint table_addr; //查农历表的地址全局变量
  85. uchar year1_n,month_n,day_n; //农历年月日全局变量
  86. uchar month_r;  //农历闰月全局变量,无时为0
  87. /**********************延时函数*************************************************/
  88. void delay(uint t)  
  89. {
  90. uint b;
  91. for(;t;t--)
  92.   for(b=0;b<121;b++);
  93. }
  94. /*******************************************************************************/
  95. /**************************12864子函数******************************************/
  96. /**********************检查忙信号子函数*****************************************/
  97. void busy()  
  98. {
  99. rs=0;  //指令操作
  100. rw=1;  //读操作
  101. dataport=0xff; //数据端口置位
  102. en=1;  //使能
  103. while(dataport&0x80); //等待数据端口位7为0
  104. en=0;  //取消使能
  105. }
  106. /************************写指令函数*********************************************/
  107. void write_code(uchar c)   
  108. {
  109. busy();   //检查忙标志
  110. rs=0;   //指令操作
  111. rw=0;   //写操作
  112. dataport=c;  //送指令到端口
  113. en=1;   //使能
  114. delay(1);  //稍微延时
  115. en=0;   //取消使能
  116. }
  117. /************************写数据函数*********************************************/
  118. void write_data(uchar d)   
  119. {
  120. busy();   //检查忙标志
  121. rs=1;   //数据操作
  122. rw=0;   //写操作
  123. dataport=d;  //送数据到端口
  124. en=1;   //使能
  125. delay(1);  //稍微延时
  126. en=0;   //取消延时
  127. }
  128. /***********************写汉字**************************************************/
  129. void write_hz(uchar *hz)
  130. {         
  131. while(*hz>0)
  132. {
  133.   write_data(*hz); //写入汉字
  134.   hz++;
  135. }
  136. }

  137. /***************************初始化12864*****************************************/
  138. void init_12864()  
  139. {
  140. psb=1;        //并口方式
  141. rst=1;        //复位端置高
  142. write_code(0x30); //8位数据传送,基本指令操作
  143. delay(10);
  144. write_code(0x0c); //无光标,不反白
  145. delay(10);   
  146. write_code(0x01); //清除显示
  147. delay(10);
  148. write_code(0x40); //光标左移,字符不动
  149. delay(10);
  150. }                  
  151. /*******************************************************************************/
  152. /*************************DS1302子函数******************************************/
  153. /************************1302写驱动函数*****************************************/
  154. void write_clock(uchar dat)
  155. {
  156. ACC=dat;
  157. clock_dat=a0; clock_clk=1; clock_clk=0; //数据在上升沿变化
  158. clock_dat=a1; clock_clk=1; clock_clk=0; //下降沿写入1302
  159. clock_dat=a2; clock_clk=1; clock_clk=0;
  160. clock_dat=a3; clock_clk=1; clock_clk=0;
  161. clock_dat=a4; clock_clk=1; clock_clk=0;
  162. clock_dat=a5; clock_clk=1; clock_clk=0;
  163. clock_dat=a6; clock_clk=1; clock_clk=0;
  164. clock_dat=a7; clock_clk=1; clock_clk=0;
  165. }
  166. /************************1302读驱动函数*****************************************/
  167. uchar read_clock()
  168. {
  169. clock_dat=1;   //输出赋1
  170. a0=clock_dat;clock_clk=1; clock_clk=0;  //位0为1,读1302
  171. a1=clock_dat;clock_clk=1; clock_clk=0; //下降沿读出有效
  172.     a2=clock_dat;clock_clk=1; clock_clk=0;
  173. a3=clock_dat;clock_clk=1; clock_clk=0;
  174.     a4=clock_dat;clock_clk=1; clock_clk=0;
  175. a5=clock_dat;clock_clk=1; clock_clk=0;
  176. a6=clock_dat;clock_clk=1; clock_clk=0;
  177. a7=clock_dat;clock_clk=1; clock_clk=0;
  178. return(ACC);
  179. }
  180. /***************************写数据入1302****************************************/
  181. void write_dat_clock(uchar add,uchar dat)
  182. {
  183. clock_clk=0;
  184. clock_rst=0; //时钟脉冲为低时
  185. clock_rst=1; //复位端才能置高
  186. write_clock(add); //写入地址(命令字节)
  187. write_clock(dat); //写入数据
  188. clock_rst=0; //终止数据传送
  189. clock_clk=1;
  190. }
  191. /***************************从1302读出数据**************************************/
  192. uchar read_dat_clock(uchar add)
  193. {
  194. uchar dat=0; //定义数据储存变量
  195. clock_clk=0;
  196. clock_rst=0;
  197. clock_rst=1;
  198. write_clock(add); //写入要读数据的地址
  199. dat=read_clock(); //读出数据
  200. clock_rst=0; //终止数据传送
  201. clock_clk=1;
  202. return dat;  //返回数据
  203. }
  204. /**************************设置初始时间函数*************************************/
  205. void set_time()
  206. {
  207. write_dat_clock(0x8e,0x00);  //允许写操作
  208. write_dat_clock(0x8c,0x09);  //年
  209. write_dat_clock(0x8a,0x03);  //星期
  210. write_dat_clock(0x88,0x10);  //月
  211. write_dat_clock(0x86,0x14);  //日
  212. write_dat_clock(0x84,0x21);  //小时
  213. write_dat_clock(0x82,0x56);  //分
  214. write_dat_clock(0x80,0x00);  //秒,且振荡器工作
  215. //write_dat_clock(0x90,0xa5);  //充电
  216. write_dat_clock(0x8e,0x80);  //禁止写操作
  217. }
  218. /*****************************读取时间******************************************/
  219. void get_time()
  220. {
  221. sec=read_dat_clock(0x81);    //读取秒
  222. sec=(sec>>4)*10+(sec&0x0f);  //秒二进制转换
  223. min=read_dat_clock(0x83);    //读取分钟
  224. min=(min>>4)*10+(min&0x0f);  //分二进制转换
  225. hour=read_dat_clock(0x85);   //读取小时
  226. hour=(hour>>4)*10+(hour&0x0f);//小时二进制转换
  227. day=read_dat_clock(0x87);     //读取日期
  228. day=(day>>4)*10+(day&0x0f);   //日期二进制转换
  229. month=read_dat_clock(0x89);   //读取月份
  230. month=(month>>4)*10+(month&0x0f);//月二进制转换
  231. week=read_dat_clock(0x8b);    //读取星期
  232. week=(week>>4)*10+(week&0x0f);//星期二进制转换
  233. year1=read_dat_clock(0x8d);     //读取年份
  234. year1=(year1>>4)*10+(year1&0x0f); //年份二进制转换
  235. }         
  236. /*************************DS18B20各子函数***************************************/  
  237. /*************************DS18B20延时函数***************************************/
  238. void delay_DS18B20(uint i)
  239. {
  240. for(;i;i--);
  241. }
  242. /*************************DS18B20初始化函数*************************************/
  243. init_DS18B20()  
  244. {  
  245. DQ=1;       //DQ复位
  246. delay_DS18B20(1);   //稍作延时
  247. DQ=0;       //产生复位脉冲
  248. delay_DS18B20(160); //精确延时,大于480us
  249. DQ=1;       //拉高总线
  250. delay_DS18B20(5);   //等待20us左右
  251. while(DQ);      //等待DS18B20发出存在脉冲
  252. delay_DS18B20(30); //脉冲持续100us左右
  253. }
  254. /*****************************写一个字节****************************************/
  255. void write_onechar(uchar dat)
  256. {
  257. uchar i;
  258. for(i=8;i>0;i--)
  259. {
  260.   DQ=0;
  261.   DQ=dat&0x01;
  262.   delay_DS18B20(3);
  263.   DQ=1;
  264.   dat>>=1;
  265. }
  266. }
  267. /*****************************读一个字节****************************************/
  268. uchar read_onechar()
  269. {
  270. uchar i;
  271. uchar dat;
  272. for(i=8;i>0;i--)
  273. {
  274.   DQ=0;    //总线拉低
  275.   dat>>=1; //维持一个指令时间
  276.   DQ=1;    //拉高总线
  277.   if(DQ)  //读数据
  278.    dat|=0x80;
  279.   delay_DS18B20(20); //维持60us
  280. }
  281. return dat;
  282. }
  283. /*************************读取温度数值******************************************/
  284. uchar read_tem()
  285. {
  286. uchar ltemp;          //定义温度低字节
  287. uchar htemp;          //定义温度高字节
  288. uchar t;           //定义温度整数部分返回值
  289. init_DS18B20();
  290. write_onechar(0xcc);  //跳过读序号列号的操作
  291. write_onechar(0x44);  // 启动温度转换
  292. init_DS18B20();
  293. write_onechar(0xcc);  //跳过读序号列号的操作
  294. write_onechar(0xbe);  //读取温度寄存器
  295. ltemp=read_onechar(); //读取温度低字节
  296. htemp=read_onechar(); //读取温度高字节
  297. ltemp=ltemp>>4;       //低字节右移4位,去掉小数位
  298. t=htemp<<4;        //高字节左移4位,去掉符号位
  299. t|=ltemp;        //合并整数部分
  300. xs=ltemp&0x0f;       //小数部分赋予xs
  301. xs*=0.625;        //计算小数部分的数值
  302. return t;        //返回温度整数部分数值
  303. }
  304. /******************************************************************************/
  305. /*****************************按键功能函数*************************************/
  306. void key_1()     //选择变量函数
  307. {
  308. key1=1;
  309. if(key1==0)
  310. {
  311.   delay(10);
  312.   if(key1==0)
  313.   {
  314.    if(++status>5)status=0; //1控制年的变化,2控制月的变化,3控制日的变化
  315.   }       //4控制时的变化,5控制分的变化
  316.   while(key1==0);
  317. }
  318. }
  319. /******************************************************************************/
  320. void key_2()       //加函数
  321. {
  322. key2=1;
  323. if(key2==0)
  324. {
  325.   delay(10);
  326.   if(key2==0)
  327.   {
  328.    switch(status)
  329.    {
  330.     case 1:if(++year1>99)year1=0;break;
  331.     case 2:if(++month>12)month=1;break;
  332.     case 3:if(++day>31)day=1;break;
  333.     case 4:if(++hour>=24)hour=0;break;
  334.     case 5:if(++min>=60)min=0;break;
  335.    }
  336.   }
  337.   while(key2==0);
  338. }
  339. }
  340. /*****************************************************************************/
  341. void key_3()//减函数
  342. {
  343. key3=1;
  344. if(key3==0)
  345. {
  346.   delay(10);
  347.   if(key3==0)
  348.   {
  349.    switch(status)
  350.    {
  351.     case 1:if((year1--)<=0)year1=99;break;
  352.     case 2:if((month--)<=1)month=12;break;
  353.     case 3:if((day--)<=1)day=31;break;
  354.     case 4:if((hour--)<=0)hour=23;break;
  355.     case 5:if((min--)<=0)min=59;break;
  356.    }
  357.   }
  358.   while(key3==0);
  359. }
  360. }
  361. /*****************************************************************************/
  362. key_4()     //选择变量函数
  363. {
  364. key4=1;
  365. if(key4==0)
  366. {
  367.   delay(10);
  368.   if(key4==0)
  369.   {
  370.    if(++set>1)set=0;//0显示首页,1显示次页
  371.   }
  372.   write_code(0x01); //清除一下显示屏
  373.   while(key4==0);
  374. }
  375. }
  376. /*****************************************************************************/
  377. void key_time()    //按键设置时间的处理
  378. {
  379. write_dat_clock(0x8e,0x00);  //允许写操作
  380. write_dat_clock(0x8c,(year1/10)*16+year1%10);  //年
  381. write_dat_clock(0x8a,(week/10)*16+week%10);  //星期
  382. write_dat_clock(0x88,(month/10)*16+month%10);  //月
  383. write_dat_clock(0x86,(day/10)*16+day%10);  //日
  384. write_dat_clock(0x84,(hour/10)*16+hour%10);  //小时
  385. write_dat_clock(0x82,(min/10)*16+min%10);  //分
  386. write_dat_clock(0x8e,0x80);  //禁止写操作
  387. }
  388. /*****************************************************************************/
  389. /***********************平闰年设定********************************************/
  390. bit prp(uchar y)
  391. {
  392. uint temp;
  393. temp=2000+y;
  394. if(((temp%4)==0)&&((temp%100)!=0)||((temp%400)==0))
  395.   return 1;
  396. else
  397.   return 0;
  398. }
  399. /***********************某年月日星期设定**************************************/
  400. void d_week()
  401. {
  402. uchar x,y;
  403. x=year1/4;
  404. y=year1%4;
  405. if(month<3)
  406.   week=((x*5+2+(y-1)+(day-1))%7+month_week[month-1])%7;
  407. else
  408.   week=((x*5+y+(day-1))%7+month_week[month-1])%7;
  409. }
  410. /***********************某年月日农历设定**************************************/
  411. uchar get_moon_day(uchar m,uint ta)//农历月天数判定函数
  412. {
  413. uchar temp;
  414. switch(m)
  415. {
  416.   case 1:temp=year_code[ta]&0x08;break;
  417.   case 2:temp=year_code[ta]&0x04;break;
  418.   case 3:temp=year_code[ta]&0x02;break;
  419.   case 4:temp=year_code[ta]&0x01;break;
  420.   case 5:temp=year_code[ta+1]&0x80;break;
  421.   case 6:temp=year_code[ta+1]&0x40;break;
  422.   case 7:temp=year_code[ta+1]&0x20;break;
  423.   case 8:temp=year_code[ta+1]&0x10;break;
  424.   case 9:temp=year_code[ta+2]&0x08;break;
  425.   case 10:temp=year_code[ta+2]&0x04;break;
  426.   case 11:temp=year_code[ta+2]&0x02;break;
  427.   case 12:temp=year_code[ta+2]&0x01;break;
  428.   case 13:temp=year_code[ta+2]&0x80;break;
  429. }
  430. if(temp==0)
  431.   return 29;
  432. else
  433.   return 30;
  434. }
  435. /**********************某年农历闰月设定**************************************/
  436. uchar get_month_r(uchar y)
  437. {
  438. uchar temp,ta;
  439. ta=y*3;
  440. temp=(year_code[ta]&0xf0)>>4;
  441. return temp;
  442. }
  443. /*********************阳历转化农历*******************************************/
  444. void convert_yinyan(uchar year1,uchar month,uchar day)
  445. {
  446. uchar month_n1,day_n1;//春节公历月日
  447. uint temp1,temp2;     //值转移变量
  448. table_addr=year1*3;
  449. month_n1=(year_code[table_addr+2]&0x60)>>5;//农历正月所在月数
  450. day_n1=year_code[table_addr+2]&0x1f;    //农历正月所在当月日数
  451. month_r=get_month_r(year1);  //计算当年闰月
  452. if(month_n1==1)   //春节离当年元旦天数
  453.   temp1=day_n1-1;
  454. else
  455.   temp1=30+day_n1-1;
  456. if(prp(year1))//次年是否为闰年
  457.   temp2=month_day2[month-1]+day-1;
  458. else
  459.   temp2=month_day1[month-1]+day-1;
  460. if(temp2>=temp1)//次月日在春节后否
  461. {
  462.   year1_n=year1;
  463.   month_n=1;
  464.   temp2=temp2-temp1;
  465.   temp1=get_moon_day(month_n,table_addr); //当月天数计算
  466.   while(temp2>=temp1)
  467.   {
  468.    month_n++;
  469.    temp2=temp2-temp1;
  470.    temp1=get_moon_day(month_n,table_addr);
  471.   }
  472.   day_n=temp2+1;
  473. }
  474. else
  475. {
  476.   year1_n=year1-1;
  477.   temp1=temp1-temp2;
  478.   table_addr=table_addr-3;
  479.   month_r=get_month_r(year1-1);
  480.   if(month_r==0)   //若当年没有闰月
  481.    month_n=12;
  482.   else
  483.    month_n=13;
  484.   temp2=get_moon_day(month_n,table_addr);
  485.   while(temp1>=temp2)
  486.   {
  487.    month_n--;
  488.    temp1=temp1-temp2;
  489.    temp2=get_moon_day(month_n,table_addr);
  490.   }
  491. }


  492. }

  493. /***********************特殊功能子函数***************************************/
  494. /**************************星期设定******************************************/
  495. void xingqi()
  496. {
  497. d_week();
  498. switch(week)
  499. {
  500.   case 1:write_hz("一");break;
  501.   case 2:write_hz("二");break;
  502.   case 3:write_data(0xc8);write_data(0xfd);break;
  503.   case 4:write_hz("四");break;
  504.   case 5:write_hz("五");break;
  505.   case 6:write_hz("六");break;
  506.   case 0:write_hz("日");break;
  507.   default:break;
  508. }
  509. }
  510. /*************************生肖年设定*****************************************/
  511. void shengxiao()
  512. {
  513. uchar sx=year1%12;
  514. switch(sx)
  515. {
  516.   case 0:write_hz("龙");break;
  517.   case 1:write_hz("蛇");break;
  518.   case 2:write_hz("马");break;
  519.   case 3:write_hz("羊");break;
  520.   case 4:write_hz("猴");break;
  521.   case 5:write_hz("鸡");break;
  522.   case 6:write_hz("狗");break;
  523.   case 7:write_hz("猪");break;
  524.   case 8:write_hz("鼠");break;
  525.   case 9:write_hz("牛");break;
  526.   case 10:write_hz("虎");break;
  527.   case 11:write_hz("兔");break;
  528.   default:break;
  529. }
  530. }
  531. /************************天干地支设定****************************************/
  532. void tgdz()
  533. {
  534. uchar tiangan=year1_n%10;
  535. uchar dizhi=year1_n%12;
  536. switch(tiangan)
  537. {
  538.   case 4:write_hz("甲");break;
  539.   case 5:write_hz("乙");break;
  540.   case 6:write_hz("丙");break;
  541.   case 7:write_hz("丁");break;
  542.   case 8:write_hz("戊");break;
  543.   case 9:write_hz("己");break;
  544.   case 0:write_data(0xb8);write_data(0xfd);break;
  545.   case 1:write_hz("辛");break;
  546.   case 2:write_hz("壬");break;
  547.   case 3:write_hz("葵");break;
  548.   default:break;
  549. }
  550. switch(dizhi)
  551. {
  552.   case 8:write_hz("子");break;
  553.   case 9:write_hz("丑");break;
  554.   case 10:write_hz("寅");break;
  555.   case 11:write_hz("卯");break;
  556.   case 0:write_hz("辰");break;
  557.   case 1:write_hz("巳");break;
  558.   case 2:write_hz("午");break;
  559.   case 3:write_hz("未");break;
  560.   case 4:write_hz("申");break;
  561.   case 5:write_hz("酉");break;
  562.   case 6:write_hz("戌");break;
  563.   case 7:write_hz("亥");break;
  564.   default:break;
  565. }
  566. }
  567. /*******************农历月设定**********************************************/
  568. void nongli_m()
  569. {
  570. if(month_n==0)
  571. {
  572.   switch(month_n)
  573.   {
  574.    case 1: write_hz("    ");write_data(0xd5);write_data(0xfd);break;  //正
  575.    case 2: write_hz("    二");break;
  576.    case 3: write_hz("    ");write_data(0xc8);write_data(0xfd);break;  //三
  577.    case 4: write_hz("    四");break;
  578.    case 5: write_hz("    五");break;
  579.    case 6: write_hz("    六");break;
  580.    case 7: write_hz("    七");break;
  581.    case 8: write_hz("    八");break;
  582.    case 9: write_hz("    九");break;
  583.    case 10:write_hz("    十");break;
  584.    case 11:write_hz("  十一");break;
  585.    case 12:write_hz("  十二");break;
  586.   }
  587. }
  588. else
  589. {
  590.   if((month_n-1)==month_r)
  591.   {
  592.    switch(month_n-1)
  593.    {
  594.     case 1: write_hz("  闰一");break;
  595.     case 2: write_hz("  闰二");break;
  596.     case 3: write_hz("  闰");write_data(0xc8);write_data(0xfd);break;
  597.     case 4: write_hz("  闰四");break;
  598.     case 5: write_hz("  闰五");break;
  599.     case 6: write_hz("  闰六");break;
  600.     case 7: write_hz("  闰七");break;
  601.     case 8: write_hz("  闰八");break;
  602.     case 9: write_hz("  闰九");break;
  603.     case 10:write_hz("  闰十");break;
  604.     case 11:write_hz("闰十一");break;
  605.     case 12:write_hz("闰十二");break;
  606.    }
  607.   }
  608.   else if(month_n<=month_r)
  609.   {
  610.    switch(month_n)
  611.    {
  612.     case 1: write_hz("    ");write_data(0xd5);write_data(0xfd);break;
  613.     case 2: write_hz("    二");break;
  614.     case 3: write_hz("    ");write_data(0xc8);write_data(0xfd);break;
  615.     case 4: write_hz("    四");break;
  616.     case 5: write_hz("    五");break;
  617.     case 6: write_hz("    六");break;
  618.     case 7: write_hz("    七");break;
  619.     case 8: write_hz("    八");break;
  620.     case 9: write_hz("    九");break;
  621.     case 10:write_hz("    十");break;
  622.     case 11:write_hz("  十一");break;
  623.     case 12:write_hz("  十二");break;
  624.    }
  625.   }
  626.   else
  627.   {
  628.    switch(month_n-1)
  629.    {
  630.     case 2: write_hz("    二");break;
  631.     case 3: write_hz("    ");write_data(0xc8);write_data(0xfd);break;
  632.     case 4: write_hz("    四");break;
  633.     case 5: write_hz("    五");break;
  634.     case 6: write_hz("    六");break;
  635.     case 7: write_hz("    七");break;
  636.     case 8: write_hz("    八");break;
  637.     case 9: write_hz("    九");break;
  638.     case 10:write_hz("    十");break;
  639.     case 11:write_hz("  十一");break;
  640.     case 12:write_hz("  十二");break;
  641.    }
  642.   }
  643. }
  644. }
  645. /***********************农历日设定******************************************/
  646. void nongli_d()
  647. {
  648. switch(day_n)
  649. {
  650.   case 1: write_hz("初一  ");break;
  651.   case 2: write_hz("初二  ");break;
  652.   case 3: write_hz("初");write_data(0xc8);write_data(0xfd);write_hz("  ");break;
  653.   case 4: write_hz("初四  ");break;
  654.   case 5: write_hz("初五  ");break;
  655.   case 6: write_hz("初六  ");break;
  656.   case 7: write_hz("初七  ");break;
  657.   case 8: write_hz("初八  ");break;
  658.   case 9: write_hz("初九  ");break;
  659.   case 10:write_hz("初十  ");break;
  660.   case 11:write_hz("十一  ");break;
  661.   case 12:write_hz("十二  ");break;
  662.   case 13:write_hz("十");write_data(0xc8);write_data(0xfd);write_hz("  ");break;
  663.   case 14:write_hz("十四  ");break;
  664.   case 15:write_hz("十五  ");break;
  665.   case 16:write_hz("十六  ");break;
  666.   case 17:write_hz("十七  ");break;
  667.   case 18:write_hz("十八  ");break;
  668.   case 19:write_hz("十九  ");break;
  669.   case 20:write_hz("廿十  ");break;
  670.   case 21:write_hz("廿十一");break;
  671.   case 22:write_hz("廿十二");break;
  672.   case 23:write_hz("廿十");write_data(0xc8);write_data(0xfd);break;
  673.   case 24:write_hz("廿十四");break;
  674.   case 25:write_hz("廿十五");break;
  675.   case 26:write_hz("廿十六");break;
  676.   case 27:write_hz("廿十七");break;
  677.   case 28:write_hz("廿十八");break;
  678.   case 29:write_hz("廿十九");break;
  679.   case 30:write_data(0xc8);write_data(0xfd);write_hz("十");write_hz("  ");break;
  680. }
  681. }

  682. /************************节日函数*******************************************/
  683. void holiday()
  684. {  
  685. while(1){
  686. if(status==1)          {write_hz("    调整年份    ");break;}
  687. if(status==2)          {write_hz("    调整月份    ");break;}
  688. if(status==3)          {write_hz("    调整日期    ");break;}
  689. if(status==4)          {write_hz("    调整小时    ");break;}
  690. if(status==5)          {write_hz("    调整分钟    ");break;}
  691. if(month==1&&day==1)   {write_hz("    新年元旦    ");break;}
  692. if(month==2&&day==14)  {write_hz("  今日情人节    ");break;}
  693. if(month==3&&day==8)   {write_hz("  国际妇女节    ");break;}
  694. if(month==3&&day==12)  {write_hz("  中国植树节    ");break;}
  695. if(month==3&&day==15)  {write_hz("世界消费者权益日");break;}
  696. if(month==4&&day==1)   {write_hz("    愚人节      ");break;}
  697. if(month==5&&day==1)   {write_hz("  国际劳动节    ");break;}
  698. if(month==5&&day==4)   {write_hz("  中国青年节    ");break;}
  699. if(month==5&&day==8)   {write_hz("  世界红十字日  ");break;}
  700. if(month==5&&day==12)  {write_hz("  国际护士节    ");break;}
  701. if(month==6&&day==1)   {write_hz("  国际儿童节    ");break;}
  702. if(month==6&&day==26)  {write_hz("  国际禁毒日    ");break;}
  703. if(month==7&&day==1)   {write_hz("中国共产党诞生日");break;}
  704. if(month==7&&day==7)   {write_hz("抗日战争纪念日  ");break;}
  705. if(month==8&&day==1)   {write_hz("  中国建军节    ");break;}
  706. if(month==8&&day==12)  {write_hz("  国际青年节    ");break;}
  707. if(month==9&&day==10)  {write_hz("  中国教师节    ");break;}
  708. if(month==10&&day==1)  {write_hz("    国庆节      ");break;}
  709. if(month==10&&day==24) {write_hz("    联合国日    ");break;}
  710. if(month==10&&day==31) {write_hz("    万圣节      ");break;}
  711. if(month==12&&day==1)  {write_hz("  世界艾滋病日  ");break;}
  712. if(month==12&&day==25) {write_hz("    圣诞节      ");break;}
  713. if(hour>=4&&hour<6)    {write_hz("凌晨了,ZZZ~~~");break;}
  714. if(hour>=6&&hour<8)    {write_hz("主人,早上好!");break;}
  715. if(hour>=8&&hour<12)   {write_hz("__●__上午▲▲__");break;}
  716. if(hour==12)           {write_hz("午休时间到咯~");break;}
  717. if(hour>=13&&hour<18)  {write_hz("下午茶时间^_^");break;}
  718. if(hour>=18&&hour<22)  {write_hz("  晚上了额  ~");break;}
  719. if(hour>=22&&hour<=23) {write_hz("该准备睡咯~~~");break;}
  720. if(hour>=0&&hour<4)    {write_hz("你,睡了吗?Z~");break;}

  721. }  
  722. }
  723. /**************************整点半点报时函数**********************************/
  724. void time()
  725. {
  726. get_time();
  727. if(min==0&&sec==0)
  728. {
  729.   num=0;
  730.   delay(500);
  731. }
  732. if(min==0)
  733. {
  734.   if(hour==0)
  735.   {   
  736.    if(num<12)
  737.    {
  738.     beep=0;
  739.     delay(1000);
  740.     beep=1;
  741.     num=num+1;
  742.    }
  743.   }
  744.   if(hour>0&&hour<13)
  745.   {
  746.    if(num<hour)
  747.    {
  748.     beep=0;
  749.     delay(1000);
  750.     beep=1;
  751.     num=num+1;
  752.    }
  753.   }
  754.   if(hour>12&&hour<24)
  755.   {
  756.    if(num<hour-12)
  757.    {
  758.     beep=0;
  759.     delay(1000);
  760.     beep=1;
  761.     num=num+1;
  762.    }
  763.   }
  764. }
  765. if(min==30&&sec==0)
  766. {
  767.   beep=0;
  768.   delay(1000);
  769.   beep=1;
  770. }
  771. }/***************************首页函数*****************************************/
  772. void shou()
  773. {
  774. write_code(0x80);
  775. write_data(year2/10+0x30);write_data(year2%10+0x30);
  776. write_data(year1/10+0x30);write_data(year1%10+0x30);
  777. write_hz("年");
  778. write_code(0x84);
  779. write_hz("生肖");
  780. shengxiao();
  781. write_hz("年");
  782. write_code(0x90);
  783. write_data(month/10+0x30);write_data(month%10+0x30);
  784. write_hz("月");
  785. write_data(day/10+0x30);write_data(day%10+0x30);
  786. write_hz("日");
  787. write_code(0x95);
  788. write_hz("星期");
  789. xingqi();
  790. write_code(0x88);
  791. write_data(hour/10+0x30);write_data(hour%10+0x30);
  792. write_data(0x3a);
  793. write_data(min/10+0x30);write_data(min%10+0x30);
  794. write_data(0x3a);
  795. write_data(sec/10+0x30);write_data(sec%10+0x30);
  796. write_code(0x8d);
  797. write_data(temp/10+0x30);write_data(temp%10+0x30);
  798. write_data(0x2e);write_data(xs+0x30);write_hz("℃");
  799. write_code(0x98);
  800. holiday();
  801. }
  802. /***************************次页函数*****************************************/
  803. void ci()
  804. {
  805. write_code(0x81);
  806. write_hz("农历");
  807. write_code(0x84);
  808. tgdz();
  809. write_hz("年");
  810. convert_yinyan(year1,month,day);
  811. write_code(0x90);
  812. nongli_m();
  813. write_code(0x93);
  814. write_hz("月");
  815. nongli_d();
  816. write_code(0x8a);
  817. write_data(hour/10+0x30);write_data(hour%10+0x30);
  818. write_data(0x3a);
  819. write_data(min/10+0x30);write_data(min%10+0x30);
  820. write_data(0x3a);
  821. write_data(sec/10+0x30);write_data(sec%10+0x30);
  822. write_code(0x98);         
  823. write_hz("星期");
  824. xingqi();
  825. write_code(0x9d);
  826. write_data(temp/10+0x30);write_data(temp%10+0x30);
  827. write_data(0x2e);write_data(xs+0x30);write_hz("℃");
  828. }
  829. /*****************************主函数******************************************************/
  830. void main()
  831. {
  832. init_12864();
  833. delay(1000);
  834. set_time();
  835. while(1)
  836. {
  837.   if(set==0)
  838.   shou();
  839.   else
  840.   ci();
  841.   temp=read_tem();
  842.   get_time();
  843.   key_1();
  844.   key_2();
  845.   key_3();
  846.   key_4();
  847.   key_time();
  848.   time();
  849. }
  850. }
复制代码


多功能万年历.zip

4.72 MB, 下载次数: 184, 下载积分: 黑币 -5

C51多功能万年历

评分

参与人数 10黑币 +100 收起 理由
康德 + 5 赞一个!
jdjdje + 5
WEIDADETG + 10 很给力!
泡泡1 + 5 赞一个!
zhiqian + 5 很给力!
tieq1952 + 5 赞一个!
782772055 + 5 赞一个!
xiegh + 5 赞一个!
涛涛UU + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享分享 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
一个好学生 发表于 2016-11-14 13:55 | 只看该作者
想稳下PCB里的颜色各代表什么
回复

使用道具 举报

板凳
我的人 发表于 2017-2-9 10:08 | 只看该作者
还不错
回复

使用道具 举报

地板
qxdqx 发表于 2017-2-10 07:24 | 只看该作者
很好!下载来学习学习.
回复

使用道具 举报

5#
xiegh 发表于 2017-11-30 17:56 | 只看该作者
不错,内容很丰富
回复

使用道具 举报

6#
xiegh 发表于 2017-11-30 18:27 | 只看该作者
这算发表吧,就像弄些黑币下载做做看
回复

使用道具 举报

7#
c1971264164 发表于 2017-12-9 20:52 | 只看该作者
表示在做这个  
回复

使用道具 举报

8#
张震岳 发表于 2017-12-19 00:04 | 只看该作者
不错不错
回复

使用道具 举报

9#
tieq1952 发表于 2017-12-19 08:22 | 只看该作者
很好,认真学习
回复

使用道具 举报

10#
电子爱好菜鸟 发表于 2017-12-19 09:48 | 只看该作者
很不错,科技拿来借鉴学习一下
回复

使用道具 举报

11#
调查 发表于 2018-5-7 19:00 | 只看该作者
好用吗
回复

使用道具 举报

12#
王永久 发表于 2018-5-9 20:26 | 只看该作者
赞一个
回复

使用道具 举报

13#
墨染青衣颜s 发表于 2018-5-10 13:22 | 只看该作者
想问下DS1302芯片是在原理图中是哪一元件呢
回复

使用道具 举报

14#
123qin 发表于 2018-5-11 11:52 | 只看该作者
很有用,赞一个
回复

使用道具 举报

15#
631192622 发表于 2018-6-1 18:21 来自手机 | 只看该作者
学习下,不错
回复

使用道具 举报

16#
banxian 发表于 2018-6-2 17:34 | 只看该作者
想要学习
回复

使用道具 举报

17#
feiji666 发表于 2018-6-2 22:20 | 只看该作者
很精彩
回复

使用道具 举报

18#
我不是杨过 发表于 2018-6-3 21:20 | 只看该作者
刚好要做这个
回复

使用道具 举报

19#
yyg0456 发表于 2018-6-22 21:54 | 只看该作者
赞一个
回复

使用道具 举报

20#
dgvib 发表于 2018-6-23 09:43 | 只看该作者
这个编程的长度不小呀,
回复

使用道具 举报

21#
HAIDISUN_CAO 发表于 2018-6-29 15:10 | 只看该作者
ZLG7290的元件设计怎么烧
回复

使用道具 举报

22#
频率 发表于 2018-6-29 18:21 | 只看该作者
NICE,看着很不错啊
回复

使用道具 举报

23#
fengxs2018 发表于 2018-9-12 23:48 | 只看该作者
蠢蠢欲动,想下载看看
回复

使用道具 举报

24#
康德 发表于 2018-9-13 10:41 | 只看该作者
墨染青衣颜s 发表于 2018-5-10 13:22
想问下DS1302芯片是在原理图中是哪一元件呢

在左下角
回复

使用道具 举报

25#
mjl..... 发表于 2018-9-18 14:02 来自手机 | 只看该作者
谢谢楼主
回复

使用道具 举报

26#
13131313113 发表于 2020-10-13 23:28 | 只看该作者
这个方向很nice,感谢楼主
回复

使用道具 举报

27#
1241648256 发表于 2020-11-20 10:39 | 只看该作者
这程序写的着实给力
回复

使用道具 举报

28#
kiccleaf 发表于 2020-11-22 00:04 | 只看该作者
特别强大的代码,想下载来学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表