DS3231程序大集合,欢迎大家来分享

2019-07-17 13:23发布

本帖最后由 dirtwillfly 于 2015-11-4 09:45 编辑
  1.   #include <msp430.h>
  2. #include"config.h"
  3. #include"1838.h"
  4. #include"1602.h"
  5. #include"dh11.h"
  6. #include"ds3231.h"
  7. #include"ta.h"
  8. //#include"adc.h"
  9. int main(void)
  10. {
  11.   extern_12m();
  12.   hc164_init();
  13.   LCD_init();
  14.   h1838_init();
  15.   init_TA();
  16. //  I2cByteWrite(0xD0,0x0e,0);
  17. //  I2cByteWrite(0xD0,0x0f,0);
  18. //  ModifyTime(15,7,19,12,07,00);//初始化时钟,2007/11/20,12/59/00
  19.                                //小时采用24小时制
  20.   get_show_time();
  21.   get_show_Temperature();
  22.   dh11_read();

  23. // adc_init();
  24.   _EINT();
  25.   while (1)
  26.   {
  27. //  LCD_disp_string(0,0,"I AM A BOY?");
  28. //  LCD_disp_string(0,1,"YOU ARE A GIRL!");
  29.   Red_Code();
  30.   Key_Icode(key_code[2]);

  31. }
  32. }



  33. #include"config.h"
  34. uchar change;

  35. void extern_12m()
  36. {
  37.    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  38.   if (CALBC1_12MHZ==0xFF)                                        // If calibration constant erased
  39.   {                                                                                       
  40.     while(1);                               // do not load, trap CPU!!        
  41.   }
  42.   DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  43.   BCSCTL1 = CALBC1_12MHZ;
  44.   DCOCTL = CALDCO_12MHZ;                     // Load 8MHz constants
  45. }

  46. void hc164_init()
  47. {
  48.   P1OUT &= ~(BIT6+BIT7+BIT3);                           // Clear P1.0
  49.   P1DIR |=BIT6+BIT7+BIT3;                            // P1.0 output
  50.   
  51.   P2OUT &= ~(BIT0+BIT1+BIT2);                           // Clear P1.0
  52.   P2DIR |=BIT0+BIT1+BIT2;                            // P1.0 output
  53. }

  54. void LCD_delay_10us(uint n) // - - 10微秒的延时子程序
  55. {
  56.   uint i,j;
  57.   for(i=n;i>0;i--)
  58.     for(j=4;j>0;j--);  
  59. }

  60. void sendbyte(uchar byte)
  61. {            
  62. uchar c,num;   
  63. num=byte;
  64. for(c=0;c<8;c++)        
  65. {     
  66. P1OUT&=~0x80;
  67. CLK0;   
  68. P1OUT|=num&0x80; //(0x80即十进制的128, 二进制的10000000 按位发送
  69. CLK1;         
  70. num<<=1;   
  71. }
  72. }  


  73. // - - 向LCD1602写指令
  74. void LCD_write_command(uchar dat)
  75. {
  76. LCD_delay_10us(2);
  77. LCD_RS_LOW; // - - 指令
  78. //LCD_RW_LOW; // - - 写入
  79. sendbyte(dat);
  80. LCD_delay_10us(2);
  81. LCD_EN_HIGH; // - - 允许
  82. LCD_delay_10us(2);
  83. LCD_EN_LOW;
  84. }

  85. // - - 向LCD1602写数据
  86. void LCD_write_data(uchar dat)
  87. {
  88. LCD_delay_10us(2);
  89. LCD_RS_HIGH;// - - 数据
  90. //LCD_RW_LOW;// - - 写入
  91. sendbyte(dat);
  92. LCD_delay_10us(2);
  93. LCD_EN_HIGH;// - - 允许
  94. LCD_delay_10us(2);
  95. LCD_EN_LOW;
  96. }

  97. // - - 设置显示位置
  98. void LCD_set_xy(uchar x,uchar y)
  99. {
  100.   uchar address;
  101.   if(y==1)
  102.   {
  103.     address=0x80+x; // - - 第一行位置
  104.   } else {
  105.     address=0xc0+x; // - - 第二行位置
  106.   }
  107. //    LCD_delay_10us(1);
  108.     LCD_write_command(address);
  109. }

  110. // - - 显示一个字符函数
  111. void LCD_disp_char(uchar x,uchar y,uchar dat) // - - LCD_disp_char(0,1,0x38); // - - 显示8
  112. {
  113.     LCD_set_xy(x,y);
  114. //    LCD_delay_10us(1);
  115.     LCD_write_data(dat);
  116. }



  117. // - - 显示一个字符串函数
  118. void LCD_disp_string(uchar x,uchar y,char *s)
  119. {
  120.   LCD_set_xy(x,y);
  121. // LCD_delay_10us(1);
  122.   while(*s!='')
  123.   {
  124.     LCD_write_data(*s);
  125.     s++;
  126.   }
  127. }

  128. void LCD_init(void)
  129. {
  130. LCD_delay_10us(20);
  131. LCD_write_command(0x38); // - - 设置8位格式,2行,5x7
  132. LCD_delay_10us(5);
  133. LCD_write_command(0x0c); // - - 整体显示,关光标,不闪烁
  134. LCD_delay_10us(5);
  135. LCD_write_command(0x06); // - - 设定输入方式,增量不移位
  136. LCD_delay_10us(5);
  137. LCD_write_command(0x01); // - - 清除屏幕显示
  138. LCD_delay_10us(200);
  139. }





  140. #include"config.h"
  141. #define IR_DIR_IN P2DIR&=~BIT3//红外接收头P1.0设置为输入,
  142. #define RED_R (P2IN&BIT3)//红外接收头输入值
  143. void h1838_init()
  144. {
  145.   IR_DIR_IN;
  146. }


  147. uchar KEY_VAL;
  148. uchar key_code[4],code_value;
  149. void Red_Code()
  150. {
  151. uchar i,j,k = 0;

  152. for(i = 0;i < 19;i++)
  153. {
  154.   delay_us(400);           //延时400us
  155.   if(RED_R)                //9ms内有高电平,则判断为干扰,退出处理程序
  156.   {
  157.       return;
  158.   }
  159. }

  160. while(!RED_R);            //等待9ms低电平过去
  161. for(i=0;i<5;i++)          //是否连发码
  162. {
  163.   delay_us(500);
  164.   if(!RED_R)
  165.    {
  166.      return;
  167.    }
  168. }


  169. while(RED_R);               //等待4.5ms高电平过去

  170. for(i = 0;i < 4;i++)        //接收4个字节的数据
  171. {
  172.   for(j = 0;j < 8;j++)      //每个字节的数据8位
  173.   {
  174.    

  175.    while(!RED_R);           //等待变高电平
  176.    while(RED_R)             //计算高电平时间
  177.    {
  178.     delay_us(100);
  179.     k++;
  180.     if(k >22)               //高电平时间过长,则退出处理程序
  181.     {
  182.      return;         
  183.     }
  184.    
  185.    }

  186.    code_value>>=1;          //接受一位数据
  187.    if(k >= 7)
  188.    {
  189.     code_value|=0x80;       //高电平时间大于0.56,则为数据1
  190.    }
  191.    k = 0;                  //计时清零
  192.   }
  193.   key_code[i]=code_value;  //四个字节的数据
  194. }
  195. //  Key_Icode();             //调用赋值函数

  196. // Display_Key(KEY_VAL);     //显示按键值
  197.   
  198. //  delay_ms(50);

  199. }
复制代码
  1. #include <msp430.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. #define CLK0  P1OUT&=~BIT6
  6. #define CLK1   P1OUT|=BIT6


  7. #define LCD_EN_HIGH         P2OUT|=BIT2   //拉高
  8. #define LCD_EN_LOW          P2OUT&=~BIT2  //拉低

  9. #define LCD_RW_HIGH         P2OUT|=BIT1   //拉高
  10. #define LCD_RW_LOW          P2OUT&=~BIT1   //拉低

  11. #define LCD_RS_HIGH         P2OUT|=BIT0   //拉高
  12. #define LCD_RS_LOW          P2OUT&=~BIT0   //拉低

  13. #define CPU_F ((double)12000000)   //外部高频晶振8MHZ
  14. //#define CPU_F ((double)32768)   //外部低频晶振32.768KHZ
  15. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  16. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  17. #define KEY_0     0x16                 //键0
  18. #define KEY_1     0x0C                 //键1
  19. #define KEY_2     0x18                 //键2
  20. #define KEY_3     0x5E                 //键3
  21. #define KEY_4     0x08                 //键4
  22. #define KEY_5     0x1C                 //键5
  23. #define KEY_6     0x5A                 //键6
  24. #define KEY_7     0x42                 //键7
  25. #define KEY_8     0x52                 //键8
  26. #define KEY_9     0x4A                 //键9
  27. #define prex      0x44                 //电源
  28. #define nex       0x40                 //模式
  29. #define play_pause 0x43                 //静音
  30. #define ch_       0x45                //模式
  31. #define ch        0x46  
  32. #define cha       0x47                 //模式
  33. #define __         0x07
  34. #define _a        0x15
  35. #define eq        0x09
  36. #define _100a      0x19
  37. #define _200a      0x0d
  38. #define power      0x12            //power
  39. #define up      0x1b            //up
  40. #define down      0x1a            //down
  41. #define left      0x04            //left
  42. #define right      0x06            //right
  43. #define ok      0x05            //0k
复制代码
  1. #include"config.h"

  2. //连接端口
  3. #define DHT11_Dir      P1DIR
  4. #define DHT11_In       P1IN
  5. #define DHT11_Out      P1OUT
  6. #define DHT11_Bit      BIT0

  7. char dh11_str[8];

  8. //8bit湿度+8bit湿度小数点
  9. //8bit温度+8bit温度小数点
  10. //数据位为0是高电平26~28us | 1高电平70us

  11. uchar DHT11_Data[5] = {0}; //从DHT11中读到的数据
  12. void read_DHT11(uchar *Data)
  13. {
  14.     uchar re,m,n,Time_out;
  15.     DHT11_Dir &= (~DHT11_Bit);        //引脚为输入
  16.     for(n = 0; n < 5; n++)
  17.     {
  18.         for(m = 0; m < 8; m++)
  19.         {
  20.             while( !(DHT11_In & DHT11_Bit) );     //每1bit以50us低电平时限开始,直到高电平到来
  21.             delay_us(30);                     
  22.             re = 0;            
  23.             if((DHT11_In & DHT11_Bit))          //30us后还是高电平说明是1
  24.             {
  25.                 re = 1;
  26.             }
  27.             Time_out = 2;
  28.             while((DHT11_In & DHT11_Bit) && (Time_out++ ));
  29.             if(Time_out == 1)                   //超时处理
  30.             {
  31.                 break;
  32.             }
  33.             *Data <<= 1;
  34.             if(re)
  35.             {
  36.                 *Data |= 0x01;
  37.             }
  38.         }
  39.         Data++;
  40.     }
  41. }

  42. //DHT11的握手协议模拟和数据的读取
  43. uchar DHT11_GetData(void)
  44. {
  45.     uchar o,sum;
  46.     DHT11_Dir |= DHT11_Bit;
  47.     DHT11_Out &= ~DHT11_Bit;    //拉低,发出开始信号
  48.    
  49.     delay_ms(18);               //拉低18ms
  50.     DHT11_Out |= DHT11_Bit;     //拉高20us等待
  51.     delay_us(20);
  52.     DHT11_Dir &= (~DHT11_Bit);
  53.     if( !(DHT11_In & DHT11_Bit) )       //DHT11响应
  54.     {
  55.         while( !(DHT11_In & DHT11_Bit) );       //80us低电平,等待DHT11的响应信号
  56.         while( (DHT11_In & DHT11_Bit) );        //DHT11准备发送数据
  57.         read_DHT11(DHT11_Data);                 //主机接收数据
  58.         sum = 0;
  59.         for(o = 0; o < 4; o++)                  //数据校验
  60.         {
  61.           sum += DHT11_Data[o];
  62.         }
  63.         if(sum != DHT11_Data[4])
  64.         {
  65.           return 0;
  66.         }
  67.         else
  68.         {
  69.           return 1;
  70.         }
  71.     }
  72.     return 0;
  73. }

  74. //对温度湿度进行格式化(如果获取温度成功)
  75. void DHT11_format(char *Des_str)
  76. {
  77.     Des_str[0] = DHT11_Data[0]/10 + 0x30;
  78.     Des_str[1] = DHT11_Data[0]%10 + 0x30;
  79.     Des_str[2] = '%';
  80.     Des_str[3] = ' ';
  81.     Des_str[4] = DHT11_Data[2]/10 + 0x30;
  82.     Des_str[5] = DHT11_Data[2]%10 + 0x30;
  83.     Des_str[6] = 'C';
  84.     Des_str[7] = ' ';
  85. }

  86. void dh11_read()
  87. {
  88.   if(DHT11_GetData())
  89.    DHT11_format(dh11_str);
  90.   LCD_disp_string(0,0,dh11_str);
  91. }

复制代码
  1. #include"config.h"

  2. #define SDA_DIR_OUT P1DIR|=BIT4
  3. #define SDA_DIR_IN P1DIR&=~BIT4
  4. #define SCL_DIR_OUT P1DIR|=BIT5

  5. #define SDA_IN P1IN&BIT4

  6. #define SDA1 P1OUT|=BIT4
  7. #define SDA0 P1OUT&=~BIT4
  8. #define SCL1 P1OUT|=BIT5
  9. #define SCL0 P1OUT&=~BIT5
  10. uchar year,month,date,hour,minute,second;
  11. uchar const table[]={'0','1','2','3','4','5','6','7','8','9'};
  12. uchar const month_12[]={31,29,31,30,31,30,31,31,30,31,30,31};

  13. uchar clockset,clockon,clockoff[5],clock_on;
  14. uchar oclock[5][2];
  15. uchar BCD2HEX(uchar val)    //BCD转换为Byte
  16. {
  17.     uchar temp;
  18.     temp=val&0x0f;
  19.     val>>=4;
  20.     val&=0x0f;
  21.     val*=10;
  22.     temp+=val;
  23.    
  24.     return temp;
  25. }


  26. uchar HEX2BCD(uchar val)    //B码转换为BCD码
  27. {
  28.     uchar i,j,k;
  29.     i=val/10;
  30.     j=val%10;
  31.     k=j+(i<<4);
  32.     return k;
  33. }



  34. void Start_I2C()
  35. {
  36.     SDA_DIR_OUT;
  37.     SCL_DIR_OUT;
  38.     SDA1;                  //发送起始条件的数据信号
  39.     delay_us(5);
  40.     SCL1;
  41.     delay_us(5);             //起始条件建立时间大于4.7us,延时
  42.    
  43.     SDA0;                  //发送起始信号
  44.     delay_us(5);             // 起始条件锁定时间大于4μs
  45.       
  46. //    SCL0;                  //钳住I2C总线,准备发送或接收数据
  47. //    delay_us(2);
  48. }


  49. void Stop_I2C()
  50. {
  51.     SDA_DIR_OUT;
  52.     SCL_DIR_OUT;
  53.     SDA0;                  //发送结束条件的数据信号
  54.     delay_us(5);             //发送结束条件的时钟信号
  55.     SCL1;                  //结束条件建立时间大于4us
  56.     delay_us(5);
  57.    
  58.     SDA1;                  //发送I2C总线结束信号
  59.     delay_us(1);
  60. }


  61. void SendByte(uchar c)
  62. {
  63.     uchar BitCnt;
  64.     SDA_DIR_OUT;
  65.     SCL_DIR_OUT;
  66.     SCL0;
  67.     delay_us(10);
  68.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
  69.     {
  70.         if(c&0x80)
  71.             SDA1;                          //判断发送位
  72.         else
  73.             SDA0;               
  74.           delay_us(1);
  75.           SCL0;                            //置时钟线为高,通知被控器开始接收数据位
  76.           delay_us(1);                       //保证时钟高电平周期大于4μs   
  77.           SCL1;
  78.           delay_us(5);
  79.           c=c<<1;
  80.           SCL0;                            //置时钟线为高,通知被控器开始接收数据位
  81.           delay_us(5);   
  82.     }
  83.     SDA1;                                  //8位发送完后释放数据线,准备接收应答位
  84.     delay_us(1);  
  85.     SCL0;
  86.     delay_us(1);
  87.                      
  88.     SCL1;
  89.     delay_us(1);
  90.      SCL0;
  91.      
  92. }


  93. uchar ReceiveByte(uchar b)
  94. {
  95.   uchar i;
  96.   uchar temp;
  97.   uchar Dat=0;
  98. /*
  99.   SDA_H;
  100.   delay(5);
  101.   SCL_L;
  102.   delay(5);
  103. */
  104. SDA_DIR_IN;
  105.   for(i=0;i<8;i++)
  106.     {
  107.           SCL1;
  108.       delay_us(5);
  109.           Dat=Dat<<1;
  110.           delay_us(1);
  111.           temp=SDA_IN;
  112.           if(temp&0x10)
  113.             Dat|=0x01;
  114.           else
  115.             Dat|=0x00;
  116.          delay_us(1);
  117.          SCL0;
  118.           delay_us(5);
  119.     }
  120.    SDA_DIR_OUT;
  121.   
  122.   if(b)//每收一个数后发送ACK或nACK
  123.     SDA1;
  124.   else
  125.     SDA0;
  126.         
  127.   delay_us(1);
  128.   SCL1;
  129.   delay_us(1);
  130.   SCL0;
  131.   delay_us(1);
  132.   SDA1;        //释放总线
  133.   delay_us(1);
  134.   return Dat;
  135. }
  136. /****************************************************/
  137. /***********将一个字节写入DS3231指定的地址***********/
  138. void I2cByteWrite(uchar device,uint addr,uchar bytedata)
  139. {
  140.   Start_I2C();
  141. // delay_us(1);
  142.   SendByte(device);
  143. // delay_us(1);
  144.   SendByte(addr);
  145. // delay_us(1);
  146.   SendByte(bytedata);
  147. // delay_us(1);
  148.   Stop_I2C();
  149. }
  150. /****************************************************/
  151. /************从DS3231指定的地址读一个字节************/
  152. uchar I2cByteRead(uchar device,uint addr)
  153. {
  154.   uchar Dat=0;
  155.   
  156.   Start_I2C();
  157.   SendByte(device);
  158. //  delay_us(1);
  159.   SendByte(addr);
  160. //  delay_us(1);
  161.   Start_I2C();
  162.   SendByte(0xd1);//读数
  163. // delay_us(1);
  164.   Dat=ReceiveByte(1);//只接收一个字节,所以发nACK
  165.   Stop_I2C();
  166.   return Dat;
  167. }
  168. /***************************************************/
  169. /*********************读取时间**********************/
  170. void Readtime(void)
  171. {
  172.   year=I2cByteRead(0xd0,0x06);  //年
  173.   month=I2cByteRead(0xd0,0x05); //月
  174.   date=I2cByteRead(0xd0,0x04);  //日
  175.   hour=I2cByteRead(0xd0,0x02);  //时
  176.   minute=I2cByteRead(0xd0,0x01);//分
  177.   second=I2cByteRead(0xd0,0x00);//秒
  178. }
  179. /***************************************************/
  180. /****************修改时间,BCD码输入*****************/
  181. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
  182. {
  183.   uchar temp=0;
  184.   
  185.   temp=HEX2BCD(yea);
  186.   I2cByteWrite(0xD0,0x06,temp);//修改年
  187.   
  188.   temp=HEX2BCD(mon);
  189.   I2cByteWrite(0xD0,0x05,temp);//修改月
  190.    
  191.   temp=HEX2BCD(da);
  192.   I2cByteWrite(0xD0,0x04,temp);//修改日
  193.   
  194.   temp=HEX2BCD(hou);
  195.   I2cByteWrite(0xD0,0x02,temp);//修改时
  196.   
  197.   temp=HEX2BCD(min);
  198.   I2cByteWrite(0xD0,0x01,temp);//修改分
  199.   
  200.   temp=HEX2BCD(sec);
  201.   I2cByteWrite(0xD0,0x00,temp);//修改秒
  202. }
  203. /****************************************************/
  204. /****************读取时间 计算 并显示****************/
  205. void get_show_time(void)
  206. {
  207. uchar temp1,temp2;
  208. char a[2];
  209. temp1=I2cByteRead(0xd0,0x06);  //年
  210. temp2=BCD2HEX(temp1);
  211. a[0]=table[temp2/10];
  212. a[1]=table[temp2%10];
  213. LCD_disp_string(0,1,a);
  214. LCD_disp_char(2,1,'-');

  215. temp1=I2cByteRead(0xd0,0x05);  //月
  216. temp2=BCD2HEX(temp1);
  217. a[0]=table[temp2/10];
  218. a[1]=table[temp2%10];
  219. LCD_disp_string(3,1,a);
  220. LCD_disp_char(5,1,'-');

  221. temp1=I2cByteRead(0xd0,0x04);  //日
  222. temp2=BCD2HEX(temp1);
  223. a[0]=table[temp2/10];
  224. a[1]=table[temp2%10];
  225. LCD_disp_string(6,1,a);
  226. LCD_disp_char(8,1,'-');

  227. temp1=I2cByteRead(0xd0,0x03);  //星期
  228. temp2=BCD2HEX(temp1);
  229. temp2=table[temp2];
  230. LCD_disp_char(9,1,temp2);
  231. LCD_disp_char(10,1,' ');

  232. LCD_disp_char(8,0,' ');
  233. if(clockset==0)
  234. {
  235. temp1=I2cByteRead(0xd0,0x02);  //时 24小时制
  236. temp1&=0x3f;     
  237. temp2=BCD2HEX(temp1);

  238. a[0]=table[temp2/10];
  239. a[1]=table[temp2%10];
  240. LCD_disp_string(8,0,a);
  241. LCD_disp_char(10,0,':');

  242. temp1=I2cByteRead(0xd0,0x01);  //分
  243. temp2=BCD2HEX(temp1);
  244. a[0]=table[temp2/10];
  245. a[1]=table[temp2%10];
  246. LCD_disp_string(11,0,a);
  247. LCD_disp_char(13,0,':');
  248.   
  249. temp1=I2cByteRead(0xd0,0x00);  //秒
  250. temp2=BCD2HEX(temp1);
  251. a[0]=table[temp2/10];
  252. a[1]=table[temp2%10];
  253. LCD_disp_string(14,0,a);

  254. }

  255. if(clockset!=0)
  256. {
  257. LCD_disp_string(8,0,"        ");
  258. a[0]=table[oclock[clockset-1][0]/10];
  259. a[1]=table[oclock[clockset-1][0]%10];
  260. LCD_disp_string(8,0,a);
  261. LCD_disp_char(10,0,'-');
  262. a[0]=table[oclock[clockset-1][1]/10];
  263. a[1]=table[oclock[clockset-1][1]%10];
  264. LCD_disp_string(11,0,a);
  265. LCD_disp_string(13,0,"CK");
  266. LCD_disp_char(15,0,table[clockoff[clockset-1]]);
  267. }

  268. }

  269. //显示温度

  270. void get_show_Temperature(void)
  271. {
  272.   if(change==0)
  273.   {
  274.     uchar Ttemp1,Ttemp2;
  275.    char a[2];
  276.     Ttemp1=I2cByteRead(0xd0,0x11);     //温度 高字节
  277.     Ttemp2=BCD2HEX(Ttemp1);
  278. //     LCD_disp_string(9,1,"     ");
  279. //    Ttemp3=I2cByteRead(0xd0,0x12);    //温度低字节
  280. //    Ttemp4=BCD2HEX(Ttemp3);
  281.     a[0]=table[Ttemp2/10];
  282.     a[1]=table[Ttemp2%10];
  283.     LCD_disp_string(13,1,a);
  284.     LCD_disp_char(15,1,'c');
  285.   }
  286.    
  287.   if(change!=0)
  288.   {
  289.    LCD_disp_string(13,1,"   ");
  290.   LCD_disp_char(15,1,table[change-1]);
  291.   }
  292.   
  293.   if((clockset!=0)&&(change==0))
  294. {
  295.    LCD_disp_string(13,1,"   ");
  296.    LCD_disp_char(13,1,table[clockset]);
  297.    LCD_disp_char(15,1,table[clockon]);
  298. }
  299.   
  300. }


  301. void change_del()
  302. {
  303.   uchar temp1,temp2,temp3,temp4;
  304.   if(change>0)
  305.   {
  306.    temp1=I2cByteRead(0xd0,change-1);  
  307.    temp2=BCD2HEX(temp1);
  308.    temp2-=1;
  309.    if(change<3)
  310.    {
  311.    if(temp2>59)
  312.      temp2=59;
  313.    }
  314.     if(change==3)
  315.     {
  316.       if(temp2>23)
  317.        temp2=23;
  318.     }
  319.    
  320.    if(change==4)
  321.    {
  322.      if(temp2==0)
  323.        temp2=7;
  324.    }
  325.     if(change==5)
  326.     {
  327.       if(temp2==0)
  328.       {
  329.         temp3=I2cByteRead(0xd0,0x05);  
  330.         temp4=BCD2HEX(temp3);
  331.         temp2=month_12[temp4-1];
  332.       }
  333.     }
  334.    if(change==6)
  335.    {
  336.       if(temp2==0)
  337.       temp2=12;  
  338.    }
  339.    
  340.     temp2=HEX2BCD(temp2);
  341.   I2cByteWrite(0xD0,change-1,temp2);//修改年
  342.   }
  343. }

  344. void change_add()
  345. {
  346.   uchar temp1,temp2,temp3,temp4;
  347.   if(change>0)
  348.   {
  349.    temp1=I2cByteRead(0xd0,change-1);  
  350.    temp2=BCD2HEX(temp1);
  351.    temp2+=1;
  352.    if(change<3)
  353.    {
  354.    if(temp2>59)
  355.      temp2=0;
  356.    }
  357.     if(change==3)
  358.     {
  359.       if(temp2>23)
  360.        temp2=0;
  361.     }
  362.    
  363.    if(change==4)
  364.    {
  365.      if(temp2==8)
  366.        temp2=1;
  367.    }
  368.     if(change==5)
  369.     {  
  370.         temp3=I2cByteRead(0xd0,0x05);  
  371.         temp4=BCD2HEX(temp3);
  372.         if(temp2>month_12[temp4-1])
  373.         temp2=1;   
  374.     }
  375.    if(change==6)
  376.    {
  377.       if(temp2==13)
  378.       temp2=1;  
  379.    }
  380.    
  381.     temp2=HEX2BCD(temp2);
  382.   I2cByteWrite(0xD0,change-1,temp2);//修改年
  383.   }
  384. }

  385. void change_set()
  386. {
  387.   ++change;
  388.   if(change>=8)
  389.     change=0;
  390. }


  391. void clock_set()
  392. {
  393. ++clockset;
  394. if(clockset>=6)
  395.    clockset=0;
  396. }

  397. void clock_add()
  398. {
  399.   change=0;
  400.   ++clockon;
  401.   if( clockon==3)
  402.     clockon=0;
  403. }

  404. void clock_change()
  405. {
  406.   if(clockon==1)
  407.   {
  408.     ++oclock[clockset-1][1];
  409.     if(oclock[clockset-1][1]>59)
  410.       oclock[clockset-1][1]=0;
  411.   }
  412.   
  413.   if(clockon==2)
  414.   {
  415.      ++oclock[clockset-1][0];
  416.     if(oclock[clockset-1][0]>23)
  417.       oclock[clockset-1][0]=0;
  418.   }
  419. }



  420. void Key_Icode(uchar dat)
  421. {
  422.    LCD_disp_char(10,1,' ');
  423. //  LCD_disp_string(10,1,"   ");
  424.    switch(dat)                    //第3个字节是数据,第4个字节是反码
  425.    {                                      //为了更稳定,可以加上第4个字节数据的判断
  426.    case KEY_0:KEY_VAL=0; LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' '); break;
  427.    case KEY_1:KEY_VAL=1; LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' '); break;
  428.    case KEY_2:KEY_VAL=2; LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' '); break;
  429.    case KEY_3:KEY_VAL=3; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  430.    case KEY_4:KEY_VAL=4; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  431.    case KEY_5:KEY_VAL=5; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  432.    case KEY_6:KEY_VAL=6;  LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' ');break;
  433.    case KEY_7:KEY_VAL=7; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  434.    case KEY_8:KEY_VAL=8; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  435.    case KEY_9:KEY_VAL=9; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  436.    case prex:LCD_disp_string(11,1,"PR");clock_change();break;
  437.    case nex :LCD_disp_string(11,1,"NX");clock_add();break;
  438.    case play_pause:LCD_disp_string(11,1,"PS");clock_set();break;
  439.    case ch_: LCD_disp_string(11,1,"C-");change_del();break;
  440.    case ch: LCD_disp_string(11,1,"CH");change_set();break;
  441.    case cha:LCD_disp_string(11,1,"C+");change_add();break;
  442.    case eq: LCD_disp_string(11,1,"EQ");
  443.              if(clockoff[clockset-1]==0)
  444.                clockoff[clockset-1]=1;
  445.              else clockoff[clockset-1]=0;
  446.                break;
  447.    case _a:LCD_disp_string(11,1,"V+");break;
  448.    case __:LCD_disp_string(11,1,"V-");break;
  449.    case _100a:LCD_disp_string(11,1,"1+");break;
  450.    case _200a:LCD_disp_string(11,1,"2+");break;
  451.    
  452.     case power:LCD_disp_string(11,1,"PW");break;
  453.    case up: LCD_disp_string(11,1,"UP");break;
  454.    case down:LCD_disp_string(11,1,"DW");break;
  455.    case left:LCD_disp_string(11,1,"LF");break;
  456.    case right:LCD_disp_string(11,1,"RT");break;
  457.    case ok:LCD_disp_string(11,1,"OK");break;
  458.    default:KEY_VAL=' ';break;
  459.    }
  460.   key_code[2]=' ';
  461.    
  462. }

  463. void oclockon()
  464. {
  465.   uchar clock_flag[5];
  466.   uchar temp1,temp2,temp3;
  467.   temp1=I2cByteRead(0xd0,0x02);  //时 24小时制
  468.   temp1&=0x3f;     
  469.   temp2=BCD2HEX(temp1);
  470.   
  471.   temp1=I2cByteRead(0xd0,0x01);  //分
  472.   temp3=BCD2HEX(temp1);
  473.   uchar i;
  474.   for(i=0;i<5;i++)
  475.   {
  476.     if(temp2==oclock[i][0])
  477.     {
  478.       if(temp3==oclock[i][1])
  479.       {
  480.         if(clockoff[i]==1)
  481.           clock_flag[i]=1;
  482.         else clock_flag[i]=0;
  483.       }
  484.       else clock_flag[i]=0;
  485.     }
  486.      else clock_flag[i]=0;
  487.   }
  488.   clock_on=0;
  489.   for(i=0;i<5;i++)
  490.   {
  491.     if(clock_flag[i]==1)
  492.       clock_on=1;
  493.   }
  494. }
复制代码
  1. #include"config.h"

  2. uchar t;
  3. /***********TA初始化*********/
  4. void init_TA()
  5. {
  6.   TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
  7.   TACCR0 = 60000;                            //5ms中断一次
  8.   TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
  9. }


  10. #pragma vector=TIMER0_A0_VECTOR  
  11. __interrupt void Timer_A (void)
  12. {

  13.   if(++t==200)
  14.   {  
  15.     t=0;
  16.     dh11_read();
  17.     get_show_Temperature();
  18.     get_show_time();
  19.     oclockon();
  20.   }
  21.   if(clock_on==1)
  22.     P1OUT ^= 0x08;
  23. }
复制代码





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
xyz549040622
1楼-- · 2019-07-17 14:01
:lol我上个51的
  1. /***************************************************************************/
  2. /* DEMO3231.C                                                              */
  3. /***************************************************************************/
  4. #include        <stdio.h>               /* Prototypes for I/O functions */
  5. #include        <DS5000.h>              /* Register declarations for DS5000 */
  6. /************************* bit definitions ****************************/
  7. sbit    scl = P0^0;             /* I2C pin definitions */
  8. sbit    sda = P0^1;
  9. sbit    E = P1^0;               /* DCM LCD module control signal definitions */
  10. sbit    RS = P1^1;
  11. sbit    RW = P1^2;
  12. sbit    CLK = P2^5;             /* DS1267 control signal definitions */
  13. sbit    RSTb = P2^6;
  14. sbit    DQ = P2^7;
  15. sbit    int0 = P3^2;
  16. /**************************** defines *******************************/
  17. #define ADDRTC  0xd0    /* DS3231 slave address (write) */
  18. #define ACK     0
  19. #define NACK    1
  20. /*********************** Function Prototypes **************************/
  21. void    start();
  22. void    stop();
  23. uchar   i2cwrite(uchar d);
  24. uchar   i2cread(char);
  25. void    wr_dsp_dat(uchar);
  26. void    wr_dsp_ins(uchar);
  27. uchar   rd_dsp_ins();
  28. void    hex2asc(uchar);
  29. void    dsp_adj(uchar pos);
  30. void    init_dsp();
  31. void    writebyte();
  32. void    initialize_DS3231();
  33. void    disp_regs();
  34. void    rd_temp();
  35. void    frq_out_tog();
  36. void    init_alrm();
  37. void    comm_init();
  38. /************************* Global Variables ***************************/
  39. xdata   uchar   sec, min, hr, dy, dt, mn, yr;
  40. /**************************** functions ******************************/
  41. void start()            /* --------- Initiate start condition ---------- */
  42. {
  43.         sda = 1;  scl = 1;
  44.         sda = 0;
  45. }
  46. void stop()             /* ---------- Initiate stop condition ----------- */
  47. {
  48.         sda = 0;  sda = 0;
  49.         scl = 1;  scl = 1;  sda = 1;
  50. }
  51. uchar i2cwrite(uchar d)         /* ----------------------------- */
  52. {
  53. uchar i;

  54.         scl = 0;
  55.         for (i = 0;i < 8; i++)
  56.         {
  57.                 if (d & 0x80)
  58.                         sda = 1; /* Send the msbits first */
  59.                 else
  60.                         sda = 0;
  61.                 scl = 0;
  62.                 scl = 1;
  63.                 d = d << 1;     /* do shift here to increase scl high time */
  64.                 scl = 0;
  65.         }
  66.         sda = 1;        /* Release the sda line */
  67.         scl = 0;
  68.         scl = 1;
  69.         i = sda;
  70.         if (i) printf("Ack bit missing  %02X ",(unsigned int)d);
  71.         scl = 0;
  72.         return(i);
  73. }
  74. uchar i2cread(char b)   /* ----------------------------------- */
  75. {
  76. uchar i, d;

  77.         d = 0;
  78.         sda = 1;             /* Let go of sda line */
  79.         scl = 0;
  80.         for (i = 0; i < 8; i++) /* read the msb first */
  81.         {
  82.                 scl = 1;
  83.                 d = d << 1;
  84.                 d = d | (unsigned char)sda;
  85.                 scl = 0;
  86.         }
  87.         sda = b;          /* low for ack, high for nack */
  88.         scl = 1;
  89.         scl = 0;

  90.         sda = 1;          /* Release the sda line */
  91.         return d;
  92. }
  93. void    wr_dsp_dat(uchar dat)   /* -------- write one byte to the display --------- */
  94. {
  95.         P0 = dat;
  96.         RS = 1; /* data register */
  97.         RW = 0; /* write */
  98.         E = 1;
  99.         E = 0;          /* latch data in */
  100. }
  101. void    wr_dsp_ins(uchar dat)   /* ---- write one byte to the display instruction ----- */
  102. {
  103.         P0 = dat;
  104.         RS = 0; /* instruction register */
  105.         RW = 0; /* write */
  106.         E = 1;
  107.         E = 0;          /* latch data in */
  108. }
  109. uchar   rd_dsp_ins()    /* ---- read one byte from the instruction registers ----- */
  110. {
  111. uchar   dat;
  112.         P0 = 0xff;      /* set up for read */
  113.         RS = 0; /* instruction register */
  114.         RW = 1; /* read */
  115.         E = 1;
  116.         dat = P0;
  117.         E = 0;
  118.         return(dat);
  119. }
  120. void    init_dsp()      /* -------- initialize DMC-16207 LCD display ------- */
  121. {
  122.         while((rd_dsp_ins() & 0x80));   /* wait for display */

  123.         wr_dsp_ins(0x38);       /* Set 8-bit data, 2-line display, 5X7 font */
  124.         while((rd_dsp_ins() & 0x80));
  125.         wr_dsp_ins(0x0c);       /* Display on, cursor off, blink off */
  126.         while((rd_dsp_ins() & 0x80));
  127.         wr_dsp_ins(0x06);       /* Entry mode set: increment, no display shift */
  128.         while((rd_dsp_ins() & 0x80));
  129.         wr_dsp_ins(0x01);       /* clear display */
  130.         while((rd_dsp_ins() & 0x80));
  131.         wr_dsp_ins(0x80);       /* move to start of line 1 */
  132.         while((rd_dsp_ins() & 0x80));

  133.         wr_dsp_ins(0x50);       /* Set CG RAM address */
  134.         while((rd_dsp_ins() & 0x80));
  135.         wr_dsp_dat(0x07);       /* write 1st line of custom char to CG RAM */
  136.         while((rd_dsp_ins() & 0x80));
  137.         wr_dsp_dat(0x05);       /* write 2nd line */
  138.         while((rd_dsp_ins() & 0x80));
  139.         wr_dsp_dat(0x07);       /* write 3rd line */
  140.         while((rd_dsp_ins() & 0x80));
  141.         wr_dsp_dat(0x00);       /* write 4th line */
  142.         while((rd_dsp_ins() & 0x80));
  143.         wr_dsp_dat(0x00);       /* write 5th line */
  144.         while((rd_dsp_ins() & 0x80));
  145.         wr_dsp_dat(0x00);       /* write 6th line */
  146.         while((rd_dsp_ins() & 0x80));
  147.         wr_dsp_dat(0x00);       /* write 7th line */
  148.         while((rd_dsp_ins() & 0x80));
  149. }
  150. void    hex2asc(uchar hex)      /* -- convert the upper and lower nibbles to 2 ascii characters -- */
  151. {
  152.         if( ( (hex & 0xf0) >> 4) < 0x0a)
  153.                 wr_dsp_dat( ( (hex & 0xf0) >> 4) + 48 );        /* prints 0-9 */
  154.         else
  155.                 wr_dsp_dat( ( (hex & 0xf0) >> 4) + 55 );        /* prints A-F */
  156.         while((rd_dsp_ins() & 0x80));

  157.         if( (hex & 0x0f) < 0x0a)
  158.                 wr_dsp_dat( (hex & 0x0f) + 48 );
  159.         else
  160.                 wr_dsp_dat( (hex & 0x0f) + 55 );
  161.         while((rd_dsp_ins() & 0x80));
  162. }
  163. void    dsp_adj(uchar pos)      /* ------ adjust contrast on LCD display ------- */
  164. {
  165. char    inc;

  166.         RSTb = CLK = 0;                 /* initialize for 1st pass */
  167.         RSTb = 1;                               /* enable DS1267 */
  168.         DQ = 0;                         /* write stack select bit */
  169.         CLK = 1;                                /* toggle clk with data valid */
  170.         CLK = 0;

  171.         for (inc = 7; inc >= 0; inc--)  /* write wiper 0 */
  172.         {
  173.                 DQ = ((pos >> inc) & 0x01);     /* shift x bits left */
  174.                 CLK = 0;                        /* toggle clk with data valid */
  175.                 CLK = 1;
  176.         }
  177.         for (inc = 7; inc >= 0; inc--)  /* write wiper 1 */
  178.         {
  179.                 DQ = ((pos >> inc) & 0x01);     /* shift x bits left */
  180.                 CLK = 0;                        /* toggle clk with data valid */
  181.                 CLK = 1;
  182.         }
  183.         RSTb = 0;                               /* reset the 1267 (/RST & CLK low) */
  184.         CLK = 0;
  185. }
  186. void writebyte()        /* ----------------------------------------------- */
  187. {
  188. uchar Add, Data;

  189.         printf(" ADDRESS (hex):");             /* Get Address & Data */
  190.         scanf("%bx", &Add);
  191.         printf("DATA (hex):");
  192.         scanf("%bx", &Data);

  193.         start();
  194.         i2cwrite(ADDRTC);
  195.         i2cwrite(Add);
  196.         i2cwrite(Data);
  197.         stop();
  198. }
  199. void    initialize_DS3231()     /* ----- set time & date; user data entry ------ */
  200. /* Note: NO error checking is done on the user entries! */
  201. {
  202.         printf(" Enter the year (0-99): ");
  203.         scanf("%bx", &yr);
  204.         printf("Enter the month (1-12): ");
  205.         scanf("%bx", &mn);
  206.         printf("Enter the date (1-31): ");
  207.         scanf("%bx", &dt);
  208.         printf("Enter the day (1-7): ");
  209.         scanf("%bx", &dy);
  210.         printf("Enter the hour (1-23): ");
  211.         scanf("%bx", &hr);
  212.         /* hr = hr & 0x3f;      /* force clock to 24 hour mode */
  213.         printf("Enter the minute (0-59): ");
  214.         scanf("%bx", &min);
  215.         printf("Enter the second (0-59): ");
  216.         scanf("%bx", &sec);

  217.         start();
  218.         i2cwrite(ADDRTC);       /* write slave address, write 1339 */
  219.         i2cwrite(0x00); /* write register address, 1st clock register */
  220.         i2cwrite(sec);
  221.         i2cwrite(min);
  222.         i2cwrite(hr);
  223.         i2cwrite(dy);
  224.         i2cwrite(dt);
  225.         i2cwrite(mn);
  226.         i2cwrite(yr);
  227.         i2cwrite(0x10); /* enable sqw, 1hz output */
  228.         stop();
  229. }
  230. void    disp_regs()     /* --- display date/time on LCD display --- */
  231. {
  232. uchar   age, prv_sec=99;

  233.         while(!RI)      /* Read & Display Clock Registers */
  234.         {
  235.                 while(int0);    /* loop until int pin goes low */
  236.                 start();
  237.                 i2cwrite(ADDRTC);
  238.                 i2cwrite(0x0f);
  239.                 i2cwrite(0);            /* clear alarm flags */
  240.                 stop();

  241.                 start();
  242.                 i2cwrite(ADDRTC);
  243.                 i2cwrite(0);
  244.                 start();
  245.                 i2cwrite(ADDRTC | 1);
  246.                 sec = i2cread(ACK);
  247.                 min = i2cread(ACK);
  248.                 hr = i2cread(ACK);
  249.                 dy = i2cread(ACK);
  250.                 dt = i2cread(ACK);
  251.                 mn = i2cread(ACK);
  252.                 yr = i2cread(NACK);
  253.                 stop();

  254.                 wr_dsp_ins(0x80);       /* move to start of line 1 */
  255.                 while((rd_dsp_ins() & 0x80));
  256.                 hex2asc(yr);
  257.                 wr_dsp_dat('/');
  258.                 while((rd_dsp_ins() & 0x80));
  259.                 hex2asc(mn);
  260.                 wr_dsp_dat('/');
  261.                 while((rd_dsp_ins() & 0x80));
  262.                 hex2asc(dt);
  263.                 wr_dsp_dat(' ');
  264.                 while((rd_dsp_ins() & 0x80));
  265.                 hex2asc(dy);
  266.                 wr_dsp_dat(' ');
  267.                 while((rd_dsp_ins() & 0x80));

  268.                 start();
  269.                 i2cwrite(ADDRTC);
  270.                 i2cwrite(0x10);
  271.                 start();
  272.                 i2cwrite(ADDRTC | 1);
  273.                 age = i2cread(NACK);
  274.                 stop();

  275.                 wr_dsp_dat(' ');
  276.                 while((rd_dsp_ins() & 0x80));
  277.                 hex2asc(age);

  278.                 wr_dsp_ins(0xc0);       /* move to start of line 2 */
  279.                 while((rd_dsp_ins() & 0x80));
  280.                 hex2asc(hr);
  281.                 wr_dsp_dat(':');
  282.                 while((rd_dsp_ins() & 0x80));
  283.                 hex2asc(min);
  284.                 wr_dsp_dat(':');
  285.                 while((rd_dsp_ins() & 0x80));
  286.                 hex2asc(sec);

  287.                 rd_temp();
  288.         }
  289.         RI = 0;  /* Swallow keypress to exit loop */
  290. }
  291. void    rd_temp()       /* -------- display temperature -------- */
  292. {
  293. char    str[8];
  294. int     itemp;
  295. float   ftemp;

  296.         do
  297.         {
  298.                 start();
  299.                 i2cwrite(ADDRTC);
  300.                 i2cwrite(0x0e);         /* address of control register */
  301.                 start();
  302.                 i2cwrite(ADDRTC + 1);   /* send the device address for read */
  303.                 itemp = i2cread(NACK);  /* get the control register value */
  304.                 stop();
  305.         }       while(itemp & 0x20);            /* wait until CNVT bit goes inactive */

  306.         start();
  307.         i2cwrite(ADDRTC);
  308.         i2cwrite(0x11);                 /* address of temperature MSB */
  309.         start();
  310.         i2cwrite(ADDRTC + 1);           /* send the device address for read */
  311.         itemp = ( (int) i2cread(ACK) << 5 );
  312.         itemp += ( i2cread(NACK) >> 3);
  313.         stop();
  314.         if(itemp & 0x1000)      itemp += 0xe000;        /* if sign bit set, make 16 bit 2's comp */

  315.         ftemp = 0.03125 * (float) itemp;        /* convert to degrees C */
  316.         /* ftemp = ftemp * 9 / 5 + 32;  /* skip this if you don't want degrees F */

  317.         sprintf(str, "%5.2f", ftemp);

  318.         wr_dsp_ins(0xc9);                       /* go to line 2, column 10 */
  319.         while((rd_dsp_ins() & 0x80));
  320.         wr_dsp_dat(str[0]);
  321.         while((rd_dsp_ins() & 0x80));
  322.         wr_dsp_dat(str[1]);
  323.         while((rd_dsp_ins() & 0x80));
  324.         wr_dsp_dat(str[2]);
  325.         while((rd_dsp_ins() & 0x80));
  326.         wr_dsp_dat(str[3]);
  327.         while((rd_dsp_ins() & 0x80));

  328.         wr_dsp_dat(0x02);       /* display programed 3rd char in CG RAM */
  329.         while((rd_dsp_ins() & 0x80));
  330. }
  331. void    frq_out_tog()   /* --- toggle en32khz bit to enable/disable sqw --- */
  332. {
  333. uchar   val;

  334.         start();
  335.         i2cwrite(ADDRTC);
  336.         i2cwrite(0x0f);                 /* control/status reg address */
  337.         start();
  338.         i2cwrite(ADDRTC + 1);           /* send the device address for read */
  339.         val = i2cread(NACK);
  340.         stop();
  341.         val ^= 0x08;    /* toggle en32khz bit */
  342.         start();
  343.         i2cwrite(ADDRTC);
  344.         i2cwrite(0x0f);                 /* control/status reg address */
  345.         i2cwrite(val);
  346.         stop();
  347. }
  348. void    init_alrm()     /* --- enable alarm 1 for once-per-second --- */
  349. {
  350.         start();
  351.         i2cwrite(ADDRTC);
  352.         i2cwrite(7);            /* 1st alarm 1 reg address */
  353.         i2cwrite(0x80); /* mask alarm register */
  354.         i2cwrite(0x80);
  355.         i2cwrite(0x80);
  356.         i2cwrite(0x80);
  357.         stop();

  358.         start();
  359.         i2cwrite(ADDRTC);
  360.         i2cwrite(0x0e); /* control/status reg address */
  361.         i2cwrite(0x05); /* enable interrupts, alarm 1 output */
  362. }
  363. void    comm_init()     /* ------ reset DS3231 comm interface ------ */
  364. {
  365.         do      /* because the DS3231 I2C interface is active for both supplies */
  366.         {       /*  after a micro reset, we must get the comm into a known state */
  367.                 sda = 1;        /* make sure master has released SDA */
  368.                 scl = 1;
  369.                 if(sda) /* if sda is high, generate a start */
  370.                 {
  371.                         sda = 0;        /* The DS3231 will recognize a valid start */
  372.                         sda = 1;        /*  condition anywhere in a I2C data transfer */
  373.                 }
  374.                 scl = 0;
  375.         }       while(sda == 0);        /* if the DS3231 is holding sda low, try again */
  376. }
  377. void    main    (void)  /* ------------------------------------------------ */
  378. {
  379. uchar i, M, M1;

  380.         dsp_adj(0x10);  /* adjust contrast on LCD display */
  381.         init_dsp();             /* initialize LCD display */
  382.         comm_init();
  383.         init_alrm();            /* enable alarm */
  384.         disp_regs();

  385.         while(1)
  386.         {
  387.                 printf(" DS3231 build date: %s ", __DATE__);
  388.                 printf("I Init DS3231 S Show temp ");
  389.                 printf("R Read Time   W Write Byte ");
  390.                 printf("F Frq out     D Display adj ");
  391.                 printf("Enter Menu Selection: ");

  392.                 M = _getkey();

  393.                 switch(M)
  394.                 {
  395.                         case 'D':
  396.                         case 'd':       printf("val: ");        scanf("%bx", &M1);
  397.                                         dsp_adj(M1);    break;

  398.                         case 'F':
  399.                         case 'f':       frq_out_tog();  break;

  400.                         case 'I':
  401.                         case 'i':       initialize_DS3231();    break;

  402.                         case 'R':
  403.                         case 'r':       disp_regs();    break;

  404.                         case 'S':
  405.                         case 's':       rd_temp();      break;

  406.                         case 'W':
  407.                         case 'w':       writebyte();    break;
  408.                 }
  409.         }
复制代码
huarana
2楼-- · 2019-07-17 15:16
我上个通用的。 其实是stm32下的,不过很好移植

  1. #include "ds3231.h"

  2. u8        dis_buf_date[]={0,0,'-',0,0,' ',0,0,':',0,0,':',0,0,''};
  3. u8        dis_buf_temp[]={0,0,'.',0,0,''};
  4. u8        txd_buf_date[];


  5. //BCD转换为Byte
  6. u8 BCD2_Hex(u8 val)
  7. {
  8.         u8 temp;
  9.         temp = val & 0x0f;
  10.         val>>= 4;
  11.         val &= 0x0f;
  12.         val *= 10;
  13.         temp+= val;
  14.         return temp;
  15. }

  16. //B转换为BCD
  17. u8 HEX2_Bcd(u8 val)
  18. {
  19.         u8 i,j,k;
  20.         i = val/10;
  21.         j = val%10;
  22.         k = j+(i<<4);
  23.         return k;
  24. }

  25. ////初始化IIC
  26. //void IIC_Init(void)
  27. //{                                             
  28. //        GPIO_InitTypeDef GPIO_InitStructure;
  29. //        //RCC->APB2ENR|=1<<4;//先使能外设IO PORTB时钟
  30. //        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
  31. //          
  32. //        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  33. //        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  34. //        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35. //        GPIO_Init(GPIOB, &GPIO_InitStructure);
  36. //
  37. //        IIC_SCL=1;
  38. //        IIC_SDA=1;

  39. //}

  40. //初始化IIC
  41. void IIC_Init(void)
  42. {                                             
  43.         GPIO_InitTypeDef GPIO_InitStructure;
  44.         //RCC->APB2ENR|=1<<4;//先使能外设IO PORTB时钟
  45.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );       
  46.           
  47.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  48.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  49.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  51.         IIC_SCL=1;
  52.         IIC_SDA=1;

  53. }
  54. //产生IIC起始信号
  55. void IIC_Start(void)
  56. {
  57.         SDA_OUT();     //sda线输出
  58.         IIC_SDA=1;                    
  59.         IIC_SCL=1;
  60.         delay_us(5);
  61.         IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  62.         delay_us(5);
  63.         IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  64. }          
  65. //产生IIC停止信号
  66. void IIC_Stop(void)
  67. {
  68.         SDA_OUT();//sda线输出
  69.         delay_us(5);
  70.         IIC_SCL=0;
  71.         delay_us(5);
  72.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  73.         delay_us(5);
  74.         IIC_SCL=1;
  75.         delay_us(5);
  76.         IIC_SDA=1;//发送I2C总线结束信号
  77.         delay_us(5);                                                                  
  78. }
  79. //等待应答信号到来
  80. //返回值:1,接收应答失败
  81. //        0,接收应答成功
  82. u8 IIC_Wait_Ack(void)
  83. {
  84.         u8 ucErrTime=0;
  85.         SDA_IN();      //SDA设置为输入  
  86.         IIC_SDA=1;delay_us(2);          
  87.         IIC_SCL=1;delay_us(2);         
  88.         while(READ_SDA)
  89.         {
  90.                 ucErrTime++;
  91.                 if(ucErrTime>250)
  92.                 {
  93.                         IIC_Stop();
  94.                         return 1;
  95.                 }
  96.         }
  97.         IIC_SCL=0;//时钟输出0           
  98.         return 0;  
  99. }
  100. //产生ACK应答
  101. void IIC_Ack(void)
  102. {
  103.         IIC_SCL=0;
  104.         SDA_OUT();
  105.         IIC_SDA=0;
  106.         delay_us(5);
  107.         IIC_SCL=1;
  108.         delay_us(5);
  109.         IIC_SCL=0;
  110. }
  111. //不产生ACK应答                    
  112. void IIC_NAck(void)
  113. {
  114.         IIC_SCL=0;
  115.         SDA_OUT();
  116.         IIC_SDA=1;
  117.         delay_us(5);
  118.         IIC_SCL=1;
  119.         delay_us(5);
  120.         IIC_SCL=0;
  121. }                                                                              
  122. //IIC发送一个字节
  123. //返回从机有无应答
  124. //1,有应答
  125. //0,无应答                          
  126. void IIC_Send_Byte(u8 txd)
  127. {                        
  128.     u8 t;   
  129.         SDA_OUT();             
  130.     IIC_SCL=0;//拉低时钟开始数据传输
  131.     for(t=0;t<8;t++)
  132.     {              
  133.         IIC_SDA=(txd&0x80)>>7;
  134.         txd<<=1;           
  135.                 delay_us(5);   //对TEA5767这三个延时都是必须的
  136.                 IIC_SCL=1;
  137.                 delay_us(5);
  138.                 IIC_SCL=0;       
  139.                 delay_us(5);
  140.     }         
  141. }             
  142. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  143. u8 IIC_Read_Byte(unsigned char ack)
  144. {
  145.         unsigned char i,receive=0;
  146.         SDA_IN();//SDA设置为输入
  147.     for(i=0;i<8;i++ )
  148.         {
  149.         IIC_SCL=0;
  150.         delay_us(5);
  151.                 IIC_SCL=1;
  152.         receive<<=1;
  153.         if(READ_SDA)receive++;   
  154.                 delay_us(5);
  155.     }                                         
  156.     if (!ack)
  157.         IIC_NAck();//发送nACK
  158.     else
  159.         IIC_Ack(); //发送ACK   
  160.     return receive;
  161. }
  162. //指定地址写数据/命令
  163. void DS3231_WriteByte(u8 addr,u8 dat)
  164.         {
  165.          IIC_Start();
  166.          IIC_Send_Byte(DS3231_WriteAddress);
  167.          IIC_Wait_Ack();
  168.          IIC_Send_Byte(addr);
  169.          IIC_Wait_Ack();
  170.          IIC_Send_Byte(dat);
  171.          IIC_Wait_Ack();
  172.          IIC_Stop();
  173.         }
  174. u8 DS3231_ReadCurrent(void)
  175.         {
  176.          u8 read_dat;
  177.          IIC_Start();
  178.          IIC_Send_Byte(DS3231_ReadAddress);
  179.          IIC_Wait_Ack();
  180.          read_dat=IIC_Read_Byte(1);
  181.          IIC_Stop();       
  182.          return read_dat;
  183.         }
  184. u8 DS3231_ReadRandom(u8 random_addr)
  185.         {
  186.          IIC_Start();
  187.          IIC_Send_Byte(DS3231_WriteAddress);
  188.          IIC_Wait_Ack();
  189.      IIC_Send_Byte(random_addr);
  190.      IIC_Wait_Ack();
  191.      return (DS3231_ReadCurrent());               
  192.         }
  193. void DS3231_ModifyTime(u8 yea,u8 mon,u8 day,u8 hou,u8 min,u8 sec)
  194.         {
  195.           u8 temp=0;
  196.                 temp=HEX2_Bcd(yea);
  197.                 DS3231_WriteByte(DS3231_YEAR,temp);                //修改年
  198.                
  199.                 temp=HEX2_Bcd(mon);
  200.                 DS3231_WriteByte(DS3231_MONTH,temp);        //修改月
  201.                
  202.                 temp=HEX2_Bcd(day);
  203.                 DS3231_WriteByte(DS3231_DAY,temp);                //修改日
  204.                
  205.                 temp=HEX2_Bcd(hou);
  206.                 DS3231_WriteByte(DS3231_HOUR,temp);                //修改时
  207.                
  208.                 temp=HEX2_Bcd(min);
  209.                 DS3231_WriteByte(DS3231_MINUTE,temp);        //修改分       
  210.                
  211.                 temp=HEX2_Bcd(sec);
  212.                 DS3231_WriteByte(DS3231_SECOND,temp);        //修改秒       
  213.         }
  214. void TimeDisplay(u8 Dhour,u8 Dmin,u8 Dsec)
  215.         {
  216.                 dis_buf_date[6]=Dhour/10        +0x30;        // 时十位
  217.                 dis_buf_date[7]=Dhour%10        +0x30;        // 时个位
  218.                 dis_buf_date[9]=Dmin /10        +0x30;         // 分十位
  219.                 dis_buf_date[10]=Dmin%10        +0x30;         // 分个位
  220.                 dis_buf_date[12]=Dsec/10        +0x30;         // 秒十位
  221.                 dis_buf_date[13]=Dsec%10        +0x30;         // 秒个位
  222.         }
  223. void DateDisplay(u8 Dyear,u8 Dmonth,u8 Dday)
  224.         {
  225. //                dis_buf_date[0]=Dyear / 10        +0x30;        // 年十位
  226. //                dis_buf_date[1]=Dyear % 10        +0x30;        // 年个位
  227.                 dis_buf_date[0]=Dmonth/10        +0x30;       // 月十位
  228.                 dis_buf_date[1]=Dmonth%10        +0x30;       // 月个位
  229.                 dis_buf_date[3]=Dday /10        +0x30;         // 天十位
  230.                 dis_buf_date[4]=Dday %10        +0x30;         // 天个位
  231.                
  232. //                dis_buf_date[3]=Dmonth/10        +0x30;       // 月十位
  233. //                dis_buf_date[4]=Dmonth%10        +0x30;       // 月个位
  234. //                dis_buf_date[0]=Dday /10        +0x30;         // 天十位
  235. //                dis_buf_date[1]=Dday %10        +0x30;         // 天个位
  236.         }
  237. void TempDisplay(u8 TempH,u8 TempL)
  238.         {
  239.                 dis_buf_temp[0]=TempH / 10        +0x30;       //
  240.                 dis_buf_temp[1]=TempH % 10        +0x30;       //
  241.                 dis_buf_temp[3]=TempL / 10        +0x30;         //
  242.                 dis_buf_temp[4]=TempL % 10        +0x30;         //
  243.         }
  244. void get_show_time(void)
  245.         {
  246.                 u8 Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;
  247.                
  248.                 Stemp1=DS3231_ReadRandom(DS3231_SECOND);  //秒
  249.                 Stemp2=BCD2_Hex(Stemp1);
  250.                 Mtemp1=DS3231_ReadRandom(DS3231_MINUTE);  //分
  251.                 Mtemp2=BCD2_Hex(Mtemp1);
  252.                 Htemp1=DS3231_ReadRandom(DS3231_HOUR);    //时 24小时制
  253. //                Htemp1&=0x3f;


  254.                 Htemp2=BCD2_Hex(Htemp1);

  255.                 TimeDisplay(Htemp2,Mtemp2,Stemp2);
  256.                 txd_buf_date[3]=Htemp2;
  257.                 txd_buf_date[4]=Mtemp2;
  258.                 txd_buf_date[5]=Stemp2;
  259.         }
  260. void get_show_date(void)
  261.         {
  262.                 u8 Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;
  263.                 Dtemp1=DS3231_ReadRandom(DS3231_DAY);         //日
  264.                 Dtemp2=BCD2_Hex(Dtemp1);       
  265.                 Mtemp1=DS3231_ReadRandom(DS3231_MONTH);       //月
  266.                 Mtemp2=BCD2_Hex(Mtemp1);
  267.                 Ytemp1=DS3231_ReadRandom(DS3231_YEAR);        //年
  268. //                IIC_NAck();//发送nACK
  269.                 Ytemp2=BCD2_Hex(Ytemp1);          
  270.                 DateDisplay(Ytemp2,Mtemp2,Dtemp2);
  271.                 txd_buf_date[0]=Ytemp2;
  272.                 txd_buf_date[1]=Mtemp2;
  273.                 txd_buf_date[2]=Dtemp2;
  274.         }
  275. //void get_show_Temperature(void)
  276. //        {
  277. //                u8 Ttemp1,Ttemp2,Ttemp3,Ttemp4;

  278. //                Ttemp1=DS3231_ReadRandom(DS3231_TEMPERATUREH);    //温度 高字节
  279. //                Ttemp2=BCD2_Hex(Ttemp1);
  280. //          
  281. //                Ttemp3=DS3231_ReadRandom(DS3231_TEMPERATUREL);    //温度低字节
  282. //                Ttemp4=BCD2_Hex(Ttemp3);
  283. //               
  284. //                TempDisplay(Ttemp2,Ttemp4);
  285. //        }
  286. void get_show_Temperature(void)                                //温度数据是以2?进制格式存储的并不需要数制转换?
  287.         {                                                                               
  288. //                u8 Ttemp1,Ttemp2,Ttemp3,Ttemp4;
  289.                 u8 Ttemp2,Ttemp4;
  290.                 DS3231_WriteByte(0x0e,0x20);                //0x0e寄存器的CONV位置1开启温度转换?       
  291.                
  292.                 Ttemp2=DS3231_ReadRandom(DS3231_TEMPERATUREH);    //温度 高字节
  293. //                Ttemp2=BCD2_Hex(Ttemp1);
  294.           
  295.                 Ttemp4=DS3231_ReadRandom(DS3231_TEMPERATUREL);    //温度低字节
  296.                 IIC_NAck();//发送nACK
  297. //                Ttemp4=BCD2_Hex(Ttemp3);
  298.                 Ttemp4=(Ttemp4>>6)*25;                                //将BIT7,BIT6的数据移入BIT1,BIT0位;分辨率数值扩大100倍便于整数运算       
  299.                 TempDisplay(Ttemp2,Ttemp4);
  300.         }
复制代码
  1. #ifndef        _DS3231_H_
  2. #define        _DS3231_H_

  3. #include "sys.h"
  4. #include "delay.h"

  5. ///*端口设置*/
  6. //#define IIC_SCL         PBout(6)       //SCLK  时钟   
  7. //#define IIC_SDA         PBout(7)       //SDA   写数据  
  8. //#define        READ_SDA        PBin(7)                                 //SDA   读数据

  9. ////IO方向设置
  10. //#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;/*GPIOB->ODR|=1<<7;*/}                        //设置SDA口为上拉输入
  11. //#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}                                                        //设置SDA口为推挽输出


  12. /*端口设置*/
  13. #define IIC_SCL         PAout(6)       //SCLK  时钟   
  14. #define IIC_SDA         PAout(7)       //SDA   写数据  
  15. #define        READ_SDA        PAin(7)                                 //SDA   读数据

  16. //IO方向设置
  17. #define SDA_IN()  {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)8<<28;/*GPIOA->ODR|=1<<7;*/}                        //设置SDA口为上拉输入
  18. #define SDA_OUT() {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)3<<28;}                                                        //设置SDA口为推挽输出
  19. //DS3231初始宏设置
  20. #define DS3231_WriteAddress 0xD0    //器件写地址
  21. #define DS3231_ReadAddress  0xD1    //器件读地址
  22. #define DS3231_SECOND       0x00    //秒
  23. #define DS3231_MINUTE       0x01    //分
  24. #define DS3231_HOUR         0x02    //时
  25. #define DS3231_WEEK         0x03    //星期
  26. #define DS3231_DAY          0x04    //日
  27. #define DS3231_MONTH        0x05    //月
  28. #define DS3231_YEAR         0x06    //年
  29. //闹铃1            
  30. #define DS3231_SALARM1ECOND 0x07    //秒
  31. #define DS3231_ALARM1MINUTE 0x08    //分
  32. #define DS3231_ALARM1HOUR   0x09    //时
  33. #define DS3231_ALARM1WEEK   0x0A    //星期/日
  34. //闹铃2
  35. #define DS3231_ALARM2MINUTE 0x0b    //分
  36. #define DS3231_ALARM2HOUR   0x0c    //时
  37. #define DS3231_ALARM2WEEK   0x0d    //星期/日
  38. #define DS3231_CONTROL      0x0e    //控制寄存器
  39. #define DS3231_STATUS       0x0f    //状态寄存器
  40. #define BSY                 2       //忙
  41. #define OSF                 7       //振荡器停止标志
  42. #define DS3231_XTAL         0x10    //晶体老化寄存器
  43. #define DS3231_TEMPERATUREH 0x11    //温度寄存器高字节(8位)
  44. #define DS3231_TEMPERATUREL 0x12    //温度寄存器低字节(高2位)


  45. //IIC所有操作函数
  46. void         IIC_Init(void);                        //初始化IIC的IO口                                 
  47. void         IIC_Start(void);                                //发送IIC开始信号
  48. void         IIC_Stop(void);                                          //发送IIC停止信号
  49. void         IIC_Send_Byte(u8 txd);                        //IIC发送一个字节
  50. u8                 IIC_Read_Byte(u8);                                //IIC读取一个字节
  51. u8                 IIC_Wait_Ack(void);                         //IIC等待ACK信号
  52. void         IIC_Ack(void);                                        //IIC发送ACK信号
  53. void         IIC_NAck(void);                                        //IIC不发送ACK信号
  54. u8                 BCD2_Hex(u8);
  55. u8                 HEX2_Bcd(u8);
  56. void         DS3231_WriteByte(u8,u8);
  57. u8                 DS3231_ReadCurrent(void);
  58. u8                 DS3231_ReadRandom(u8);
  59. void         DS3231_ModifyTime(u8,u8,u8,u8,u8,u8);

  60. void TimeDisplay(u8 Dhour,u8 Dmin,u8 Dsec);
  61. void DateDisplay(u8 Dyear,u8 Dmonth,u8 Dday);
  62. void TempDisplay(u8 TempH,u8 TempL);
  63. void get_show_time(void);
  64. void get_show_date(void);
  65. void get_show_Temperature(void);



  66. #endif
复制代码
songchenping
3楼-- · 2019-07-17 16:36
真是烟花缭乱啊。何必不弄个下载版本啊
yxycdz
4楼-- · 2019-07-17 22:13
真是看得眼花了
czq123321
5楼-- · 2019-07-18 03:44
 精彩回答 2  元偷偷看……
lvyunhua
6楼-- · 2019-07-18 04:13
好长啊。

一周热门 更多>