找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机C语言与VB语言联合在proteus上仿真

[复制链接]
跳转到指定楼层
楼主
C与VB语言联合在proteus上仿真


单片机源程序如下:
  1. //http://proteus.5d6d.com
  2. #include <reg52.h>

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


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

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

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

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

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

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

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

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

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

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


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


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

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


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

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



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

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





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


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

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



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

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

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

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

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

  261. }
  262. }




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

所有资料51hei提供下载:
0007、VB上位机程序控制DS1302时钟的proteus仿真.rar (682.27 KB, 下载次数: 25)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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