找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5928|回复: 8
收起左侧

基于PIC单片机的万年历源程序与proteus仿真图

[复制链接]
ID:294413 发表于 2018-3-20 11:34 | 显示全部楼层 |阅读模式
该程序应该是基于PIC单片机的,采用的是887芯片,暂时没有找到pic板块,就这样了、
附件KS为proteus仿真图
DS1302为C程序

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

单片机源程序如下:
  1. /*
  2. * File:   DS1302.c
  3. * Author: WillForest
  4. *
  5. * Created on 2017年4月11日, 下午9:18
  6. */


  7. #include <xc.h>

  8. // #pragma config statements should precede project file includes.
  9. // Use project enums instead of #define for ON and OFF.

  10. // CONFIG1
  11. #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
  12. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
  13. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  14. #pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
  15. #pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
  16. #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
  17. #pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
  18. #pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
  19. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
  20. #pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

  21. // CONFIG2
  22. #pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
  23. #pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


  24. #define DATA 1  //LCD写数据时为1
  25. #define COM 0  //LCD写命令时为0
  26. #define LINE1 0b10000000
  27. #define LINE2 0b11000000
  28. #define LCD_E RD2  
  29. #define LCD_RW RD1  
  30. #define LCD_RS RD0
  31. #define DQ RA0
  32. #define DQ_IO TRISA0
  33. #define RST RE0
  34. #define CLK RE1
  35. #define DAT RE2
  36. #define DELAY_5US() \

  37. void WriteDs1302(unsigned char addr, unsigned char code);
  38. unsigned char ReadDs1302(unsigned addr);
  39. void TimeCahr(void);
  40. void Ds1302Init(void);
  41. unsigned char ReadByte(void);
  42. void WriteByte(unsigned char data);
  43. char TopChar[16];
  44. void LCD_CSH(void);//初始化
  45. void LCD_BUSY(void);//检测LCD是否忙
  46. void LCD_WRITE(char,char);//LCD写1字节,命令或数据
  47. void LCD_WRITE_4(char,char);//LCD写半字节
  48. char LCD_READ(void);//读LCD,忙检测用
  49. void DELAY(unsigned int);
  50. void DELAY_US(char);
  51. int READ_DS18B20(void);
  52. void WRITE_BYTE(char A);
  53. char READ_BYTE(void);
  54. void ONE_WIRE_RESET(void);
  55. void DQ_ONE_BIT(char A);
  56. void READ_SLOT(void);
  57. void DISP_T(int R1);
  58. void BCD(int R1);
  59. void CSH(void);
  60. void CSH_DS1307(void);
  61. void DS1307_WRITE(char addr,char data);

  62. void WEEK(char we);
  63. int READ_DS18B20(void);
  64. void BCD(int R1);
  65. void LCD_RUN(int R1);
  66. void NZ_RUN1(int R1);
  67. void NZ_RUN2(int R1);
  68. void NZ_RUN3(int R1);
  69. void NZ_RUN4(int R1);
  70. void JS(int R1);
  71. void N_B(void);
  72. void Y_B(void);
  73. void R_B(void);
  74. void S_B(void);
  75. void F_B(void);
  76. void M_B(void);
  77. unsigned char C[16];
  78. unsigned char D[16];
  79. int N=0,Y=0,R=0,S=0,F=0,M=0,XQ;
  80. int NN1=0,YY1=0,RR1=0,SS1=0,FF1=0,MM1=0;//修改当前日期差值
  81. int N2=0,Y2=1,R2=1,S2=0,F2=0,M2=0;//设置目标日期差值
  82. int MB,MQ,YS;//时间转化
  83. char RL;//左右移
  84. int RUN=0;//修改位置
  85. char NZ=0;//闹钟时钟的判断
  86. char EX;
  87. char i;
  88. int T;
  89. int WW,QW,BW,SW,GW;



  90. void main(void)
  91. {  CSH();
  92. DELAY(30);
  93. LCD_CSH();       
  94. Ds1302Init();//时钟设置?
  95.     while(1)
  96.     { TimeCahr();//时间转换
  97. N=TopChar[0]*10+TopChar[1];
  98. Y=TopChar[2]*10+TopChar[3];
  99. R=TopChar[4]*10+TopChar[5];
  100. XQ=1;
  101. S=TopChar[6]*10+TopChar[7];
  102. F=TopChar[8]*10+TopChar[9];
  103. M=TopChar[10]*10+TopChar[11];
  104. T=READ_DS18B20();
  105. if(RB2==0) {DELAY(200);if(RB2==1) RUN--;}
  106. if(RB3==0) {DELAY(200);if(RB3==1) RUN++;}
  107. if(RB4==0) {DELAY(200);if(RB4==1) if(NZ==1) NZ=0; else NZ=1;}
  108. if(NZ==0)
  109. {{if(RUN==-1) RUN=6;RUN=RUN%7;
  110. if(RB0==0) {DELAY(200);if(RB0==1) NZ_RUN1(RUN);}
  111. if(RB1==0) {DELAY(200);if(RB1==1) NZ_RUN2(RUN);}}
  112. N=N+NN1;
  113. if((N%4)==0) EX=1;else EX=0;
  114. Y=Y+YY1;
  115. R=R+RR1;
  116. if(N%4==0)
  117. {if(Y==1) MQ=0;
  118. if(Y==2) MQ=31;
  119. if(Y==3) MQ=60;
  120. if(Y==4) MQ=91;
  121. if(Y==5) MQ=121;
  122. if(Y==6) MQ=152;
  123. if(Y==7) MQ=182;
  124. if(Y==8) MQ=213;
  125. if(Y==9) MQ=244;
  126. if(Y==10) MQ=274;
  127. if(Y==11) MQ=305;
  128. if(Y==12) MQ=335;
  129. }
  130. if(N%4!=0)
  131. {if(Y==1) MQ=0;
  132. if(Y==2) MQ=31;
  133. if(Y==3) MQ=59;
  134. if(Y==4) MQ=90;
  135. if(Y==5) MQ=120;
  136. if(Y==6) MQ=151;
  137. if(Y==7) MQ=181;
  138. if(Y==8) MQ=212;
  139. if(Y==9) MQ=243;
  140. if(Y==10) MQ=273;
  141. if(Y==11) MQ=304;
  142. if(Y==12) MQ=334;
  143. }
  144. MQ=(MQ+R+(N/4)+1+N*365);
  145. if(N2%4==0)
  146. {if(Y2==1) MB=0;
  147. if(Y2==2) MB=31;
  148. if(Y2==3) MB=60;
  149. if(Y2==4) MB=91;
  150. if(Y2==5) MB=121;
  151. if(Y2==6) MB=152;
  152. if(Y2==7) MB=182;
  153. if(Y2==8) MB=213;
  154. if(Y2==9) MB=244;
  155. if(Y2==10) MB=274;
  156. if(Y2==11) MB=305;
  157. if(Y2==12) MB=335;
  158. }
  159. if(N2%4!=0)
  160. {if(Y2==1) MB=0;
  161. if(Y2==2) MB=31;
  162. if(Y2==3) MB=59;
  163. if(Y2==4) MB=90;
  164. if(Y2==5) MB=120;
  165. if(Y2==6) MB=151;
  166. if(Y2==7) MB=181;
  167. if(Y2==8) MB=212;
  168. if(Y2==9) MB=243;
  169. if(Y2==10) MB=273;
  170. if(Y2==11) MB=304;
  171. if(Y2==12) MB=334;
  172. }
  173. MB=(MB+R2+(N2/4)+1+N2*365);
  174. MB=(MB-MQ);
  175. BCD(N);
  176. D[0]=2;D[1]=0;D[2]=SW;D[3]=GW;D[4]=-3;
  177. BCD(Y);
  178. D[5]=SW;D[6]=GW;D[7]=-3;
  179. BCD(R);
  180. D[8]=SW;D[9]=GW;
  181. XQ=6;
  182. XQ=XQ+MQ;
  183. XQ=XQ%7;
  184. if(XQ==0) XQ=7;
  185. WEEK(XQ);
  186. if(MB<0) {D[13]=21;D[14]=34;D[15]=34;}
  187. if(MB>=0) {BCD(MB); D[13]=BW;D[14]=SW;D[15]=GW;}}
  188. if(NZ==1)
  189. {{if(RUN==-1) RUN=3;RUN=RUN%4;
  190. if(RB0==0) {DELAY(200);if(RB0==1) NZ_RUN3(RUN);}
  191. if(RB1==0) {DELAY(200);if(RB1==1) NZ_RUN4(RUN);}
  192. BCD(N2);
  193. D[2]=SW;D[3]=GW;
  194. BCD(Y2);
  195. D[5]=SW;D[6]=GW;D[7]=-3;
  196. BCD(R2);
  197. D[8]=SW;D[9]=GW;D[10]=85;D[11]=85;D[12]=85;D[13]=85;D[14]=85;D[15]=85;
  198. }}

  199. LCD_WRITE(LINE1,COM);
  200. for(i=0;i<16;i++) LCD_WRITE(D[i]+'0',DATA);
  201. S=S+SS1;
  202. F=F+FF1;
  203. if(F==60) F=0;
  204. M=M+MM1;
  205. if(M==60) M=0;
  206. BCD(S);
  207. C[0]=SW;C[1]=GW;C[2]=10;
  208. BCD(F);
  209. C[3]=SW;C[4]=GW;C[5]=10;
  210. BCD(M);
  211. C[6]=SW;C[7]=GW;C[8]=85;

  212. DISP_T(T);

  213. C[12]=175;C[13]=19;C[14]=85;
  214. LCD_RUN(RUN);
  215. LCD_WRITE(LINE2,COM);
  216. for(i=0;i<16;i++) LCD_WRITE(C[i]+'0',DATA);
  217.    
  218. }
  219.     }

  220. //子程序DISP_T用来LCD第一行显示所测的温度值“T=   ℃”
  221. void DISP_T(int R1)
  222. {
  223.         int R2;
  224. if(R1>=0)
  225. {BCD(R1);
  226. C[9]=85;C[10]=SW;C[11]=GW;
  227. }
  228. else
  229. { R2=~R1+1;
  230. BCD(R2);
  231. C[9]=-3;C[10]=SW;C[11]=GW;       
  232. }
  233. }
  234. //读取DS18B20的温度值
  235. int READ_DS18B20(void)
  236. {
  237.         int R1;
  238.         ONE_WIRE_RESET();   //1-WIRE复位
  239.     WRITE_BYTE(0xCC);   //直接访问RAM
  240.     WRITE_BYTE(0x44);   //温度转换
  241.     DELAY(100);         //9位分辨率转换时间为93.75ms

  242.     ONE_WIRE_RESET();   //1-WIRE复位
  243.     WRITE_BYTE(0xCC);   //直接访问RAM
  244.     WRITE_BYTE(0xBE);   //读取RAM中的数据,只读温度值
  245.     R1=READ_BYTE();     //读取低字节
  246.     R1=R1+(READ_BYTE()<<8);//读取高字节
  247.     R1=R1>>4;//右移四位,取温度值的整数
  248.     return(R1);//返回R1
  249. }
  250. //1-wire器件复位
  251. void ONE_WIRE_RESET(void)
  252. {
  253.         DQ_IO=1;    //先置DQ高电平
  254.         NOP();      //
  255.         DQ_IO=0;    //
  256.         DQ=0;        //强制拉DQ至低电平
  257.         DELAY_US(49);
  258.         DQ_IO=1;     //释放DQ线
  259.         while(DQ==1);//等待DS18B20应答
  260.         DELAY_US(49);
  261. }

  262. //DS18B20写字节
  263. void WRITE_BYTE(char R1)//写一字节
  264. {
  265. char i,j;
  266. for(i=0;i<8;i++)     //写八位数据
  267.         {
  268.         if((R1&0x01)==0x01)
  269.         j=1;
  270.         else
  271.         j=0;
  272.         R1=R1>>1;
  273.         DQ_ONE_BIT(j);
  274.         }
  275. }


  276. //DS18B20读字节
  277. char READ_BYTE(void)//读一字节
  278. {
  279. char i,R1;
  280. R1=0;
  281. for(i=0;i<8;i++)
  282. {
  283. R1=R1>>1;
  284. READ_SLOT();
  285. if(DQ==1)
  286. R1+=0x80;
  287. DELAY_US(4);
  288. }
  289. return(R1);
  290. }


  291. //DS18B20写1个字节
  292. void DQ_ONE_BIT(char R1)
  293. {
  294. if(R1==1)
  295. {
  296. DQ_IO=0;
  297. DQ=0;
  298. DELAY_5US();
  299. DQ_IO=1;
  300. DELAY_US(6);
  301. }
  302. else
  303. {
  304. DQ_IO=0;
  305. DQ=0;
  306. DELAY_US(7);
  307. DQ_IO=1;
  308. }
  309. }


  310. //时隙函数
  311. void READ_SLOT(void)
  312. {
  313. DQ_IO=0;
  314. DQ=0;
  315. NOP();
  316. NOP();
  317. DQ_IO=1;
  318. NOP();
  319. NOP();
  320. }


  321. void BCD(int R1)
  322. { WW=0;QW=0;BW=0;SW=0;GW=0;
  323.     while(R1>=10000)
  324.        {R1-=10000;WW++;}
  325. while(R1>=1000)
  326.        {R1-=1000;QW++;}
  327. while(R1>=100)
  328.        {R1-=100;BW++;}
  329. while(R1>=10)
  330.        {R1-=10;SW++;}
  331. GW=R1;
  332. }

  333. void LCD_CSH(void)
  334. {   
  335.     DELAY(20);      
  336.     LCD_WRITE_4(0b0011,COM);   
  337.     DELAY(5);      
  338.     LCD_WRITE_4(0b0011,COM);   
  339.     DELAY_US(10);     
  340.     LCD_WRITE_4(0b0011,COM);   
  341.     DELAY_US(10);      
  342.     LCD_WRITE_4(0b0010,COM);     
  343.     LCD_BUSY();      
  344.     LCD_WRITE(0b00101000,COM);
  345.     LCD_WRITE(0b00001100,COM);   
  346.     LCD_WRITE(0b00000001,COM);  
  347.     DELAY(2);  
  348.     LCD_WRITE(0b00000110,COM);   
  349. }

  350. void LCD_WRITE_4(char R1,char FLAG)
  351. {
  352.     LCD_RW=0;NOP();   
  353.     LCD_RS=FLAG;NOP();
  354.     PORTD &= 0x0F;NOP();
  355.     LCD_E=1;NOP();
  356.     R1=R1<<4;
  357.     PORTD |=R1;NOP();  
  358.     LCD_E=0;NOP();   
  359.     LCD_RS=0;NOP();  
  360.     PORTD &= 0x0F;
  361. }

  362. void LCD_WRITE(char R1,char FLAG)
  363. {
  364.     char R2;   
  365.     LCD_BUSY();  
  366.     R2=R1&0xF0;
  367.     R2=R2>>4;
  368.     LCD_WRITE_4(R2,FLAG);
  369.     R2=R1&0x0F;
  370.     LCD_WRITE_4(R2,FLAG);
  371.     DELAY_US(10);
  372. }

  373. char LCD_READ(void)
  374. {
  375.     unsigned char R1;   
  376.     LCD_RS=0;   
  377.     LCD_RW=1;NOP();   
  378.     LCD_E=1;NOP();  
  379.     R1=0;  
  380.     R1=(PORTD<<4)&0x0F;   
  381.     LCD_E=0;NOP();  
  382.     LCD_E=1;NOP();
  383.     R1 |= (PORTD & 0x0F);   
  384.     LCD_E=0;NOP();   
  385.     LCD_RW=0;   
  386.     return (R1);
  387. }

  388. void LCD_BUSY(void)
  389. {
  390.     unsigned char R1;
  391.     while(1)
  392.     {
  393.         R1=LCD_READ();
  394.         if((R1&0x80)==0x00)
  395.             break;
  396.     };
  397. }

  398. void DELAY(unsigned int n)
  399. {
  400.     unsigned int j;  
  401.     char k;  
  402.     for (j=0;j<n;j++)   
  403.         for (k=246;k>0;k--)
  404.             NOP();
  405. }
  406. void DELAY_US(char n)
  407. {
  408.     char j;  
  409.     for (j=0;j<n;j++)   
  410.     {
  411.         NOP();NOP();
  412.     }
  413. }

  414. void N_B(void)
  415. {if((N+NN1)>99) NN1=99;
  416. if((N+NN1)<01) NN1=1;
  417. }
  418. void Y_B(void)
  419. {if((Y+YY1)>12) YY1=YY1-12;
  420. if((Y+YY1)<1) YY1=YY1+12;
  421. if((Y+YY1)==2) {if(EX==0) {if((R+RR1)>28) RR1=28-R;}
  422.                 if(EX==1) {if((R+RR1)>29) RR1=29-R;}}
  423. }
  424. void R_B(void)
  425. {
  426. if(Y==1) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  427. if(Y==2) {if(EX==0) {if((R+RR1)>28) RR1=28-R;if((R+RR1)<=0) RR1=28+R;}
  428.           if(EX==1) {if((R+RR1)>29) RR1=29-R;if((R+RR1)<=0) RR1=29+R;}}
  429. if(Y==3) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  430. if(Y==4) {if((R+RR1)>30) RR1=30-R;if((R+RR1)<=0) RR1=30+R;}
  431. if(Y==5) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  432. if(Y==6) {if((R+RR1)>30) RR1=30-R;if((R+RR1)<=0) RR1=30+R;}
  433. if(Y==7) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  434. if(Y==8) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  435. if(Y==9) {if((R+RR1)>30) RR1=30-R;if((R+RR1)<=0) RR1=30+R;}
  436. if(Y==10) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  437. if(Y==11) {if((R+RR1)>30) RR1=30-R;if((R+RR1)<=0) RR1=30+R;}
  438. if(Y==12) {if((R+RR1)>31) RR1=31-R;if((R+RR1)<=0) RR1=31+R;}
  439. }
  440. void S_B(void)
  441. {if((S+SS1)>24) SS1=SS1-24;
  442. if((S+SS1)<0) SS1=SS1+24;
  443. }
  444. void F_B(void)
  445. {
  446. if((F+FF1)>60) FF1=FF1-60;
  447. if((F+FF1)<0) FF1=FF1+60;
  448. }
  449. void M_B(void)
  450. {if((M+MM1)>60) MM1=MM1-60;
  451. if((M+MM1)<0) MM1=MM1+60;
  452. }
  453. void NZ_RUN1(int R1)
  454. {switch(R1)
  455. {
  456. case 1: NN1=NN1+1;N_B();break;
  457. case 2: YY1=YY1+1;Y_B(); break;
  458. case 3: RR1=RR1+1;R_B();break;
  459. case 4: SS1=SS1+1;S_B();break;
  460. case 5: FF1=FF1+1;F_B();break;
  461. case 6: MM1=MM1+1;M_B();break;
  462. case 0: break;

  463. }
  464. }
  465. void NZ_RUN2(int R1)
  466. {switch(R1)
  467. {
  468. case 1: NN1=NN1-1;N_B();break;
  469. case 2: YY1=YY1-1;Y_B();  break;
  470. case 3: RR1=RR1-1;R_B();break;
  471. case 4: SS1=SS1-1;S_B();break;
  472. case 5: FF1=FF1-1;F_B();break;
  473. case 6: MM1=MM1-1;M_B();break;
  474. case 0: break;
  475. }
  476. }

  477. void NZ_RUN3(int R1)
  478. {
  479.     switch(R1)
  480. {
  481. case 1: N2++;if(N2>100)  N2=N2-100;break;
  482. case 2: Y2++;if(Y2>12) Y2=Y2-12;if(Y2==2) {if((N2%4)!=0) {if(R2>28) R2=28;}if((N2%4)==0) {if(R2>29) R2=29;}} break;
  483. case 3: R2++;
  484. {if(Y2==1) {if(R2>31) R2=R2-31;}
  485. if(Y2==2) {if((N2%4)!=0) {if(R2>28) R2=R2-28;}
  486.            if((N2%4)==0) {if(R2>29) R2=R2-29;}}
  487. if(Y2==3) {if(R2>31) R2=R2-31;}
  488. if(Y2==4) {if(R2>30) R2=R2-30;}
  489. if(Y2==5) {if(R2>31) R2=R2-31;}
  490. if(Y2==6) {if(R2>30) R2=R2-30;}
  491. if(Y2==7) {if(R2>31) R2=R2-31;}
  492. if(Y2==8) {if(R2>31) R2=R2-31;}
  493. if(Y2==9) {if(R2>30) R2=R2-30;}
  494. if(Y2==10) {if(R2>31) R2=R2-31;}
  495. if(Y2==11) {if(R2>30) R2=R2-30;}
  496. if(Y2==12) {if(R2>31) R2=R2-31;}}break;
  497. case 0: break;
  498.     }
  499. }
  500. void NZ_RUN4(int R1)
  501. {switch(R1)
  502. {
  503. case 1: N2--;if(N2<0)  N2=N2+100;break;
  504. case 2: Y2--;if(Y2<1) Y2=Y2+12;if(Y2==2) {if((N2%4)!=0) {if(R2>28) R2=28;}if((N2%4)==0) {if(R2>29) R2=29;}} break;
  505. case 3: R2--;
  506. {if(Y2==1) {if(R2<1) R2=31+R2;}
  507. if(Y2==2) {if((N2%4)!=0) {if(R2<1) R2=28+R2;}
  508.           if((N2%4)==0) {if(R2<1) R2=29+R2;}}
  509. if(Y2==3) {if(R2<1) R2=31+R2;}
  510. if(Y2==4) {if(R2<1) R2=30+R2;}
  511. if(Y2==5) {if(R2<1) R2=31+R2;}
  512. if(Y2==6) {if(R2<1) R2=30+R2;}
  513. if(Y2==7) {if(R2<1) R2=31+R2;}
  514. if(Y2==8) {if(R2<1) R2=31+R2;}
  515. if(Y2==9) {if(R2<1) R2=30+R2;}
  516. if(Y2==10) {if(R2<1) R2=31+R2;}
  517. if(Y2==11) {if(R2<1) R2=30+R2;}
  518. if(Y2==12) {if(R2<1) R2=31+R2;}}break;
  519. case 0: break;
  520. }
  521. }
  522. void LCD_RUN(int R1)
  523. {
  524. switch(R1)
  525. {
  526. case 1:C[15]=30;break;
  527. case 2:C[15]=41;break;
  528. case 3:C[15]=34;break;
  529. case 4:C[15]=35;break;
  530. case 5:C[15]=22;break;
  531. case 6:C[15]=29;break;
  532. case 0:C[15]=85;break;
  533. }
  534. }
  535. void WEEK(char we)
  536. {        switch(we)
  537.                 {
  538.                         case 1:        D[10]=35;
  539.                                         D[11]=37;
  540.                                         D[12]=30;
  541.                                         break;       
  542.                         case 2:        D[10]=29;
  543.                                         D[11]=31;
  544.                                         D[12]=30;
  545.                                         break;
  546.                         case 3:        D[10]=36;
  547.                                         D[11]=37;
  548.                                         D[12]=21;
  549.                                         break;       
  550.                         case 4:        D[10]=39;
  551.                                         D[11]=21;
  552.                                         D[12]=20;
  553.                                         break;       
  554.                         case 5:        D[10]=36;
  555.                                         D[11]=24;
  556.                                         D[12]=37;
  557.                                         break;       
  558.                         case 6:        D[10]=22;
  559.                                         D[11]=34;
  560.                                         D[12]=41;
  561.                                         break;
  562.                         case 7:        D[10]=35;
  563.                                         D[11]=17;
  564.                                         D[12]=36;
  565.                                         break;       
  566. }
  567. }

  568. //======主程序初始化=======

  569. void CSH(void)
  570. {   ANSEL=0x00;
  571.     ANSELH=0x00;
  572.     TRISA=0x00;
  573.     TRISD=0b00000000;
  574.     TRISE=0x00;
  575.     TRISB=0b11111111;                                                                                                                                                                                                                                                                                        0100000;     //允许B口高四位电平变化中断
  576.      OPTION_REG=0b00000000;  
  577.     INTCON=0b11000000; T1CON=0b00110001;
  578.     WPUB=0xFF;
  579. }

  580. unsigned char ReadDs1302(unsigned addr)
  581. {
  582. unsigned char code;
  583. RST = 0;//便能清零
  584. CLK = 0;//时钟清零
  585. RST = 1;
  586. WriteByte(addr | 0x01);//写入地址
  587. code = ReadByte();//读取数据
  588. CLK = 1;//时钟置位
  589. RST = 0;//便能失效
  590. return code;//返回数据
  591. }
  592. void WriteDs1302(unsigned char addr, unsigned char code)
  593. {RST = 0;//便能清零
  594. CLK = 0; //时钟清零
  595. RST = 1;
  596. WriteByte(addr & 0xfe); //写入地址
  597. WriteByte(code); //写入数据
  598. CLK = 1; //时钟置位
  599. RST = 0; //便能失效
  600. ……………………

  601. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载(程序与proteus仿真图):
KS.zip (20.72 KB, 下载次数: 50)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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