单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

VB上位机程序控制DS1302时钟的proteus仿真+单片机代码

[复制链接]
跳转到指定楼层
楼主


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源码:
  1. include <reg52.h>

  2. sbit T_CLK = P2^4; /*实时时钟时钟线引脚 */
  3. sbit T_IO = P2^3; /*实时时钟数据线引脚 */
  4. sbit T_RST = P2^2; /*实时时钟复位线引脚 */
  5. sbit ACC0=ACC^0;
  6. sbit ACC7=ACC^7;
  7. sbit rs=P2^0;
  8. sbit rw=P2^1;
  9. sbit e=P2^7;
  10. sbit setd=P3^2;
  11. sbit sett=P3^3;
  12. sbit add=P2^5;
  13. sbit enter=P2^6;
  14. sbit speaker=P3^7;
  15. unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};


  16. void v_RTInputByte(unsigned char ucDa)
  17. {
  18. unsigned char i;
  19. ACC = ucDa;
  20. for(i=8; i>0; i--)
  21. {
  22. T_IO = ACC0; /*相当于汇编中的 RRC */
  23. T_CLK = 1;
  24. T_CLK = 0;
  25. ACC = ACC >> 1;
  26. }
  27. }

  28. unsigned char uc_RTOutputByte(void)
  29. {
  30. unsigned char i;
  31. for(i=8; i>0; i--)
  32. {
  33. ACC = ACC >>1; /*相当于汇编中的 RRC */
  34. ACC7 = T_IO;
  35. T_CLK = 1;
  36. T_CLK = 0;
  37. }
  38. return(ACC);
  39. }

  40. void v_W1302(unsigned char ucAddr, unsigned char ucDa)
  41. {
  42. T_RST = 0;
  43. T_CLK = 0;
  44. T_RST = 1;
  45. v_RTInputByte(ucAddr); /* 地址,命令 */
  46. v_RTInputByte(ucDa); /* 写1Byte数据*/
  47. T_CLK = 1;
  48. T_RST =0;
  49. }

  50. unsigned char uc_R1302(unsigned char ucAddr)
  51. {
  52. unsigned char ucDa;
  53. T_RST = 0;
  54. T_CLK = 0;
  55. T_RST = 1;
  56. v_RTInputByte(ucAddr); /* 地址,命令 */
  57. ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
  58. T_CLK = 1;
  59. T_RST =0;
  60. return(ucDa);
  61. }

  62. void v_BurstW1302T(unsigned char *pSecDa)
  63. {
  64. unsigned char i;
  65. v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
  66. T_RST = 0;
  67. T_CLK = 0;
  68. T_RST = 1;
  69. v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
  70. for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
  71. {
  72. v_RTInputByte(*pSecDa);/* 写1Byte数据*/
  73. pSecDa++;
  74. }
  75. T_CLK = 1;
  76. T_RST =0;
  77. }

  78. void v_BurstR1302T(unsigned char *pSecDa)
  79. {
  80. unsigned char i;
  81. T_RST = 0;
  82. T_CLK = 0;
  83. T_RST = 1;
  84. v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
  85. for (i=8; i>0; i--)
  86. {
  87. *pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
  88. pSecDa++;
  89. }
  90. T_CLK = 1;
  91. T_RST =0;
  92. }

  93. void v_BurstW1302R(unsigned char *pReDa)
  94. {
  95. unsigned char i;
  96. v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
  97. T_RST = 0;
  98. T_CLK = 0;
  99. T_RST = 1;
  100. v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
  101. for (i=31;i>0;i--) /*31Byte 寄存器数据 */
  102. {
  103. v_RTInputByte(*pReDa); /* 写1Byte数据*/
  104. pReDa++;
  105. }
  106. T_CLK = 1;
  107. T_RST =0;
  108. }

  109. void v_BurstR1302R(unsigned char *pReDa)
  110. {
  111. unsigned char i;
  112. T_RST = 0;
  113. T_CLK = 0;
  114. T_RST = 1;
  115. v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
  116. for (i=31; i>0; i--) /*31Byte 寄存器数据 */
  117. {
  118. *pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
  119. pReDa++;
  120. }
  121. T_CLK = 1;
  122. T_RST =0;
  123. }

  124. void v_setd1302(unsigned char *pSecDa)
  125. {
  126. unsigned char i;
  127. unsigned char ucAddr = 0x80;
  128. v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
  129. for(i =7;i>0;i--)
  130. {
  131. v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

  132. pSecDa++;
  133. ucAddr +=2;
  134. }
  135. v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
  136. }


  137. void delay()
  138. { unsigned char y;
  139. for(y=0;y<0xff;y++)
  140. {;}
  141. }


  142. void wc51r(unsigned char j)//写命令
  143. {
  144. e=0;rs=0;rw=0;
  145. e=1;
  146. P1=j;
  147. e=0;
  148. delay();
  149. }

  150. void init()//初始化
  151. {
  152. wc51r(0x01);
  153. wc51r(0x38);
  154. wc51r(0x38);
  155. wc51r(0x0e);
  156. wc51r(0x06);
  157. wc51r(0x0c);
  158. }


  159. void wc51ddr(unsigned char j)//写数据
  160. {
  161. e=0;rs=1;rw=0;
  162. e=1;
  163. P1=j;
  164. e=0;
  165. delay();
  166. }

  167. void write1602(unsigned char add,unsigned char da)//写入显示数据
  168. {wc51r(add);wc51ddr(da);}



  169. void main(void)
  170. {
  171. unsigned char ucCurtime[7];
  172. unsigned char i,yearh,yearl,monh,monl,dah,dal,hoh,hol,mih,mil,seh,sel;
  173. unsigned char ucAddr;
  174. unsigned int c;

  175. init();
  176. write1602(0x85,0x35);
  177. for(c=0;c<30000;c++);
  178. write1602(0x86,0x32);
  179. for(c=0;c<30000;c++);
  180. write1602(0x87,0x4D);
  181. for(c=0;c<30000;c++);
  182. write1602(0x88,0x43);
  183. for(c=0;c<30000;c++);
  184. write1602(0x89,0x55);
  185. for(c=0;c<30000;c++);
  186. write1602(0xC2,0x51);
  187. write1602(0xC3,0x51);
  188. write1602(0xC4,0x3A);
  189. write1602(0xC5,0x35);
  190. write1602(0xC6,0x39);
  191. write1602(0xC7,0x37);
  192. write1602(0xC8,0x33);
  193. write1602(0xC9,0x38);
  194. write1602(0xCA,0x35);
  195. write1602(0xCB,0x33);
  196. write1602(0xCC,0x36);
  197. write1602(0xCD,0x39);
  198. for(c=0;c<50000;c++);
  199. init();//LCD初始化





  200. TMOD=0X20;
  201. TH1=0XF3;
  202. TL1=0XF3;
  203. SCON=0X50;
  204. PCON=0X00;
  205. IT0=1;
  206. EX0=1;
  207. IT1=1;
  208. EX1=1;
  209. TR1=1;
  210. EA=1;
  211. ES=1;
  212. while(1)
  213. {ucAddr = 0x81;
  214. for (i=0;i<7;i++)
  215. {
  216. ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
  217. ucAddr += 2;
  218. }


  219. yearh=ucCurtime[6]/16;
  220. yearl=ucCurtime[6]%16;
  221. monh=ucCurtime[4]/16;
  222. monl=ucCurtime[4]%16;
  223. dah=ucCurtime[3]/16;
  224. dal=ucCurtime[3]%16;

  225. hoh=ucCurtime[2]/16;
  226. hol=ucCurtime[2]%16;
  227. mih=ucCurtime[1]/16;
  228. mil=ucCurtime[1]%16;
  229. seh=ucCurtime[0]/16;
  230. sel=ucCurtime[0]%16;



  231. write1602(0x80,0x44);
  232. write1602(0x81,0x61);
  233. write1602(0x82,0x74);
  234. write1602(0x83,0x65);
  235. write1602(0x84,0x3a);//显示date:

  236. write1602(0x85,tab[yearh]);
  237. write1602(0x86,tab[yearl]);
  238. write1602(0x87,0x2d);//显示年
  239. write1602(0x88,tab[monh]);
  240. write1602(0x89,tab[monl]);
  241. write1602(0x8a,0x2d);//显示月
  242. write1602(0x8b,tab[dah]);
  243. write1602(0x8c,tab[dal]);

  244. write1602(0xc0,0x54);
  245. write1602(0xc1,0x69);
  246. write1602(0xc2,0x6d);
  247. write1602(0xc3,0x65);
  248. write1602(0xc4,0x3a);//显示time:

  249. write1602(0xc5,tab[hoh]);
  250. write1602(0xc6,tab[hol]);
  251. write1602(0xc7,0x3a);//显示小时
  252. write1602(0xc8,tab[mih]);
  253. write1602(0xc9,tab[mil]);
  254. write1602(0xca,0x3a);//显示小时
  255. write1602(0xcb,tab[seh]);
  256. write1602(0xcc,tab[sel]);

  257. if((ucCurtime[1]==0)&(ucCurtime[0]==0|ucCurtime[0]==1|ucCurtime[0]==2))//3秒整点报时
  258.   speaker=0;
  259. else speaker=1;

  260. }
  261. }




  262. serint() interrupt 4
  263. { //EA=0;
  264.   static unsigned char k;
  265.   unsigned char temp,year,month,date,hour,min,sec,week;
  266.   unsigned char stemp[7]={0};
  267.   RI=1;
  268.   temp=SBUF;
  269.   RI=0;
  270.   k++;
  271.   switch (k)
  272.   { case 1:sec=temp;
  273.            break;
  274.         case 2:min=temp;
  275.                break;
  276.         case 3:hour=temp;
  277.                break;
  278.         case 4:date=temp;
  279.                break;
  280.         case 5:month=temp;
  281.                break;
  282.         case 6:week=temp;
  283.                break;
  284.         case 7:year=temp;
  285.                stemp[0]=(sec/10)*16+sec%10;
  286.                    stemp[1]=(min/10)*16+min%10;
  287.                    stemp[2]=(hour/10)*16+hour%10;
  288.                    stemp[3]=(date/10)*16+date%10;
  289.                    stemp[4]=(month/10)*16+month%10;
  290.                    stemp[5]=(week/10)*16+week%10;
  291.                    stemp[6]=(year/10)*16+year%10;
  292.            v_setd1302(stemp);//设定值
  293.                    k=0;
  294.                break;
  295.   }
  296. }
复制代码

全部资料51hei下载地址:
0007、VB上位机程序控制DS1302时钟的proteus仿真.rar (682.27 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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