找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2072|回复: 0
收起左侧

蓝桥杯单片机组 第七届“电压、频率采集设备”源代码

[复制链接]
ID:228305 发表于 2018-6-14 17:46 | 显示全部楼层 |阅读模式
蓝桥杯单片机组 第七届“电压、频率采集设备”源代码
包括主函数,驱动函数等。

  1. #include<stc15f2k60s2.h>
  2. #include<deputy.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xbf,0XFF};
  6. uchar yi,er,san,si,wu,liu,qi,ba;
  7. uchar num,flag;
  8. uint t = 0;
  9. uint intr = 0;
  10. bit s_flag;
  11. unsigned int zheng=0,fan=0,zheng_now=0,fan_now=0,time,freq;
  12. uchar t_flag=0;
  13. uchar low ,high;
  14. uint num_p;
  15. uchar jia=0,jian=0;
  16. uchar shizhong=1,dianya=0,pinlv=0,chaxun=0,gongneng=0;
  17. uint vol=0;
  18. uchar shangxian,xiaxian;
  19. uchar shan=0;
  20. uchar cun_shi,cun_fen,cun_miao,cun_lei;
  21. void delayms(uint ms);
  22. void allinit(void);
  23. void keyscan(void);
  24. void display1(uchar yi,uchar er);
  25. void display2(uchar san,uchar si);
  26. void display3(uchar wu,uchar liu);
  27. void display4(uchar qi,uchar ba);
  28. //void send_wave(void);
  29. void Timer0Init(void);          //5US
  30. void Timer1Init(void);         //2MS
  31. // extern unsigned char shijian[];

  32. void main()
  33. {
  34. allinit();
  35. yi=0,er=6,san=10,si=5,wu=9;liu=10,qi=0,ba=0;
  36. //        EEPROM_write(0x00,20);delayms(2);
  37. //        EEPROM_write(0x01,10);delayms(2); //只初始化一次,之后注释掉
  38. shangxian=EEPROM_Read(0x00);delayms(2);
  39. xiaxian=EEPROM_Read(0x01);delayms(2);
  40. DS_init();
  41. Timer0Init();
  42. Timer1Init();
  43. EA=1;
  44. ET1=1;
  45. while(1)
  46. {
  47. DS_get();
  48. /****************时钟************************/
  49. if (shizhong==1)
  50. {


  51. if(gongneng==0)
  52. {
  53. yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;
  54. wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
  55. }
  56. else if(gongneng==1)
  57. {
  58. if(shijian[0]%2==0)
  59. {
  60. yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;
  61. wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
  62. }
  63. else if(shijian[0]%2==1)
  64. {
  65. yi=11;er=11;san=10;
  66. si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
  67. }
  68. if(jia==1)
  69. {
  70. jia=0;
  71. shijian[2]=shijian[2]+1;
  72. DS_init();
  73. }
  74. if(jian==1)
  75. {
  76. jian=0;
  77. shijian[2]=shijian[2]-1;
  78. DS_init();
  79. }
  80. }
  81. else if(gongneng==2)
  82. {
  83. if(shijian[0]%2==0)
  84. {
  85. yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;
  86. wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
  87. }
  88. else if(shijian[0]%2==1)
  89. {
  90. yi=shijian[2]/10;er=shijian[2]%10;san=10;si=11;
  91. wu=11;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
  92. }
  93. if(jia==1)
  94. {
  95. jia=0;
  96. shijian[1]=shijian[1]+1;
  97. DS_init();
  98. }
  99. if(jian==1)
  100. {
  101. jian=0;
  102. shijian[1]=shijian[1]-1;
  103. DS_init();
  104. }
  105. }
  106. else if(gongneng==3)
  107. {
  108. if(shijian[0]%2==0)
  109. {
  110. yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;
  111. wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
  112. }
  113. else if(shijian[0]%2==1)
  114. {       
  115. yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;
  116. wu=shijian[1]%10;liu=10;qi=11;ba=11;
  117. }
  118. if(jia==1)
  119. {
  120. jia=0;
  121. shijian[0]=shijian[0]+1;
  122. DS_init();
  123. }
  124. if(jian==1)
  125. {
  126. jian=0;
  127. shijian[0]=shijian[0]-1;
  128. DS_init();
  129. }
  130. }
  131. }
  132. /****************电压)************************/
  133. else if (dianya==1)
  134. {
  135. vol=EEPROM_Read(0x03)*19.6;        //1000/51
  136. if(gongneng==0)
  137. {
  138. yi=10;er=1;san=10;si=11;
  139. wu=vol/1000;liu=vol%1000/100;qi=vol%100/10;ba=vol%10;
  140. }
  141. else if(gongneng==1)
  142. {
  143. if(shan<100)
  144. {
  145. shan++;
  146. yi=shangxian/10;er=shangxian%10;
  147. wu=xiaxian/10;liu=xiaxian%10;san=0;si=0;qi=0;ba=0;
  148. }
  149. else if(shan>=100)
  150. {
  151. shan++;
  152. if(shan==200) shan=0;
  153. yi=11;er=11;wu=xiaxian/10;liu=xiaxian%10;san=11;si=11;
  154. }
  155. if(jia==1)
  156. {
  157. jia=0;
  158. shangxian=shangxian+5;
  159. EEPROM_write(0x00,shangxian) ;delayms(2);
  160. }
  161. if(jian==1)
  162. {
  163. jian=0;
  164. shangxian=shangxian-5;
  165. EEPROM_write(0x00,shangxian) ;delayms(2);

  166. }
  167. }
  168. else if(gongneng==2)
  169. {

  170. if(shan<100)
  171. {
  172. shan++;
  173. yi=shangxian/10;er=shangxian%10;
  174. wu=xiaxian/10;liu=xiaxian%10;san=0;si=0;qi=0;ba=0;
  175. }
  176. else if(shan>=100)
  177. {
  178. shan++;
  179. if(shan==200) shan=0;
  180. yi=shangxian/10;er=shangxian%10;
  181. wu=11;liu=11;qi=11;ba=11;
  182. }
  183. if(jia==1)
  184. {
  185. jia=0;
  186. xiaxian=xiaxian+5;
  187. EEPROM_write(0x01,xiaxian) ;delayms(2);

  188. }
  189. if(jian==1)
  190. {
  191. jian=0;
  192. xiaxian=xiaxian-5;
  193. EEPROM_write(0x01,xiaxian) ;delayms(2);

  194. }
  195. }
  196. if((vol>shangxian)&&(EEPROM_Read(0x13)!=1))
  197. {
  198. EEPROM_write(0x10,shijian[2]);delayms(2);
  199. EEPROM_write(0x11,shijian[1]);delayms(2);
  200. EEPROM_write(0x12,shijian[0]);delayms(2);
  201. EEPROM_write(0x13,0);delayms(2);

  202. }
  203. if((vol<xiaxian)&&(EEPROM_Read(0x13)!=0))
  204. {
  205. EEPROM_write(0x10,shijian[2]);delayms(2);
  206. EEPROM_write(0x11,shijian[1]);delayms(2);
  207. EEPROM_write(0x12,shijian[0]);delayms(2);
  208. EEPROM_write(0x13,0);delayms(2);

  209. }
  210. }




  211. /****************频率************************/

  212. else if (pinlv==1)
  213. {
  214. yi=10;er=2;san=10;
  215. time=(zheng_now+fan_now)*5;
  216. freq=1000000/time;
  217. if(gongneng==0)
  218. {
  219. si=freq/10000;wu=freq%10000/1000;
  220. liu=freq%1000/100;qi=freq%100/10;ba=freq%10;
  221. }
  222. else  if(gongneng==1)
  223. {
  224. si=time/10000;wu=time%10000/1000;
  225. liu=time%1000/100;qi=time%100/10;ba=time%10;
  226. }
  227. }
  228. /****************查询************************/

  229. else  if (chaxun==1)
  230. {
  231. if(gongneng==0)
  232. {
  233. yi=11;er=11;san=11;si=11;
  234. wu=11;liu=11;qi=cun_lei/10;ba=cun_lei%10;
  235. }
  236. else if(gongneng==1)
  237. {
  238. san=10;        liu=10;
  239. yi=cun_shi/10;er=cun_shi%10;si=cun_fen/10;
  240. wu=cun_fen%10;qi=cun_miao/10;ba=cun_miao%10;
  241. }
  242. }
  243. keyscan();
  244. display1(yi,er);
  245. display2(san,si);
  246. display3(wu,liu);
  247. display4(qi,ba);
  248. }
  249. }

  250. /****************矩阵按键************************/

  251. void keyscan()
  252. {
  253.         uchar temp;
  254.         P3=0XFF;P4=0XEF;
  255.         //P44=0;P42=1;P30=1;P31=1;P32=1;P33=1;
  256.         temp=P3;
  257.         temp=temp&0x1f;
  258.         while(temp!=0x1f)
  259.         {
  260.                 delayms(1);
  261.                 temp=P3;
  262.                 temp=temp&0x1f;
  263.                 while(temp!=0x1f)
  264.                 {
  265.                         temp=P3;
  266.                         switch(temp)
  267.                         {
  268.                                 case 0xfe:shizhong=1,dianya=0,pinlv=0,chaxun=0,gongneng=0;break;
  269.                                 case 0xfd:shizhong=0,dianya=1,pinlv=0,chaxun=0,gongneng=0;break;
  270.                                 case 0xfb:shizhong=0,dianya=0,pinlv=1,chaxun=0,gongneng=0;break;
  271.                                 case 0xf7:
  272.                                          if (shizhong==1)
  273.                                          {
  274.                                                  if (gongneng==0) gongneng=1;
  275.                                                 else if(gongneng==1) gongneng=2;
  276.                                                 else if(gongneng==2) gongneng=3;
  277.                                                 else if(gongneng==3) gongneng=0;
  278.                                          }
  279.                                          if (dianya==1)
  280.                                          {
  281.                                                  if (gongneng==0) gongneng=1;
  282.                                                 else if(gongneng==1) gongneng=2;
  283.                                                 else if(gongneng==2) gongneng=1;
  284.                                          }
  285.                                          if (pinlv==1)
  286.                                          {
  287.                                                  if (gongneng==0) gongneng=1;
  288.                                                 else if(gongneng==1) gongneng=0;
  289.                                        
  290.                                          }
  291.                                          if (chaxun==1)
  292.                                          {
  293.                                                  if (gongneng==0) gongneng=1;
  294.                                                 else if(gongneng==1) gongneng=0;
  295.                                        
  296.                                          }
  297.                                 break;
  298.                                
  299.                         }
  300.                         while(temp!=0x1f)
  301.                         {
  302.                                 temp=P3;
  303.                                 temp=temp&0x1f;
  304.                         }
  305.                 }
  306.         }
  307.        
  308.         P3=0XFF;P4=0XFB;
  309.         temp=P3;
  310.         temp=temp&0x1f;
  311.         while(temp!=0x1f)
  312.         {
  313.                 delayms(1);
  314.                 temp=P3;
  315.                 temp=temp&0x1f;
  316.                 while(temp!=0x1f)
  317.                 {
  318.                         temp=P3;
  319.                         switch(temp)
  320.                         {
  321.                                 case 0xfe:jia=1;break;
  322.                                 case 0xfd:jian=1;break;
  323.                                 case 0xfb:shizhong=0,dianya=0,pinlv=0,chaxun=1,gongneng=0;
  324.                                 cun_shi=EEPROM_Read(0x10);delayms(2);
  325.                                 cun_fen=EEPROM_Read(0x11);delayms(2);
  326.                                 cun_miao=EEPROM_Read(0x12);delayms(2);
  327.                                 cun_lei=EEPROM_Read(0x13);delayms(2);
  328.                                 break;
  329.                        
  330.                                
  331.                         }
  332.                        
  333.                         while(temp!=0x1f)
  334.                         {
  335.                                 temp=P3;
  336.                                 temp=temp&0x1f;
  337.                         }
  338.                 }
  339.         }
  340.        
  341. //        P3=0XDF;
  342. //        temp=P3;
  343. //        temp=temp&0x1f;
  344. //        while(temp!=0x0f)
  345. //        {
  346. //                delayms(2);
  347. //                temp=P3;
  348. //                temp=temp&0x0f;
  349. //                while(temp!=0x0f)
  350. //                {
  351. //                        temp=P3;
  352. //                        switch(temp)
  353. //                        {
  354. //                                case 0xde:;break;
  355. //                                case 0xdd:;break;
  356. //                                case 0xdb:break;
  357. //                                case 0xd7:break;
  358. //                        }
  359. //                        while(temp!=0x0f)
  360. //                        {
  361. //                                temp=P3;
  362. //                                temp=temp&0x0f;
  363. //                        }
  364. //                }
  365. //        }
  366. //       
  367. //        P3=0XEF;
  368. //        temp=P3;
  369. //        temp=temp&0x0f;
  370. //        while(temp!=0x0f)
  371. //        {
  372. //                delayms(2);
  373. //                temp=P3;
  374. //                temp=temp&0x0f;
  375. //                while(temp!=0x0f)
  376. //                {
  377. //                        temp=P3;
  378. //                        switch(temp)
  379. //                        {
  380. //                                case 0xee:break;
  381. //                                case 0xed:break;
  382. //                                case 0xeb:break;
  383. //                                case 0xe7:break;
  384. //                        }
  385. //                        while(temp!=0x0f)
  386. //                        {
  387. //                                temp=P3;
  388. //                                temp=temp&0x0f;
  389. //                        }
  390. //                }
  391. //        }
  392. }
  393. /****************初始化************************/

  394. void allinit(void)
  395. {
  396.         P2=0XA0;
  397.         P0=0X00; //关闭蜂鸣器

  398.         P2=0X80;
  399.         P0=0XFF;//关闭LED

  400.         P2=0XC0;
  401.         P0=0XFF;//选择数码管
  402.         P2=0XFF;
  403.         P0=0XFF; //关闭数码管
  404. }


  405. void display1(uchar yi,uchar er)
  406. {
  407.           P2=0XC0;
  408.           P0=0X01;//选择数码管
  409.              P2=0XFF;
  410.           P0=tab[yi];
  411.           delayms(1);

  412.           P2=0XC0;
  413.           P0=0X02;//选择数码管
  414.              P2=0XFF;
  415.           P0=tab[er];
  416.           delayms(1);
  417. }

  418. void display2(uchar san,uchar si)
  419. {
  420.           P2=0XC0;
  421.           P0=0X04;//选择数码管
  422.              P2=0XFF;
  423.           P0=tab[san];
  424.           delayms(1);

  425.           P2=0XC0;
  426.           P0=0X08;//选择数码管
  427.              P2=0XFF;
  428.           P0=tab[si];
  429.           delayms(1);
  430. }

  431. void display3(uchar wu,uchar liu)
  432. {
  433.           P2=0XC0;
  434.           P0=0X10;//选择数码管
  435.              P2=0XFF;
  436.           P0=tab[wu];
  437.           delayms(1);

  438.           P2=0XC0;
  439.           P0=0X20;//选择数码管
  440.              P2=0XFF;
  441.           P0=tab[liu];
  442.           delayms(1);
  443. }

  444. void display4(uchar qi,uchar ba)
  445. {
  446.           P2=0XC0;
  447.           P0=0X40;//选择数码管
  448.              P2=0XFF;
  449.           P0=tab[qi];
  450.           delayms(1);

  451.           P2=0XC0;
  452.           P0=0X80;//选择数码管
  453.              P2=0XFF;
  454.           P0=tab[ba];
  455.           delayms(1);
  456. }

  457. //定时器0中断服务函数
  458. void Timer0Init(void)                //5微秒@12.000MHz
  459. {
  460.         AUXR |= 0x80;                //定时器时钟1T模式
  461.         TMOD &= 0xF0;                //设置定时器模式
  462.         TL0 = 0xC4;                //设置定时初值
  463.         TH0 = 0xFF;                //设置定时初值
  464.         TF0 = 0;                //清除TF0标志

  465. }

  466. void Timer0_Rountine(void) interrupt 1
  467. {
  468.         /************************方法pwm*****************/
  469.         if(P34==0)
  470.         {
  471.             fan++;
  472.                 if(t_flag==1)
  473.                 {
  474.                         t_flag=0;
  475.                         fan_now=fan;
  476.                         fan=0;               
  477.                 }
  478.         }
  479.         else if(P34==1)
  480.         {
  481.                 zheng++;
  482.                
  483.                 if(t_flag==0)
  484.                 {
  485.                         t_flag=1;
  486.                         zheng_now=zheng;
  487.                         zheng=0;               
  488.                 }
  489.         }       
  490.          
  491. //         /************************只显示周期*****************/
  492. //                if(P34==0)
  493. //                {
  494. //                            if(high==1)
  495. //                         {
  496. //                                time=num_p;
  497. //                                 num_p=0;
  498. //                                 high=0;
  499. //                        }
  500. //                        num_p++;
  501. //                }
  502. //                
  503. //                else if(P34==1)
  504. //                {
  505. //                    
  506. //                         num_p++;
  507. //                         high=1;
  508. //                }
  509.          
  510. }
  511. void Timer1Init(void)                //2毫秒@12.000MHz
  512. {
  513.         AUXR |= 0x40;                //定时器时钟1T模式
  514.         TMOD &= 0x0F;                //设置定时器模式
  515.         TL1 = 0x40;                //设置定时初值
  516.         TH1 = 0xA2;                //设置定时初值
  517.         TF1 = 0;                //清除TF1标志
  518.         TR1 = 1;                //定时器1开始计时
  519. }
  520. void Timer1_Rountine(void) interrupt 3
  521. {
  522.           if(pinlv==1)
  523.           {
  524.                   intr++;
  525.                 if(intr==495)
  526.                 {
  527.                         TR0 = 1; ET0= 1;
  528.                 }
  529.                 else if(intr==500)
  530.                 {
  531.                   intr=0;
  532.                   TR0 = 0; ET0= 0;
  533.                 }
  534.           }
  535. }


  536. void delayms(uint ms)
  537. {
  538.         uint i,j;
  539.         for(i=ms;i>0;i--)
  540.                 for(j=845;j>0;j--);
  541. }
  542. <deputy.h>
  543. #include<stc15f2k60s2.h>
  544. #include<deputy.h>
  545. #include <intrins.h>
  546. #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}   
  547. #define uchar unsigned char

  548. #define SlaveAddrW 0xA0
  549. #define SlaveAddrR 0xA1

  550. //总线引脚定义
  551. sbit SD = P2^1;  /* 数据线 */
  552. sbit SCL = P2^0;  /* 时钟线 */

  553. sbit SCK=P1^7;               
  554. sbit SDA=P2^3;               
  555. sbit RST = P1^3;   // DS1302复位                                                                                               

  556. unsigned char shijian[]={55,59,23,0,0,0,0};

  557. void Write_Ds1302_Byte(unsigned  char temp)
  558. {
  559.         unsigned char i;
  560.         for (i=0;i<8;i++)            
  561.         {
  562.                 SCK=0;
  563.                 SDA=temp&0x01;
  564.                 temp>>=1;
  565.                 SCK=1;
  566.         }
  567. }   
  568. void Write_Ds1302( unsigned char address,unsigned char dat )     
  569. {
  570.         RST=0;
  571.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  572.         SCK=0;
  573.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  574.         RST=1;       
  575.   _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  576.         Write_Ds1302_Byte(address);       
  577.         Write_Ds1302_Byte((dat/10<<4)|(dat%10));       
  578.         RST=0;
  579. }

  580. unsigned char Read_Ds1302 ( unsigned char address )
  581. {
  582.         unsigned char i,temp=0x00,dat1,dat2;
  583.         RST=0;
  584.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  585.         SCK=0;
  586.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  587.         RST=1;
  588.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  589.         Write_Ds1302_Byte(address);
  590.         for (i=0;i<8;i++)        
  591.         {               
  592.                 SCK=0;
  593.                 temp>>=1;       
  594.                 if(SDA)
  595.                 temp|=0x80;       
  596.                 SCK=1;
  597.         }
  598.         RST=0;
  599.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  600.         RST=0;
  601.         SCK=0;
  602.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  603.         SCK=1;
  604.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  605.         SDA=0;
  606.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  607.         SDA=1;
  608.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  609.        
  610.         dat1=temp/16;
  611.         dat2=temp%16;
  612.         temp=dat1*10+dat2;
  613.        
  614.         return (temp);                       
  615. }



  616. void DS_init(void)
  617. {
  618.         unsigned char i,add;
  619.         add=0x80;
  620.         Write_Ds1302(0x8e,0x00);
  621.         for(i=0;i<7;i++)
  622.         {
  623.                 Write_Ds1302(add,shijian[i]);
  624.                 add=add+2;
  625.         }
  626.         Write_Ds1302(0x8e,0x80);
  627. }


  628. void DS_get(void)
  629. {
  630.         unsigned char i,add;
  631.         add=0x81;
  632.         Write_Ds1302(0x8e,0x00);
  633.         for(i=0;i<7;i++)
  634.         {
  635.                 shijian[i]=Read_Ds1302(add);
  636.                 add=add+2;
  637.         }
  638.         Write_Ds1302(0x8e,0x80);
  639. }







  640. /******************************************IIC********************************/
  641. //总线启动条件
  642. void IIC_Start(void)
  643. {
  644.         SD = 1;
  645.         SCL = 1;
  646.         somenop;
  647.         SD = 0;
  648.         somenop;
  649.         SCL = 0;       
  650. }

  651. //总线停止条件
  652. void IIC_Stop(void)
  653. {
  654.         SD = 0;
  655.         SCL = 1;
  656.         somenop;
  657.         SD = 1;
  658. }

  659. //应答位控制
  660. //void IIC_Ack(bit ackbit)
  661. //{
  662. //        if(ackbit)
  663. //        {       
  664. //                SD = 0;
  665. //        }
  666. //        else
  667. //        {
  668. //                SD = 1;
  669. //        }
  670. //        somenop;
  671. //        SCL = 1;
  672. //        somenop;
  673. //        SCL = 0;
  674. //        SD = 1;
  675. //        somenop;
  676. //}

  677. //等待应答
  678. bit IIC_WaitAck(void)
  679. {
  680.         SD = 1;
  681.         somenop;
  682.         SCL = 1;
  683.         somenop;
  684.         if(SD)   
  685.         {   
  686.                 SCL = 0;
  687.                 IIC_Stop();
  688.                 return 0;
  689.         }
  690.         else  
  691.         {
  692.                 SCL = 0;
  693.                 return 1;
  694.         }
  695. }

  696. //通过I2C总线发送数据
  697. void IIC_SendByte(unsigned char byt)
  698. {
  699.         unsigned char i;
  700.         for(i=0;i<8;i++)
  701.         {   
  702.                 if(byt&0x80)
  703.                 {       
  704.                         SD = 1;
  705.                 }
  706.                 else
  707.                 {
  708.                         SD = 0;
  709.                 }
  710.                 somenop;
  711.                 SCL = 1;
  712.                 byt <<= 1;
  713.                 somenop;
  714.                 SCL = 0;
  715.         }
  716. }

  717. //从I2C总线上接收数据
  718. unsigned char IIC_RecByte(void)
  719. {
  720.         unsigned char da;
  721.         unsigned char i;
  722.        
  723.         for(i=0;i<8;i++)
  724.         {   
  725.                 SCL = 1;
  726.                 somenop;
  727.                 da <<= 1;
  728.                 if(SD)
  729.                 da |= 0x01;
  730.                 SCL = 0;
  731.                 somenop;
  732.         }
  733.         return da;
  734. }
  735. void  EEPROM_write(uchar add,uchar date)                                                                                                                                 
  736. {
  737.         IIC_Start();
  738.         IIC_SendByte(0xa0);
  739.         IIC_WaitAck();
  740.         IIC_SendByte(0X10);
  741.         IIC_WaitAck();
  742.         IIC_SendByte(date);
  743.         IIC_WaitAck();
  744.         IIC_Stop();
  745. }
  746. uchar   EEPROM_Read(uchar add)
  747. {
  748.         uchar date;
  749.         IIC_Start();
  750.         IIC_SendByte(0xa0);
  751.         IIC_WaitAck();
  752.         IIC_SendByte(add);
  753.         IIC_WaitAck();
  754.        
  755.         IIC_Start();
  756.         IIC_SendByte(0xa1);
  757.         IIC_WaitAck();
  758.         date=IIC_RecByte();
  759.         IIC_Stop();
  760.         return date;
  761. }
  762. DEPUTY.H
  763. #ifndef __DEPUTY_H__
  764. #define __DEPUTY_H__

  765. #define uchar unsigned char
  766. #define uint unsigned  int
  767. extern unsigned char shijian[];

  768. void Write_Ds1302_Byte(unsigned  char temp);
  769. void Write_Ds1302( unsigned char address,unsigned char dat );
  770. unsigned char Read_Ds1302 ( unsigned char address );
  771. void DS_init(void);
  772. void DS_get(void);
  773. void  EEPROM_write(uchar add,uchar date);
  774. uchar   EEPROM_Read(uchar add);
  775. void IIC_Start(void);
  776. void IIC_Stop(void);  
  777. void IIC_Ack(bit ackbit);
  778. void IIC_SendByte(unsigned char byt);
  779. bit IIC_WaitAck(void);  
  780. unsigned char IIC_RecByte(void);
  781. #endif
复制代码


2.doc

93.09 KB, 下载次数: 14, 下载积分: 黑币 -5

c文件文档

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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