找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 952|回复: 2
收起左侧

这个单片机程序为什么数据都不能存入at24c02中?

[复制链接]
ID:866745 发表于 2021-3-27 17:13 | 显示全部楼层 |阅读模式
请问一下这个程序里为什么数据都不能存入at24c02中
  1. #include <STC15F2K60S2.h>
  2. #include "ds1302.h"
  3. #include "iic.h"


  4. typedef unsigned char u8;
  5. typedef unsigned int u16;


  6. sbit COL1 = P4^4;
  7. sbit COL2 = P4^2;
  8. sbit COL3 = P3^5;
  9. sbit COL4 = P3^4;


  10. bit flat,add,m=0,del,non=0;
  11. u8 timer=0,key_val=0,n=0,mom=0;
  12. u16 f=0,fre=0,cyl=0,vol=0,vh=20,vl=10;
  13. u8 num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  14. u8 write_time[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
  15. u8 read_time[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
  16. u8 time[7]={0x55,0x59,0x23,0x01,0x02,0x03,0x12};
  17. u8 seg[8];


  18. void delay(u8 x)
  19. {
  20.   while(x--);
  21. }

  22. void select(u8 deat,u8 date)
  23. {
  24.   switch(deat)
  25.         {
  26.           case 4:COL3=0;P2=(P2&0x1f)|0x80;break;
  27.                 case 5:COL3=0;P2=(P2&0x1f)|0xa0;break;
  28.                 case 6:COL3=0;P2=(P2&0x1f)|0xc0;break;
  29.                 case 7:COL3=0;P2=(P2&0x1f)|0xe0;break;
  30.         }
  31.         P0 = date;
  32. }

  33. void close()
  34. {
  35.   select(4,0xff);
  36.         select(5,0x00);
  37.         select(6,0x00);
  38.         select(7,0xff);
  39. }

  40. void ds1302_init()
  41. {
  42.   u8 i;
  43.         Write_Ds1302_Byte(0x8e,0x00);
  44.         for(i=0;i<7;i++)
  45.         {
  46.          Write_Ds1302_Byte(write_time[i],time[i]);
  47.         }
  48.         Write_Ds1302_Byte(0x8e,0x80);
  49. }


  50. void timer_init()
  51. {
  52.   TMOD = 0x15;
  53.         AUXR |= 0x00;
  54.         
  55.         TH0 = 0xff;
  56.         TL0 = 0xff;
  57.         TH1 = (65535-50000)/256;
  58.         TL1 = (65535-50000)%256;
  59.         
  60.         ET0 = 1;
  61.         ET1 = 1;
  62.         TR0 = 1;
  63.         TR1 = 1;
  64.         EA = 1;
  65. }

  66. void timer0_() interrupt 1
  67. {
  68.         TH0 = 0xff;
  69.         TL0 = 0xff;
  70.   f++;
  71. }

  72. void timer1_() interrupt 3
  73. {
  74.         TH1 = (65535-50000)/256;
  75.         TL1 = (65535-50000)%256;
  76.   timer++;
  77.         if(!(timer%20)) flat=!flat;
  78. }


  79. void time_proc()
  80. {
  81.   u8 i;
  82.         Write_Ds1302_Byte(0x8e,0x00);
  83.         for(i=0;i<3;i++)
  84.         {
  85.           time[i]=Read_Ds1302_Byte(read_time[i]);
  86.         }
  87.         Write_Ds1302_Byte(0x8e,0x80);
  88.         
  89.         
  90.         seg[0] = num[time[2]/16];
  91.         seg[1] = num[time[2]%16];
  92.         seg[2] = seg[5] = 0xbf;
  93.         seg[3] = num[time[1]/16];
  94.         seg[4] = num[time[1]%16];
  95.         seg[6] = num[time[0]/16];
  96.         seg[7] = num[time[0]%16];
  97. }


  98. void time_deal()
  99. {
  100.         u8 i;
  101.         for(i=0;i<3;i++)
  102.         time[i]=Read_Ds1302_Byte(read_time[i]);
  103.         seg[0] = num[time[2]/16];
  104.         seg[1] = num[time[2]%16];
  105.         seg[2] = seg[5] = 0xbf;
  106.         seg[3] = num[time[1]/16];
  107.         seg[4] = num[time[1]%16];
  108.         seg[6] = num[time[0]/16];
  109.         seg[7] = num[time[0]%16];
  110.   if(flat)
  111.         {        
  112.                 n%=3;
  113.                 seg[7-n*3]=0xff;
  114.           seg[7-n*3-1]=0xff;
  115.         }
  116.         if(add)
  117.         {
  118.           add=0;
  119.                 n%=3;
  120.                 time[n]++;
  121.                 if((time[n]&0x0f)>9) time[n]+=6;
  122.                 if((time[n]>0x59)&&(n<2)) time[n]=0x00;
  123.                 else if((time[n]>0x23)&&(n==2)) time[n]=0x00;
  124.                 Write_Ds1302_Byte(0x8e,0x00);
  125.           for(i=0;i<3;i++)
  126.            {
  127.             Write_Ds1302_Byte(write_time[i],time[i]);
  128.            }
  129.            Write_Ds1302_Byte(0x8e,0x80);
  130.          }
  131.         if(del)
  132.         {
  133.           del=0;
  134.                 n%=3;
  135.                 if(((time[n]&0x0f)==0)&&(time[n]!=0)) time[n]= time[n]-0x10+0x09;
  136.                 else if((time[n]==0)&&(n<2)) time[n]=0x59;
  137.                 else if((time[n]==0)&&(n==2)) time[n]=0x23;
  138.                 else time[n]--;
  139.                 Write_Ds1302_Byte(0x8e,0x00);
  140.           for(i=0;i<3;i++)
  141.           {
  142.             Write_Ds1302_Byte(write_time[i],time[i]);
  143.           }
  144.           Write_Ds1302_Byte(0x8e,0x80);
  145.          }
  146. }

  147. void vol_proc()
  148. {
  149.   vol=read_date(0x90,0x03);
  150.         vol=vol/5.1;
  151.         seg[0]=seg[2]=0xbf;
  152.         seg[1]=num[1];
  153.         seg[3]=0xff;
  154.         seg[4]=num[vol%100/10];
  155.         seg[5]=num[vol%10];
  156.         seg[6]=num[0];
  157.         seg[7]=num[0];
  158. }


  159. void vol_deal()
  160. {
  161.         vh=at24c02read(0x09);
  162.         vl=at24c02read(0x0b);
  163.   seg[0]=num[vh/10];
  164.         seg[1]=num[vh%10];
  165.         seg[2]=num[0];
  166.         seg[3]=num[0];
  167.         seg[4]=num[vl/10];
  168.         seg[5]=num[vl%10];
  169.         seg[6]=num[0];
  170.         seg[7]=num[0];
  171.         if(flat)
  172.         {
  173.                 n%=2;
  174.           seg[n*4]=0xff;
  175.                 seg[n*4+1]=0xff;
  176.                 seg[n*4+2]=0xff;
  177.                 seg[n*4+3]=0xff;
  178.         }
  179.         if(add)
  180.         {
  181.           add=0;
  182.                 if(!n)
  183.                   vh+=5;
  184.                 else
  185.                         vl+=5;
  186.                 if(vh>=50) vh=50;
  187.                 if(vl>=50) vl=50;
  188.         }

  189.         if(del)
  190.         {
  191.           del=0;
  192.                 if(!n)
  193.                         vh-=5;
  194.                 else
  195.                         vl-=5;
  196.                 if(vh==0) vh=0;
  197.                 if(vl==0) vl=0;
  198.         }
  199.         write_date(0x09,vh);
  200.   write_date(0x0b,vl);
  201. }        



  202. void fre_proc()
  203. {
  204.         TR0=1;
  205.         TR1=1;
  206.         if(timer>=20)
  207. {
  208.    timer%=20;
  209.          fre=f;
  210.          f=0;
  211. }

  212. if(fre>=20000) fre=20000;
  213. if(fre<=500) fre=500;

  214. seg[0]=seg[2]=0xbf;
  215. seg[1]=num[2];
  216. seg[3]=num[fre/10000];
  217. seg[4]=num[fre%10000/1000];
  218. seg[5]=num[fre%1000/100];
  219. seg[6]=num[fre%100/10];
  220. seg[7]=num[fre%10];
  221. }

  222. void cyl_proc()
  223. {
  224.         float cy;
  225.         
  226.         TR0=1;TR1=1;
  227. if(timer>20)
  228. {
  229.    timer%=20;
  230.          fre = f;
  231.          f=0;
  232. }

  233. if(fre>=20000) fre=20000;
  234. if(fre<=500) fre=500;

  235. cy=1.0/fre;
  236. cyl=cy*1000*1000;

  237. seg[0]=seg[2]=0xbf;
  238. seg[1]=num[2];
  239. seg[3]=num[cyl/10000];
  240. seg[4]=num[cyl%10000/1000];
  241. seg[5]=num[cyl%1000/100];
  242. seg[6]=num[cyl%100/10];
  243. seg[7]=num[cyl%10];
  244. }




  245. void timer_proc()
  246. {
  247.   u8 timed[3];
  248.         time[0]=at24c02read(0x03);
  249.         time[1]=at24c02read(0x05);
  250.         time[2]=at24c02read(0x07);
  251.         
  252.         seg[0]=num[timed[2]/16];
  253.         seg[1]=num[timed[2]%16];
  254.         seg[2]=seg[5]=0xbf;
  255.         seg[3]=num[timed[1]/16];
  256.         seg[4]=num[timed[1]%16];
  257.         seg[6]=num[timed[0]/16];
  258.         seg[7]=num[timed[0]%16];
  259. }

  260. void lei_proc()
  261. {
  262.   u8 lei;
  263.         
  264.         lei = at24c02read(0x01);
  265.         
  266.         seg[0]=seg[1]=seg[2]=seg[3]=seg[4]=seg[5]=0xff;
  267.         seg[6]=num[0];
  268.         seg[7]=num[lei];
  269. }



  270. void key_proc()
  271. {
  272.   u8 key;
  273.         
  274.         P3=0x0f;
  275.         COL1=0;COL2=1;
  276.         COL3=1;COL4=1;
  277.         key = P3&0x0f;
  278.         if(key!=0x0f)
  279.                 key |= 0x70;
  280.         else
  281.         {
  282.           COL1=1;COL2=0;
  283.                 key = P3&0x0f;
  284.                 if(key!=0x0f)
  285.                         key |= 0xb0;
  286.                 else
  287.                 {
  288.                   COL2=1;COL3=0;
  289.                 key = P3&0x0f;
  290.                 if(key!=0x0f)
  291.                         key |= 0xd0;
  292.                 else
  293.                 {
  294.                  COL3=1;COL4=0;
  295.                         key = P3&0x0f;
  296.                         if(key!=0x0f)
  297.                                 key |= 0xe0;
  298.                         else
  299.                                 COL4=1;
  300.                 }
  301.                 }
  302.         }
  303.         
  304.         switch(key)
  305.         {
  306.           case 0x77:key_val=4;break;
  307.                 case 0x7b:key_val=5;break;
  308.                 case 0x7d:key_val=6;break;
  309.                 case 0x7e:key_val=7;break;
  310.                 case 0xbb:key_val=9;break;
  311.                 case 0xbd:key_val=10;break;
  312.                 case 0xbe:key_val=11;break;
  313.                 default:key_val=0;
  314.         }
  315. }



  316. void seg_proc()
  317. {
  318.   select(6,0x01);select(7,seg[0]);delay(1000);
  319.         select(6,0x02);select(7,seg[1]);delay(1000);
  320.         select(6,0x04);select(7,seg[2]);delay(1000);
  321.         select(6,0x08);select(7,seg[3]);delay(1000);
  322.         select(6,0x10);select(7,seg[4]);delay(1000);
  323.         select(6,0x20);select(7,seg[5]);delay(1000);
  324.         select(6,0x40);select(7,seg[6]);delay(1000);
  325.         select(6,0x80);select(7,seg[7]);delay(1000);
  326.         close();
  327. }

  328. void mom_proc()
  329. {
  330.   if((vol>vh)||(vol<vl))
  331.         {
  332.                 if(vol>vh)
  333.                 {write_date(0x01,1);delay(5000);}
  334.           else if(vol<vl)
  335.                 {write_date(0x01,0);delay(5000);}
  336.                
  337.                 write_date(0x03,time[0]);delay(5000);
  338.                 write_date(0x05,time[1]);delay(5000);
  339.                 write_date(0x07,time[2]);delay(5000);
  340.         }
  341.         key_proc();
  342.         if(key_val==11)
  343.         {
  344.          add=1;
  345.                 while(key_val==11)
  346.                 {
  347.                         key_proc();
  348.                   seg_proc();
  349.                 }
  350.         }
  351.         if(key_val==10)
  352.         {
  353.          del=1;
  354.                 while(key_val==10)
  355.                 {
  356.                         key_proc();
  357.                   seg_proc();
  358.                 }
  359.         }
  360.         if(key_val==9)
  361.         {
  362.           mom=3;
  363.                 m=0;
  364.                 while(key_val==9)
  365.                 {
  366.                         key_proc();
  367.                   seg_proc();
  368.                 }
  369.         }
  370.         if(key_val==7)
  371.         {
  372.           mom=0;
  373.                 non=0;
  374.                 n=2;
  375.                 while(key_val==7)
  376.                 {
  377.                         key_proc();
  378.                   seg_proc();
  379.                 }
  380.         }
  381.         if(key_val==6)
  382.         {
  383.           mom=1;
  384.                 non=0;
  385.                 n=1;
  386.                 while(key_val==6)
  387.                 {
  388.                         key_proc();
  389.                   seg_proc();
  390.                 }
  391.         }
  392.         if(key_val==5)
  393.         {
  394.           mom=2;
  395.                 m=0;
  396.                 while(key_val==5)
  397.                 {
  398.                         key_proc();
  399.                   seg_proc();
  400.                 }
  401.         }
  402.         if(key_val==4)
  403.         {
  404.                 m=!m;
  405.                 non=1;
  406.                 n++;
  407.                 while(key_val==4)
  408.                 {
  409.                         key_proc();
  410.                   seg_proc();
  411.                 }
  412.         }
  413. }



  414. void main()
  415. {  
  416.         timer_init();
  417.         ds1302_init();
  418.    close();
  419.         vh=at24c02read(0x09);
  420.         vl=at24c02read(0x0b);
  421.         while(1)
  422.         {
  423.                 mom_proc();
  424.                 if((!mom)&&(non))
  425.                 {
  426.                   time_deal();
  427.                         seg_proc();
  428.                 }
  429.                 else if((!mom)&&(!non))
  430.                 {
  431.                   time_proc();
  432.                         seg_proc();
  433.                 }
  434.                 else if((mom==1)&&(non))
  435.                 {
  436.                   vol_deal();
  437.                         seg_proc();
  438.                 }
  439.                 else if((mom==1)&&(!non))
  440.                 {
  441.                   vol_proc();
  442.                         seg_proc();
  443.                 }
  444.                 else if((mom==2)&&(m))
  445.                 {
  446.                   cyl_proc();
  447.                         seg_proc();
  448.                 }
  449.                 else if((mom==2)&&(!m))
  450.                 {
  451.                   fre_proc();
  452.                         seg_proc();
  453.                 }
  454.                 else if((mom==3)&&(m))
  455.                 {
  456.                   timer_proc();
  457.                         seg_proc();
  458.                 }
  459.                 else if((mom==3)&&(!m))
  460.                 {
  461.                   lei_proc();
  462.                         seg_proc();
  463.                 }
  464.         }
  465. }



  466. #include "iic.h"
  467. #include "reg52.h"
  468. #include "intrins.h"

  469. #define DELAY_TIME 5

  470. #define SlaveAddrW 0xA0
  471. #define SlaveAddrR 0xA1

  472. sbit SDA = P2^1;  
  473. sbit SCL = P2^0;

  474. void IIC_Delay(unsigned char i)
  475. {
  476.     do{_nop_();}
  477.     while(i--);        
  478. }

  479. void IIC_Start(void)
  480. {
  481.     SDA = 1;
  482.     SCL = 1;
  483.     IIC_Delay(DELAY_TIME);
  484.     SDA = 0;
  485.     IIC_Delay(DELAY_TIME);
  486.     SCL = 0;        
  487. }


  488. void IIC_Stop(void)
  489. {
  490.     SDA = 0;
  491.     SCL = 1;
  492.     IIC_Delay(DELAY_TIME);
  493.     SDA = 1;
  494.     IIC_Delay(DELAY_TIME);
  495. }


  496. void IIC_SendAck(bit ackbit)
  497. {
  498.     SCL = 0;
  499.     SDA = ackbit;                                          
  500.     IIC_Delay(DELAY_TIME);
  501.     SCL = 1;
  502.     IIC_Delay(DELAY_TIME);
  503.     SCL = 0;
  504.     SDA = 1;
  505.     IIC_Delay(DELAY_TIME);
  506. }


  507. bit IIC_WaitAck(void)
  508. {
  509.     bit ackbit;
  510.         
  511.     SCL  = 1;
  512.     IIC_Delay(DELAY_TIME);
  513.     ackbit = SDA;
  514.     SCL = 0;
  515.     IIC_Delay(DELAY_TIME);
  516.     return ackbit;
  517. }


  518. void IIC_SendByte(unsigned char byt)
  519. {
  520.     unsigned char i;

  521.     for(i=0; i<8; i++)
  522.     {
  523.         SCL  = 0;
  524.         IIC_Delay(DELAY_TIME);
  525.         if(byt & 0x80) SDA  = 1;
  526.         else SDA  = 0;
  527.         IIC_Delay(DELAY_TIME);
  528.         SCL = 1;
  529.         byt <<= 1;
  530.         IIC_Delay(DELAY_TIME);
  531.     }
  532.     SCL  = 0;  
  533. }


  534. unsigned char IIC_RecByte(void)
  535. {
  536.     unsigned char i, da;
  537.     for(i=0; i<8; i++)
  538.     {   
  539.             SCL = 1;
  540.         IIC_Delay(DELAY_TIME);
  541.         da <<= 1;
  542.         if(SDA) da |= 1;
  543.         SCL = 0;
  544.         IIC_Delay(DELAY_TIME);
  545.     }
  546.     return da;   
  547. }



  548. void write_date(unsigned char deet,unsigned char date)
  549. {
  550.   IIC_Start();
  551.         IIC_SendByte(0xa0);
  552.         IIC_WaitAck();
  553.         IIC_SendByte(deet);
  554.         IIC_WaitAck();
  555.         IIC_SendByte(date);
  556.         IIC_SendAck(1);
  557.         IIC_Stop();  
  558. }


  559. unsigned char read_date(unsigned char deat,unsigned char deet)
  560. {
  561.         
  562.         unsigned char date;
  563.   IIC_Start();
  564.         IIC_SendByte(deat);
  565.         IIC_WaitAck();
  566.         IIC_SendByte(deet);
  567.         IIC_WaitAck();
  568.         IIC_Stop();  
  569.         
  570.         IIC_Start();
  571.         IIC_SendByte(deat+1);
  572.         IIC_WaitAck();
  573.         date = IIC_RecByte();
  574. //        IIC_SendAck(1);
  575.         IIC_Stop();
  576.         return date;
  577. }

  578. unsigned char at24c02read(unsigned char deet)
  579. {
  580.   unsigned char dat;
  581.         IIC_Start();
  582.         IIC_SendByte(0xa0);
  583.         IIC_WaitAck();
  584.         IIC_SendByte(deet);
  585.         IIC_WaitAck();
  586.         
  587.         IIC_Start();
  588.         IIC_SendByte(0xa1);
  589.         IIC_WaitAck();
  590.         dat=IIC_RecByte();
  591. //        IIC_SendAck(0);
  592.         IIC_Stop();
  593.         
  594.         return dat;
  595. }



  596. #include "ds1302.h"
  597. #include <reg52.h>
  598. #include <intrins.h>

  599. sbit SCK=P1^7;               
  600. sbit SDA=P2^3;               
  601. sbit RST = P1^3;                                                                           

  602. void Write_Ds1302(unsigned  char temp)
  603. {
  604.         unsigned char i;
  605.         for (i=0;i<8;i++)            
  606.         {
  607.                 SCK=0;
  608.                 SDA=temp&0x01;
  609.                 temp>>=1;
  610.                 SCK=1;
  611.         }
  612. }   

  613. void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
  614. {
  615.          RST=0;        _nop_();
  616.          SCK=0;        _nop_();
  617.          RST=1;         _nop_();  
  618.          Write_Ds1302(address);        
  619.          Write_Ds1302(dat);               
  620.          RST=0;
  621. }

  622. unsigned char Read_Ds1302_Byte ( unsigned char address )
  623. {
  624.          unsigned char i,temp=0x00;
  625.          RST=0;        _nop_();
  626.          SCK=0;        _nop_();
  627.          RST=1;        _nop_();
  628.          Write_Ds1302(address);
  629.          for (i=0;i<8;i++)         
  630.          {               
  631.                 SCK=0;
  632.                 temp>>=1;        
  633.                  if(SDA)
  634.                  temp|=0x80;        
  635.                  SCK=1;
  636.         }
  637.          RST=0;        _nop_();
  638.          SCK=0;        _nop_();
  639.         SCK=1;        _nop_();
  640.         SDA=0;        _nop_();
  641.         SDA=1;        _nop_();
  642.         return (temp);                        
  643. }
复制代码

回复

使用道具 举报

ID:584814 发表于 2021-3-29 17:36 | 显示全部楼层
如果有人读并且试你这个700多行程序并且告诉你答案,那么大概率是有现成的和你一样的硬件也同程度并同样学习到这里并且同样用一个母板......

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:866745 发表于 2021-4-1 19:49 | 显示全部楼层
已经解决了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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