找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1143|回复: 1
收起左侧

单片机1302时钟程序

[复制链接]
ID:970990 发表于 2022-1-29 21:08 | 显示全部楼层 |阅读模式
寒假学习51单片机,发一篇帖子记录一下,就当是学习日记吧!以下是主函数main.c

1302时钟电路图

1302时钟电路图

  1. #include <REGX52.H>
  2. #include "LCD1602.h"
  3. #include "DS1302.h"
  4. #include "Key.h"
  5. #include "Timer0.h"
  6. unsigned char Mode=0,LocationSelect,KeyNum;
  7. unsigned int i,k;

  8. /*
  9.         显示时间函数
  10. */
  11. void ShowTime()
  12. {
  13.                 DS1302_ReadTime();               
  14.                 LCD_ShowNum(1,1,DS1302_DefaultTime[0],2);
  15.                 LCD_ShowNum(1,4,DS1302_DefaultTime[1],2);
  16.                 LCD_ShowNum(1,7,DS1302_DefaultTime[2],2);
  17.                 LCD_ShowNum(1,10,DS1302_DefaultTime[3],1);
  18.                 LCD_ShowNum(2,1,DS1302_DefaultTime[4],2);
  19.                 LCD_ShowNum(2,4,DS1302_DefaultTime[5],2);
  20.                 LCD_ShowNum(2,7,DS1302_DefaultTime[6],2);

  21. }
  22. /*
  23.         设置时间函数
  24. */
  25. void SetTime()
  26. {
  27.         
  28.         

  29.                 if(KeyNum)
  30.                 {
  31.                                 if(KeyNum==2)///按键2被按下,用于设置位置选择
  32.                                 {
  33.                                                 LocationSelect++;
  34.                                                 if(LocationSelect>6)LocationSelect=0;
  35.                                 };
  36.                                 
  37.                                 if(KeyNum==3)///判断按键3按下
  38.                                 {
  39.                                                 DS1302_DefaultTime[LocationSelect]++;///对应设置位的数字加1,以下是越界判断,让年月日等数值在正确范围
  40.                                                 if(DS1302_DefaultTime[0]>99 )DS1302_DefaultTime[0]=0;
  41.                                                 if(DS1302_DefaultTime[1]>12 )DS1302_DefaultTime[1]=1;
  42.                                        
  43.                                                 if(DS1302_DefaultTime[1]==1 || DS1302_DefaultTime[1]==3 || DS1302_DefaultTime[1]==5 ||
  44.                                                         DS1302_DefaultTime[1]==7 || DS1302_DefaultTime[1]==8 || DS1302_DefaultTime[1]==10 ||DS1302_DefaultTime[1]==12)
  45.                                                 {
  46.                                                                 if(DS1302_DefaultTime[2]>31)DS1302_DefaultTime[2]=1;
  47.                                                 }else if(DS1302_DefaultTime[1]==4 || DS1302_DefaultTime[1]==6 || DS1302_DefaultTime[1]==9 || DS1302_DefaultTime[1]==11)
  48.                                                 {
  49.                                                                 if(DS1302_DefaultTime[2]>30)DS1302_DefaultTime[2]=1;
  50.                                                 }else if(DS1302_DefaultTime[1]==2)
  51.                                                 {
  52.                                                                 if(DS1302_DefaultTime[0]%4==0)
  53.                                                                 {
  54.                                                                                 if(DS1302_DefaultTime[2]>29)DS1302_DefaultTime[2]=1;
  55.                                                                 }else
  56.                                                                 {
  57.                                                                                 if(DS1302_DefaultTime[2]>28)DS1302_DefaultTime[2]=1;
  58.                                                                 }
  59.                                                 }
  60.                                        
  61.                                                 if(DS1302_DefaultTime[3]>7 )DS1302_DefaultTime[3]=1;
  62.                                                 if(DS1302_DefaultTime[4]>23 )DS1302_DefaultTime[4]=0;
  63.                                                 if(DS1302_DefaultTime[5]>59 )DS1302_DefaultTime[5]=0;
  64.                                                 if(DS1302_DefaultTime[6]>59 )DS1302_DefaultTime[6]=0;
  65.                                                 
  66.                                 };
  67.                                 
  68.                                 
  69.                                 if(KeyNum==4)///对应设置位的数字减1,以下是越界判断
  70.                                 {
  71.                                                 DS1302_DefaultTime[LocationSelect]--;                                                
  72.                                                 if(DS1302_DefaultTime[0]<0 )DS1302_DefaultTime[0]=99;
  73.                                                 if(DS1302_DefaultTime[1]<1 )DS1302_DefaultTime[1]=12;
  74.                                                 
  75.                                                 if(DS1302_DefaultTime[1]==1 || DS1302_DefaultTime[1]==3 || DS1302_DefaultTime[1]==5 ||
  76.                                                         DS1302_DefaultTime[1]==7 || DS1302_DefaultTime[1]==8 || DS1302_DefaultTime[1]==10 ||DS1302_DefaultTime[1]==12)
  77.                                                 {
  78.                                                                 if(DS1302_DefaultTime[2]<1)DS1302_DefaultTime[2]=31;
  79.                                                 }else if(DS1302_DefaultTime[1]==4 || DS1302_DefaultTime[1]==6 || DS1302_DefaultTime[1]==9 || DS1302_DefaultTime[1]==11)
  80.                                                 {
  81.                                                                 if(DS1302_DefaultTime[2]<1)DS1302_DefaultTime[2]=30;
  82.                                                                 if(DS1302_DefaultTime[2]>30)DS1302_DefaultTime[2]=1;
  83.                                                 }else if(DS1302_DefaultTime[1]==2)
  84.                                                 {
  85.                                                                 if(DS1302_DefaultTime[0]%4==0)
  86.                                                                 {
  87.                                                                                 if(DS1302_DefaultTime[2]<1)DS1302_DefaultTime[2]=29;
  88.                                                                                 if(DS1302_DefaultTime[2]>29)DS1302_DefaultTime[2]=1;
  89.                                                                 }else
  90.                                                                 {
  91.                                                                                 if(DS1302_DefaultTime[2]<1)DS1302_DefaultTime[2]=28;
  92.                                                                                 if(DS1302_DefaultTime[2]>28)DS1302_DefaultTime[2]=1;
  93.                                                                 }
  94.                                                 }
  95.                                        
  96.                                                 if(DS1302_DefaultTime[3]<1 )DS1302_DefaultTime[3]=7;
  97.                                                 if(DS1302_DefaultTime[4]<00 )DS1302_DefaultTime[4]=23;
  98.                                                 if(DS1302_DefaultTime[5]<0 )DS1302_DefaultTime[5]=59;
  99.                                                 if(DS1302_DefaultTime[6]<0 )DS1302_DefaultTime[6]=59;
  100.                                 };
  101.                                 
  102.                 };
  103.                
  104.                 if(k==1 && LocationSelect==0){LCD_ShowString(1,1,"  ");}///设置年时,光标闪烁
  105.                 else {LCD_ShowNum(1,1,DS1302_DefaultTime[0],2);};
  106.                
  107.                 if(k==1 && LocationSelect==1){LCD_ShowString(1,4,"  ");}///设置月时,光标闪烁
  108.                 else {LCD_ShowNum(1,4,DS1302_DefaultTime[1],2);};
  109.                
  110.                 if(k==1 && LocationSelect==2){LCD_ShowString(1,7,"  ");}///设置日时,光标闪烁
  111.                 else {LCD_ShowNum(1,7,DS1302_DefaultTime[2],2);};
  112.                
  113.                 if(k==1 && LocationSelect==3){LCD_ShowString(1,10,"  ");}///设置星期时,光标闪烁
  114.                 else {LCD_ShowNum(1,10,DS1302_DefaultTime[3],1);};
  115.                
  116.                 if(k==1 && LocationSelect==4){LCD_ShowString(2,1,"  ");}///设置小时,光标闪烁
  117.                 else {LCD_ShowNum(2,1,DS1302_DefaultTime[4],2);};
  118.                
  119.                 if(k==1 && LocationSelect==5){LCD_ShowString(2,4,"  ");}///设置分钟,光标闪烁
  120.                 else {LCD_ShowNum(2,4,DS1302_DefaultTime[5],2);};
  121.                
  122.                 if(k==1 && LocationSelect==6){LCD_ShowString(2,7,"  ");}///设置秒,光标闪烁
  123.                 else{LCD_ShowNum(2,7,DS1302_DefaultTime[6],2);};

  124. }
  125.         
  126. void main()
  127. {
  128.         LCD_Init();
  129.         DS1302_Init();
  130.         Timer0Init();
  131.         DS1302_SetTime();
  132.         LCD_ShowString(1,1,"  -  -  - ");
  133.         LCD_ShowString(2,1,"  :  :  ");
  134.         
  135.         while(1)
  136.         {
  137.                         KeyNum=keyNumble();
  138.                         if(KeyNum==1)///按键1背按下,进入设置模式
  139.                                 {
  140.                                         if(Mode==0)
  141.                                         {
  142.                                                         Mode=1;
  143.                                                         LocationSelect=0;
  144.                                                         
  145.                                         }
  146.                                         else if(Mode==1)
  147.                                         {
  148.                                                         Mode=0;
  149.                                                         DS1302_SetTime();
  150.                                         };
  151.                                 };
  152.                                 
  153.                                 switch (Mode)///判断Mode的值,用于切换显示模式和设置模式
  154.         {
  155.                 case 0:ShowTime(); break;
  156.                 case 1:SetTime(); break;

  157.         }


  158.         }
  159. }

  160. /*
  161.         定时器中断,用于设置时,数字闪烁
  162. */
  163.         void Timer0_Rountine() interrupt 1
  164. {
  165.                         TL0 = 0x18;        
  166.                         TH0 = 0xFC;
  167.                         i++;
  168.                         if(i==450)
  169.                         {
  170.                                         i=0;
  171.                                         k=!k;
  172.                         }
  173. }
复制代码
以下是大佬写的1602库函数lcd1602.c和lcd1602.h

  1. #include <REGX52.H>

  2. //引脚配置:
  3. sbit LCD_RS=P2^6;
  4. sbit LCD_RW=P2^5;
  5. sbit LCD_EN=P2^7;
  6. #define LCD_DataPort P0

  7. //函数定义:
  8. /**
  9.   * @brief  LCD1602延时函数,12MHz调用可延时1ms
  10.   * @param  无
  11.   * @retval 无
  12.   */
  13. void LCD_Delay()
  14. {
  15.         unsigned char i, j;

  16.         i = 2;
  17.         j = 239;
  18.         do
  19.         {
  20.                 while (--j);
  21.         } while (--i);
  22. }

  23. /**
  24.   * @brief  LCD1602写命令
  25.   * @param  Command 要写入的命令
  26.   * @retval 无
  27.   */
  28. void LCD_WriteCommand(unsigned char Command)
  29. {
  30.         LCD_RS=0;
  31.         LCD_RW=0;
  32.         LCD_DataPort=Command;
  33.         LCD_EN=1;
  34.         LCD_Delay();
  35.         LCD_EN=0;
  36.         LCD_Delay();
  37. }

  38. /**
  39.   * @brief  LCD1602写数据
  40.   * @param  Data 要写入的数据
  41.   * @retval 无
  42.   */
  43. void LCD_WriteData(unsigned char Data)
  44. {
  45.         LCD_RS=1;
  46.         LCD_RW=0;
  47.         LCD_DataPort=Data;
  48.         LCD_EN=1;
  49.         LCD_Delay();
  50.         LCD_EN=0;
  51.         LCD_Delay();
  52. }

  53. /**
  54.   * @brief  LCD1602设置光标位置
  55.   * @param  Line 行位置,范围:1~2
  56.   * @param  Column 列位置,范围:1~16
  57.   * @retval 无
  58.   */
  59. void LCD_SetCursor(unsigned char Line,unsigned char Column)
  60. {
  61.         if(Line==1)
  62.         {
  63.                 LCD_WriteCommand(0x80|(Column-1));
  64.         }
  65.         else if(Line==2)
  66.         {
  67.                 LCD_WriteCommand(0x80|(Column-1+0x40));
  68.         }
  69. }

  70. /**
  71.   * @brief  LCD1602初始化函数
  72.   * @param  无
  73.   * @retval 无
  74.   */
  75. void LCD_Init()
  76. {
  77.         LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
  78.         LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
  79.         LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
  80.         LCD_WriteCommand(0x01);//光标复位,清屏
  81. }

  82. /**
  83.   * @brief  在LCD1602指定位置上显示一个字符
  84.   * @param  Line 行位置,范围:1~2
  85.   * @param  Column 列位置,范围:1~16
  86.   * @param  Char 要显示的字符
  87.   * @retval 无
  88.   */
  89. void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
  90. {
  91.         LCD_SetCursor(Line,Column);
  92.         LCD_WriteData(Char);
  93. }

  94. /**
  95.   * @brief  在LCD1602指定位置开始显示所给字符串
  96.   * @param  Line 起始行位置,范围:1~2
  97.   * @param  Column 起始列位置,范围:1~16
  98.   * @param  String 要显示的字符串
  99.   * @retval 无
  100.   */
  101. void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
  102. {
  103.         unsigned char i;
  104.         LCD_SetCursor(Line,Column);
  105.         for(i=0;String[i]!='\0';i++)
  106.         {
  107.                 LCD_WriteData(String[i]);
  108.         }
  109. }

  110. /**
  111.   * @brief  返回值=X的Y次方
  112.   */
  113. int LCD_Pow(int X,int Y)
  114. {
  115.         unsigned char i;
  116.         int Result=1;
  117.         for(i=0;i<Y;i++)
  118.         {
  119.                 Result*=X;
  120.         }
  121.         return Result;
  122. }

  123. /**
  124.   * @brief  在LCD1602指定位置开始显示所给数字
  125.   * @param  Line 起始行位置,范围:1~2
  126.   * @param  Column 起始列位置,范围:1~16
  127.   * @param  Number 要显示的数字,范围:0~65535
  128.   * @param  Length 要显示数字的长度,范围:1~5
  129.   * @retval 无
  130.   */
  131. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  132. {
  133.         unsigned char i;
  134.         LCD_SetCursor(Line,Column);
  135.         for(i=Length;i>0;i--)
  136.         {
  137.                 LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
  138.         }
  139. }

  140. /**
  141.   * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
  142.   * @param  Line 起始行位置,范围:1~2
  143.   * @param  Column 起始列位置,范围:1~16
  144.   * @param  Number 要显示的数字,范围:-32768~32767
  145.   * @param  Length 要显示数字的长度,范围:1~5
  146.   * @retval 无
  147.   */
  148. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
  149. {
  150.         unsigned char i;
  151.         unsigned int Number1;
  152.         LCD_SetCursor(Line,Column);
  153.         if(Number>=0)
  154.         {
  155.                 LCD_WriteData('+');
  156.                 Number1=Number;
  157.         }
  158.         else
  159.         {
  160.                 LCD_WriteData('-');
  161.                 Number1=-Number;
  162.         }
  163.         for(i=Length;i>0;i--)
  164.         {
  165.                 LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
  166.         }
  167. }

  168. /**
  169.   * @brief  在LCD1602指定位置开始以十六进制显示所给数字
  170.   * @param  Line 起始行位置,范围:1~2
  171.   * @param  Column 起始列位置,范围:1~16
  172.   * @param  Number 要显示的数字,范围:0~0xFFFF
  173.   * @param  Length 要显示数字的长度,范围:1~4
  174.   * @retval 无
  175.   */
  176. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  177. {
  178.         unsigned char i,SingleNumber;
  179.         LCD_SetCursor(Line,Column);
  180.         for(i=Length;i>0;i--)
  181.         {
  182.                 SingleNumber=Number/LCD_Pow(16,i-1)%16;
  183.                 if(SingleNumber<10)
  184.                 {
  185.                         LCD_WriteData(SingleNumber+'0');
  186.                 }
  187.                 else
  188.                 {
  189.                         LCD_WriteData(SingleNumber-10+'A');
  190.                 }
  191.         }
  192. }

  193. /**
  194.   * @brief  在LCD1602指定位置开始以二进制显示所给数字
  195.   * @param  Line 起始行位置,范围:1~2
  196.   * @param  Column 起始列位置,范围:1~16
  197.   * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  198.   * @param  Length 要显示数字的长度,范围:1~16
  199.   * @retval 无
  200.   */
  201. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  202. {
  203.         unsigned char i;
  204.         LCD_SetCursor(Line,Column);
  205.         for(i=Length;i>0;i--)
  206.         {
  207.                 LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
  208.         }
  209. }
复制代码
  1. #ifndef __LCD1602_H__
  2. #define __LCD1602_H__

  3. //用户调用函数:
  4. void LCD_Init();//LCD1602初始化函数
  5. void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
  6. void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
  7. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
  8. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
  9. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
  10. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

  11. #endif
复制代码

在接下来是ds1302.c以及ds1302.h

  1. #include <REGX52.H>

  2. /*
  3.                 1302写入地址重定义
  4. */
  5. #define  DS1302_second  0x80
  6. #define  DS1302_minute  0x82
  7. #define  DS1302_hour    0x84
  8. #define  DS1302_date    0x86
  9. #define  DS1302_month   0x88
  10. #define  DS1302_week    0x8A
  11. #define  DS1302_year    0x8C
  12. #define  DS1302_WP      0x8E


  13. sbit DS1302_CE=P3^5;
  14. sbit DS1302_IO=P3^4;
  15. sbit DS1302_SCLK=P3^6;

  16. char DS1302_DefaultTime[]={22,1,26,3,18,00,00};///默认年、月、日、星期、时、分、秒

  17. /*
  18.         1302写入
  19. */
  20. void DS1302_WriteByte(unsigned char command,Byte)
  21. {
  22.         unsigned char i;
  23.         DS1302_CE=1;

  24.         for(i=0;i<8;i++)
  25.                 {
  26.                         DS1302_IO=command&(0x01<<i);
  27.                         DS1302_SCLK=1;
  28.                         DS1302_SCLK=0;
  29.                 }
  30.         for(i=0;i<8;i++)
  31.                 {
  32.                         DS1302_IO=Byte&(0x01<<i);
  33.                         DS1302_SCLK=1;
  34.                         DS1302_SCLK=0;
  35.                 }
  36.                
  37.                 DS1302_CE=0;               
  38. }

  39. /*
  40.         1302读取
  41. */
  42. unsigned char DS1302_ReadByte(unsigned char command)
  43. {
  44.                 unsigned char i,temp=0x00;
  45.                 command |=0x01;///让cammand最后一位是1
  46.                 DS1302_CE=1;
  47.           DS1302_IO=0;  ///DS1302读字节之前一定还要将数据线清零,不然会导致后面的数据读取错误
  48.                 for(i=0;i<8;i++)
  49.                 {
  50.                         DS1302_IO=command&(0x01<<i);
  51.                         DS1302_SCLK=0;
  52.                         DS1302_SCLK=1;
  53.                 }

  54.                
  55.                 for(i=0;i<8;i++)
  56.                 {
  57.                                 DS1302_SCLK=1;
  58.                                 DS1302_SCLK=0;
  59.                                        
  60.                                 if(DS1302_IO)
  61.                                         {
  62.                                                         temp=temp|(0x01<<i);
  63.                                                         
  64.                                         }
  65.                                 
  66.                 }
  67.                
  68.                 DS1302_CE=0;
  69.                 return temp;
  70. }

  71. /*
  72.         1302初始化函数
  73. */
  74. void DS1302_Init()
  75. {
  76.         DS1302_CE=0;
  77.         DS1302_SCLK=0;
  78. }
  79. /*
  80.         时间设置函数
  81. */
  82. void DS1302_SetTime()
  83. {
  84.                 DS1302_WriteByte(DS1302_WP,0x00);
  85.                 DS1302_WriteByte(DS1302_year,DS1302_DefaultTime[0]/10*16+DS1302_DefaultTime[0]%10);
  86.                 DS1302_WriteByte(DS1302_month,DS1302_DefaultTime[1]/10*16+DS1302_DefaultTime[1]%10);
  87.                 DS1302_WriteByte(DS1302_date,DS1302_DefaultTime[2]/10*16+DS1302_DefaultTime[2]%10);
  88.                 DS1302_WriteByte(DS1302_week,DS1302_DefaultTime[3]/10*16+DS1302_DefaultTime[3]%10);
  89.                 DS1302_WriteByte(DS1302_hour,DS1302_DefaultTime[4]/10*16+DS1302_DefaultTime[4]%10);
  90.                 DS1302_WriteByte(DS1302_minute,DS1302_DefaultTime[5]/10*16+DS1302_DefaultTime[5]%10);
  91.                 DS1302_WriteByte(DS1302_second,DS1302_DefaultTime[6]/10*16+DS1302_DefaultTime[6]%10);
  92.                 DS1302_WriteByte(DS1302_WP,0x80);
  93. }
  94. /*
  95.         时间读取函数
  96. */
  97. void DS1302_ReadTime()
  98. {
  99.                 DS1302_DefaultTime[0]=DS1302_ReadByte(DS1302_year)/16*10+DS1302_ReadByte(DS1302_year)%16;
  100.                 DS1302_DefaultTime[1]=DS1302_ReadByte(DS1302_month)/16*10+DS1302_ReadByte(DS1302_month)%16;
  101.                 DS1302_DefaultTime[2]=DS1302_ReadByte(DS1302_date)/16*10+DS1302_ReadByte(DS1302_date)%16;
  102.                 DS1302_DefaultTime[3]=DS1302_ReadByte(DS1302_week)/16*10+DS1302_ReadByte(DS1302_week)%16;
  103.                 DS1302_DefaultTime[4]=DS1302_ReadByte(DS1302_hour)/16*10+DS1302_ReadByte(DS1302_hour)%16;
  104.                 DS1302_DefaultTime[5]=DS1302_ReadByte(DS1302_minute)/16*10+DS1302_ReadByte(DS1302_minute)%16;
  105.                 DS1302_DefaultTime[6]=DS1302_ReadByte(DS1302_second)/16*10+DS1302_ReadByte(DS1302_second)%16;
  106. }
复制代码

  1. #ifndef __DS1302_H__
  2. #define __DS1302_H__

  3. extern  char DS1302_DefaultTime[];///声明为外部数组,可以不加extern,但必须声明。声明外部变量必须加extern
  4. void DS1302_WriteByte(unsigned char command,Byte);
  5. unsigned char DS1302_ReadByte(unsigned char command);
  6. void DS1302_Init();
  7. void DS1302_SetTime();
  8. void DS1302_ReadTime();
  9. #endif
复制代码
独立按键key.c以及key.h

  1. #include <REGX52.H>
  2. #include "delay.h"
  3. unsigned char keyNumble()
  4. {
  5.         unsigned char KeyNum=0;        
  6.         if(P3_1==0)
  7.                 {
  8.                                 delay(100);
  9.                                 while(P3_1==0){}
  10.                                 delay(100);
  11.                                 KeyNum=1;
  12.                 }
  13.                 if(P3_0==0)
  14.                 {
  15.                                 delay(100);
  16.                                 while(P3_0==0){}
  17.                                 delay(100);
  18.                                 KeyNum=2;
  19.                 }
  20.                 if(P3_2==0)
  21.                 {
  22.                                 delay(100);
  23.                                 while(P3_2==0){}
  24.                                 delay(100);
  25.                                 KeyNum=3;
  26.                 }
  27.                 if(P3_3==0)                                        ///如果P3.3按键被按下
  28.                 {
  29.                                 delay(100);                        ///进入延时
  30.                                 while(P3_3==0){}///若按着不撒手,就一直停留在while中
  31.                                 delay(100);                        ///撒手后延时一段时间
  32.                                         KeyNum=4;                        ///键码值为4
  33.                 }
  34.         return KeyNum;                                ///返回键码值
  35. }

复制代码
  1. #ifndef __KEY_H__
  2. #define __KEY_H__

  3. unsigned char keyNumble();
  4. #endif
复制代码
还有定时器Timer0.c和Timer0.h

  1. #include <REGX52.H>


  2. void Timer0Init()                //1毫秒@12.000MHz
  3. {
  4.         TMOD &= 0xF0;                //设置定时器模式
  5.         TMOD |= 0x01;                //设置定时器模式
  6.         TL0 = 0x18;                //设置定时初始值
  7.         TH0 = 0xFC;                //设置定时初始值
  8.         TF0 = 0;                //清除TF0标志
  9.         TR0 = 1;                //定时器0开始计时
  10.         EA=1;                                //打开总中断
  11.         ET0=1;                        //打开定时器0中断
  12. }

  13. /*
  14.         void Timer0_Rountine() interrupt 1
  15. {
  16.                         TL0 = 0x18;        
  17.                         TH0 = 0xFC;
  18.                         i++;
  19.                         if(i==1000)
  20.                         {
  21.                                         i=0;
  22.                                         k++;
  23.                                         if(k==60)k=0;
  24.                         }
  25. }
  26. */

复制代码
  1. #ifndef __TIMER0_H__
  2. #define __TIMER0_H__

  3. void Timer0Init();
  4. #endif
复制代码

最后是延时函数delay.c和delay.h

  1. void Delay(unsigned int xms)
  2. {
  3.         unsigned char i, j;
  4.         while(xms--)
  5.         {
  6.                 i = 2;
  7.                 j = 239;
  8.                 do
  9.                 {
  10.                         while (--j);
  11.                 } while (--i);
  12.         }
  13. }
复制代码
  1. #ifndef __DELAY_H__
  2. #define __DELAY_H__

  3. void delay(unsigned int i);

  4. #endif
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:229502 发表于 2022-2-2 21:24 | 显示全部楼层
正在搞ds1302数码时钟。谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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