找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9677|回复: 9
打印 上一主题 下一主题
收起左侧

基于51单片机的万年历设计仿真源代码及电路图

  [复制链接]
跳转到指定楼层
楼主
压缩文件中包含程序及protues仿真

单片机源程序如下:
  1. #include <REG52.H>
  2. #include <intrins.H>
  3. #include <math.h>

  4. /* 液晶引脚定义 */
  5. #define LCD_DB P0
  6. sbit LCD_RS=P2^0;  
  7. sbit LCD_RW=P2^1;  
  8. sbit LCD_E=P2^2;  
  9. /* 温度传感器引脚定义 */
  10. sbit DSA=P1^3;           
  11. /* 时钟芯片引脚定义 */
  12. sbit IO=P1^0;
  13. sbit SCLK=P1^1;
  14. sbit RST=P1^2;
  15. /* 独立按键引脚定义 */
  16. sbit KeyOne = P3^2;
  17. sbit KeyThree = P3^3;
  18. sbit KeyTwo = P3^4;
  19. sbit KeyFour  = P3^5;
  20. /* 第0位 第八位 位操作 */
  21. sbit ACC0=ACC^0;
  22. sbit ACC7=ACC^7;
  23. /* 报警指示引脚定义 */
  24. sbit Red = P3^6;
  25. sbit Green = P3^7;
  26. sbit Beep = P1^4;
  27. /* 时钟芯片寄存器定义 */
  28. #define write_second 0x80
  29. #define write_minute 0x82
  30. #define write_hour   0x84
  31. #define write_day    0x86
  32. #define write_month  0x88
  33. #define write_week   0x8a
  34. #define write_year   0x8c
  35. /* 按键状态 */
  36. enum KEYSTART
  37. {
  38.         KEYDOWN,
  39.         KEYUP,
  40. };
  41. /* 按键键值 */
  42. enum KEYCONFIG
  43. {
  44.         KEYINIT,
  45.         KEYYEAR,
  46.         KEYMONTH,
  47.         KEYDAY,
  48.         KEYWEEK,
  49.         KEYHOUR,
  50.         KEYMINTH,
  51.         KEYALARH,
  52.         KEYALARM,
  53. };
  54. /* 逻辑变量定义 */
  55. unsigned char miao=0,shi=0,fen=0,ri=0,yue=0,nian=0,week=0;
  56. extern unsigned char miao,shi,fen,ri,yue,nian,week;
  57. unsigned int TempVal=0,AlarmFlag=0;
  58. unsigned char YearData=0,MonthData=0,DayData=0,WeekData=0,HourData=0,
  59.         MinuteData=0,AlarmH=0,AlarmM=0;
  60. /* n*10微妙延时  */
  61. void delay_n10us(unsigned int n)  
  62. {      
  63.         unsigned int i=0;           
  64.         for(i=n;i>0;i--)   
  65.         {
  66.                 _nop_();
  67.                 _nop_();
  68.                 _nop_();
  69.                 _nop_();
  70.                 _nop_();
  71.                 _nop_();
  72.         }
  73. }
  74. /* 写命令函数 */
  75. void LCD_write_command(unsigned char dat)
  76. {
  77.         delay_n10us(10);
  78.         LCD_RS=0;         
  79.         LCD_RW=0;         
  80.         LCD_E=1;         
  81.         LCD_DB=dat;
  82.         delay_n10us(10);  
  83.         LCD_E=0;
  84.         delay_n10us(10);  
  85. }
  86. /* 写数据函数 */
  87. void LCD_write_data(unsigned char dat)
  88. {
  89.         delay_n10us(10);
  90.         LCD_RS=1;         
  91.         LCD_RW=0;        
  92.         LCD_E=1;         
  93.         LCD_DB=dat;
  94.         delay_n10us(10);
  95.         LCD_E=0;
  96.         delay_n10us(10);
  97. }
  98. /* 写字符函数 X:0~15 Y:1,2 */
  99. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)
  100. {
  101.         unsigned char address=0;
  102.         if(y==1)
  103.                 address=0x80+x;//第一行第一个字符地址
  104.         else
  105.                 address=0xc0+x;        //第二行第一个字符地址
  106.         LCD_write_command(address);
  107.         LCD_write_data(dat);
  108. }
  109. /* 写一串字符 X:0~15 Y:1,2 */
  110. void LCD_disp_str(unsigned char x,unsigned char y,unsigned char *str)
  111. {
  112.         unsigned char address=0;
  113.         if(y==1)
  114.                 address=0x80+x;
  115.         else
  116.                 address=0xc0+x;
  117.         LCD_write_command(address);
  118.         while(*str!='\0')
  119.         {
  120.                 LCD_write_data(*str);   
  121.                 str++;
  122.         }
  123. }
  124. /* 液晶初始化 */
  125. void LCD_init(void)       
  126. {
  127.         delay_n10us(10);
  128.         LCD_write_command(0x38);//显示模式设置
  129.         delay_n10us(10);
  130.         LCD_write_command(0x0c);//开显示
  131.         delay_n10us(10);
  132.         LCD_write_command(0x06); //光标移动指令
  133.         delay_n10us(10);
  134.         LCD_write_command(0x01);//显示清屏
  135.         delay_n10us(100);      
  136. }
  137. /* 温度传感器最小单位延时 */
  138. void delayA(unsigned int Delay)
  139. {
  140.         unsigned int i=0,j=0;
  141.         for(i=Delay;i>0;i--)
  142.                 for(j=120;j>0;j--);
  143. }
  144. /* 温度传感器复位操作,初始化DS18B20
  145. 让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
  146. 使用unsigned int型, 一个i++指令的时间, 作为与DS18B20通信的小时间间隔  */
  147. void dsresetA(void)      
  148. {
  149.   unsigned int i=0;
  150.   DSA=0;
  151.   i=103;
  152.   while(i>0)
  153.         i--;
  154.   DSA=1;
  155.   i=4;
  156.   while(i>0)
  157.         i--;
  158. }
  159. /* 读温度传感器一位数据信息,向DS18B20读取一位数据
  160. 读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,  
  161. 之后DS18B20则会输出持续一段时间的一位数据  */
  162. bit tmpreadbitA(void)      
  163. {
  164.    unsigned int i=0;
  165.    bit dat=0;
  166.    DSA=0;
  167.    i++;         
  168.    DSA=1;
  169.    i++;
  170.    i++;
  171.    dat=DSA;
  172.    i=8;
  173.    while(i>0)
  174.         i--;
  175.    return (dat);
  176. }
  177. /* 读温度传感器八位数据信息 */
  178. unsigned char tmpreadA(void)  
  179. {
  180.   unsigned char i=0,j=0,dat=0;
  181.   for(i=1;i<=8;i++)
  182.   {
  183.     j=tmpreadbitA();//先读最低位
  184.     dat=(j<<7)|(dat>>1);//得八位数据信息   
  185.   }
  186.   return(dat);
  187. }
  188. /* 写温度传感器八位数据信息 */
  189. void tmpwritebyteA(unsigned char dat)   
  190. {
  191.   unsigned int i=0;
  192.   unsigned char j=0;
  193.   bit testb=0;
  194.   for(j=1;j<=8;j++)
  195.   {
  196.     testb=dat&0x01;
  197.     dat=dat>>1;
  198.     if(testb)     //write 1         让低电平持续2个小延时, 高电平持续8个小延时  
  199.     {  
  200.    
  201.       DSA=0;
  202.       i++;
  203.           i++;
  204.       DSA=1;
  205.       i=8;
  206.           while(i>0)
  207.                 i--;
  208.     }
  209.     else
  210.     {
  211.       DSA=0;       //write 0  让低电平持续8个小延时, 高电平持续2个小延时
  212.       i=8;
  213.           while(i>0)
  214.                 i--;
  215.       DSA=1;
  216.       i++;
  217.           i++;
  218.     }
  219.   }
  220. }

  221. /* 温度转换 */
  222. void tmpchangeA(void)  
  223. {
  224.   dsresetA();
  225.   delayA(1);
  226.   tmpwritebyteA(0xcc); //跳过ROM
  227.   tmpwritebyteA(0x44);  //转换
  228. }
  229. /* 读取温度寄存器转换数据 */
  230. unsigned int gettmpA(void)               
  231. {
  232.   float tt=0;
  233.   unsigned char a=0,b=0;
  234.         unsigned int tempA=0;
  235.   dsresetA();
  236.   delayA(1);
  237.   tmpwritebyteA(0xcc);
  238.   tmpwritebyteA(0xbe);//读取数据命令
  239.   a=tmpreadA();//读低8位
  240.   b=tmpreadA();//读高8位
  241.   tempA=b;
  242.   tempA<<=8;            
  243.   tempA=tempA|a; //合并高八位和低八位
  244.   tt=tempA*0.0625;//精确度为0.0625度
  245.   tempA=tt*10+0.5; //乘以10,表示小数点后只取一位, 0.5是进行4舍5入  
  246.   return tempA;
  247. }
  248. /* 写时钟芯片八位数据信息 */
  249. void write_byte(unsigned char dat)
  250. {
  251.         unsigned char a=0;
  252.         ACC=dat;
  253.         RST=1; // RST:输入信号,在读、写数据期间,必须为高。
  254.         for(a=8;a>0;a--)
  255.         {
  256.                 IO=ACC0;
  257.                 SCLK=0;
  258.                 SCLK=1;//上升沿写入,下降沿读出
  259.                 ACC=ACC>>1;
  260.         }
  261. }
  262. /* 读时钟芯片八位数据信息 */
  263. unsigned char read_byte()
  264. {
  265.         unsigned char a=0;
  266.         RST=1;
  267.         for(a=8;a>0;a--)
  268.         {
  269.                 ACC7=IO;
  270.                 SCLK=1;
  271.                 SCLK=0;
  272.                 ACC=ACC>>1;

  273.         }
  274.         return (ACC);
  275. }
  276. /* 在时钟芯片指定位置写指定数据 */
  277. void write_1302(unsigned char add,unsigned char dat)
  278. {

  279.         RST=0;//初始RST线置为0
  280.         SCLK=0;//初始时钟线置为0
  281.         RST=1;//初始RST置为1,传输开始
  282.         write_byte(add);
  283.         write_byte(dat);
  284.         SCLK=1;//时钟线拉高
  285.         RST=0; //读取结束,RST置为0,结束数据的传输
  286. }
  287. /* 读取时钟芯片指定地址的数据信息 */
  288. unsigned char read_1302(unsigned char add)
  289. {
  290.         unsigned char temp;
  291.         RST=0;
  292.         SCLK=0;
  293.         RST=1;
  294.         write_byte(add);
  295.         temp=read_byte();
  296.         SCLK=1;
  297.         RST=0;
  298.         return(temp);
  299. }
  300. /* 时钟芯片数据转换 */
  301. unsigned char BCD_Decimal(unsigned char bcd)
  302. {
  303. unsigned char Decimal;
  304. Decimal=bcd>>4; //先取bcd码的高位,因为整个BCD码表示数不会超过99,所以定义成uchar
  305. return(Decimal=Decimal*10+(bcd&=0x0F));//高位乘10加上原来数的低位,这就转成10进制数
  306. }
  307. /* 时钟芯片初始化操作  控制寄存器(8Fh、8Eh)的位7是写保护位(WP)
  308. 其它7位均置为0。在任何的对时钟和RAM的写操作之前
  309. WP位必须为0。当WP位为1时,写保护位
  310. 防止对任一寄存器的写操作 */
  311. void ds1302_init()
  312. {
  313.         RST=0;
  314.         SCLK=0;

  315.         write_1302(0x8e,0x00);//写保护关 将控制寄存器值设为0,wp=0允许写  
  316.         write_1302(0x8e,0x80);//写保护开,防止影响时间值  
  317. }
  318. /* 设置时钟芯片参数信息 */
  319. void Set_RTC(unsigned char address,unsigned char temp)          
  320. {
  321.         unsigned char tmp=0;
  322.     tmp=temp/10;
  323.         temp=temp%10;
  324.         temp=temp+tmp*16;
  325.         write_1302(0x8E,0X00);
  326.         write_1302(address,temp&0x7f);
  327.         write_1302(0x8E,0x80);
  328. }
  329. /* 提取时钟芯片时间信息 */
  330. void GetTime(void)
  331. {
  332.         miao = BCD_Decimal(read_1302(0x81));
  333.         fen = BCD_Decimal(read_1302(0x83));
  334.         shi  = BCD_Decimal(read_1302(0x85));
  335.         ri  = BCD_Decimal(read_1302(0x87));
  336.         yue = BCD_Decimal(read_1302(0x89));
  337.         nian=BCD_Decimal(read_1302(0x8d));
  338.         week=BCD_Decimal(read_1302(0x8b));
  339. }
  340. /* 按键小抖动操作 */
  341. void DelayKey(void)
  342. {
  343.         unsigned char i=0,j=0,k=0;
  344.         for(i=15;i>0;i--)
  345.                         for(k=81;k>0;k--);
  346. }
  347. /* 读取按键键值 */
  348. unsigned char KeyProcess(void)
  349. {
  350.         static unsigned char KeyVal=KEYINIT;
  351.         if(KeyOne==KEYDOWN)
  352.         {
  353.                 DelayKey();
  354.                 if(KeyOne==KEYDOWN)
  355.                 {
  356.                         while(KeyOne==KEYDOWN);
  357.                         LCD_disp_str(0,1,"                ");
  358.                         LCD_disp_str(0,2,"                ");
  359.                         KeyVal++;
  360.                         if(KeyVal>KEYALARM)
  361.                                 KeyVal=KEYINIT;
  362.                 }
  363.         }
  364.         return KeyVal;
  365. }
  366. /* 定时器配置 */
  367. void init() //定时器、计数器设置函数
  368. {
  369.         TMOD=0x11; //指定定时/计数器的工作方式为3
  370.         TH0=0x3c;  //定时器T0的高四位=0
  371.         TL0=0xb0;  //定时器T0的低四位=0
  372.         EA=1;  //系统允许有开放的中断
  373.         ET0=1; //允许T0中断
  374.         TR0=1; //开启中断,启动定时器
  375. }
  376. /* 外围硬件初始化 */
  377. void HandInit(void)
  378. {
  379.         LCD_init();
  380.         ds1302_init();
  381.         init();
  382.         Red = 1;
  383.         Green = 0;       
  384. }
  385. /* 年月日信息显示 */
  386. void show_Data(void)
  387. {
  388.         unsigned char dis_Data[16]={0};
  389.         dis_Data[0]='2';
  390.         dis_Data[1]='0';
  391.         dis_Data[2]=(nian/10)+0x30;               
  392.         dis_Data[3]=(nian%10)+0x30;
  393.         dis_Data[4]='-';                                            
  394.         dis_Data[5]=(yue/10)+0x30;               
  395.         dis_Data[6]=(yue%10)+0x30;
  396.         dis_Data[7]='-';
  397.         dis_Data[8]=(ri/10)+0x30;               
  398.         dis_Data[9]=(ri%10)+0x30;
  399.         dis_Data[10]=' ';
  400.         dis_Data[11]='W';
  401.         dis_Data[12]=126;
  402.         dis_Data[13]='<';
  403.         dis_Data[14]=(week%10)+0x30;
  404.         dis_Data[15]='>';
  405.         LCD_disp_str(0,1,dis_Data);
  406. }
  407. /* 时分秒温度信息显示 */
  408. void Show_Time(void)
  409. {
  410.         unsigned char dis_Time[16]={0};
  411.         dis_Time[0]=' ';
  412.         dis_Time[1]=(shi/10)+0x30;               
  413.         dis_Time[2]=(shi%10)+0x30;
  414.         dis_Time[3]=':';                                            
  415.         dis_Time[4]=(fen/10)+0x30;
  416.         dis_Time[5]=(fen%10)+0x30;
  417.         dis_Time[6]=':';
  418.         dis_Time[7]=(miao/10)+0x30;
  419.         dis_Time[8]=(miao%10)+0x30;
  420.         dis_Time[9]=' ';
  421.         dis_Time[10]=TempVal/100+'0';
  422.         dis_Time[11]=TempVal%100/10+'0';
  423.         dis_Time[12]='.';
  424.         dis_Time[13]=TempVal%10+'0';
  425.         dis_Time[14]=223;
  426.         dis_Time[15]='C';
  427.         LCD_disp_str(0,2,dis_Time);
  428. }
  429. /* 设置年参数 */
  430. void Set_Year(void)
  431. {
  432.         YearData=read_1302(0x8D);
  433.         YearData=(YearData>>4)*10+(YearData&0x0f);
  434.         if(KeyTwo==KEYDOWN)
  435.         {
  436.                 DelayKey();
  437.                 if(KeyTwo==KEYDOWN)
  438.                 {
  439.                         while(KeyTwo==KEYDOWN);
  440.                         if(YearData<=0)       
  441.                                 YearData=1;
  442.                         YearData-=1;
  443.                         Set_RTC(write_year,YearData);
  444.                 }
  445.         }
  446.         if(KeyThree==KEYDOWN)
  447.         {
  448.                 DelayKey();
  449.                 if(KeyThree==KEYDOWN)
  450.                 {
  451.                         while(KeyThree==KEYDOWN);
  452.                         if(YearData>=99)       
  453.                                 YearData=98;
  454.                         YearData+=1;
  455.                         Set_RTC(write_year,YearData);
  456.                 }
  457.         }
  458.         LCD_disp_str(0,1,"   SET YEAR     ");
  459.         LCD_disp_char(4,2,'2');
  460.         LCD_disp_char(5,2,'0');
  461.         LCD_disp_char(6,2,YearData/10+0x30);
  462.         LCD_disp_char(7,2,YearData%10+0x30);
  463. }
  464. /* 设置月参数 */
  465. void SetMonth(void)
  466. {
  467.         MonthData=read_1302(0x89);
  468.         MonthData=(MonthData>>4)*10+(MonthData&0x0f);
  469.         if(KeyTwo==KEYDOWN)
  470.         {
  471.                 DelayKey();
  472.                 if(KeyTwo==KEYDOWN)
  473.                 {
  474.                         while(KeyTwo==KEYDOWN);
  475.                         if(MonthData<=1)       
  476.                                 MonthData=2;
  477.                         MonthData-=1;
  478.                         Set_RTC(write_month,MonthData);
  479.                 }
  480.         }
  481.         if(KeyThree==KEYDOWN)
  482.         {
  483.                 DelayKey();
  484.                 if(KeyThree==KEYDOWN)
  485.                 {
  486.                         while(KeyThree==KEYDOWN);
  487.                         if(MonthData>=12)       
  488.                                 MonthData=11;
  489.                         MonthData+=1;
  490.                         Set_RTC(write_month,MonthData);
  491.                 }
  492.         }
  493.         LCD_disp_str(0,1,"   SET MONTH    ");
  494.         LCD_disp_char(6,2,MonthData/10+0x30);
  495.         LCD_disp_char(7,2,MonthData%10+0x30);
  496. }
  497. /* 设置日参数 */
  498. void SetDay(void)
  499. {
  500.         DayData=read_1302(0x87);
  501.         DayData=(DayData>>4)*10+(DayData&0x0f);
  502.         if(KeyTwo==KEYDOWN)
  503.         {
  504.                 DelayKey();
  505.                 if(KeyTwo==KEYDOWN)
  506.                 {
  507.                         while(KeyTwo==KEYDOWN);
  508.                         if(DayData<=1)       
  509.                                 DayData=2;
  510.                         DayData-=1;
  511.                         Set_RTC(write_day,DayData);
  512.                 }
  513.         }
  514.         if(KeyThree==KEYDOWN)
  515.         {
  516.                 DelayKey();
  517.                 if(KeyThree==KEYDOWN)
  518.                 {
  519.                         while(KeyThree==KEYDOWN);
  520.                         if(DayData>=30)       
  521.                                 DayData=29;
  522.                         DayData+=1;
  523.                         Set_RTC(write_day,DayData);
  524.                 }
  525.         }
  526.         LCD_disp_str(0,1,"   SET DAY      ");
  527.         LCD_disp_char(6,2,DayData/10+0x30);
  528.         LCD_disp_char(7,2,DayData%10+0x30);
  529. }
  530. /* 设置周期参数 */
  531. void SetWeek(void)
  532. {
  533.         WeekData=read_1302(0x8b);
  534.         WeekData=(WeekData>>4)*10+(WeekData&0x0f);
  535.         if(KeyTwo==KEYDOWN)
  536.         {
  537.                 DelayKey();
  538.                 if(KeyTwo==KEYDOWN)
  539.                 {
  540.                         while(KeyTwo==KEYDOWN);
  541.                         if(WeekData<=1)       
  542.                                 WeekData=2;
  543.                         WeekData-=1;
  544.                         Set_RTC(write_week,WeekData);
  545.                 }
  546.         }
  547.         if(KeyThree==KEYDOWN)
  548.         {
  549.                 DelayKey();
  550.                 if(KeyThree==KEYDOWN)
  551.                 {
  552.                         while(KeyThree==KEYDOWN);
  553.                         if(WeekData>=7)       
  554.                                 WeekData=6;
  555.                         WeekData+=1;
  556.                         Set_RTC(write_week,WeekData);
  557.                 }
  558.         }
  559.         LCD_disp_str(0,1,"   SET WEEK     ");
  560.         LCD_disp_char(6,2,WeekData/10+0x30);
  561.         LCD_disp_char(7,2,WeekData%10+0x30);
  562. }
  563. /* 设置小时参数 */
  564. void SetHour(void)
  565. {
  566.         HourData=read_1302(0x85);
  567.         HourData=(HourData>>4)*10+(HourData&0x0f);
  568.         if(KeyTwo==KEYDOWN)
  569.         {
  570.                 DelayKey();
  571.                 if(KeyTwo==KEYDOWN)
  572.                 {
  573.                         while(KeyTwo==KEYDOWN);
  574.                         if(HourData<=0)       
  575.                                 HourData=1;
  576.                         HourData-=1;
  577.                         Set_RTC(write_hour,HourData);
  578.                 }
  579.         }
  580.         if(KeyThree==KEYDOWN)
  581.         {
  582.                 DelayKey();
  583.                 if(KeyThree==KEYDOWN)
  584.                 {
  585.                         while(KeyThree==KEYDOWN);
  586.                         if(HourData>=23)       
  587.                                 HourData=22;
  588.                         HourData+=1;
  589.                         Set_RTC(write_hour,HourData);
  590.                 }
  591.         }
  592.         LCD_disp_str(0,1,"   SET HOUR     ");
  593.         LCD_disp_char(6,2,HourData/10+0x30);
  594.         LCD_disp_char(7,2,HourData%10+0x30);
  595. }
  596. /* 设置分钟参数 */
  597. void SetMinute(void)
  598. {
  599.         MinuteData=read_1302(0x83);
  600.         MinuteData=(MinuteData>>4)*10+(MinuteData&0x0f);
  601.         if(KeyTwo==KEYDOWN)
  602.         {
  603.                 DelayKey();
  604.                 if(KeyTwo==KEYDOWN)
  605.                 {
  606.                         while(KeyTwo==KEYDOWN);
  607.                         if(MinuteData<=0)       
  608.                                 MinuteData=1;
  609.                         MinuteData-=1;
  610.                         Set_RTC(write_minute,MinuteData);
  611.                 }
  612.         }
  613.         if(KeyThree==KEYDOWN)
  614.         {
  615.                 DelayKey();
  616.                 if(KeyThree==KEYDOWN)
  617.                 {
  618.                         while(KeyThree==KEYDOWN);
  619.                         if(MinuteData>=59)       
  620.                                 MinuteData=58;
  621.                         MinuteData+=1;
  622.                         Set_RTC(write_minute,MinuteData);
  623.                 }
  624.         }
  625.         LCD_disp_str(0,1,"   SET MINUTE   ");
  626.         LCD_disp_char(6,2,MinuteData/10+0x30);
  627.         LCD_disp_char(7,2,MinuteData%10+0x30);
  628. }
  629. /* 设置闹钟小时参数 */
  630. void SetAlarH(void)
  631. {
  632.         if(KeyTwo==KEYDOWN)
  633.         {
  634.                 DelayKey();
  635.                 if(KeyTwo==KEYDOWN)
  636.                 {
  637.                         while(KeyTwo==KEYDOWN);
  638.                         if(AlarmH<=0)       
  639.                                 AlarmH=1;
  640.                         AlarmH-=1;
  641.                 }
  642.         }
  643.         if(KeyThree==KEYDOWN)
  644.         {
  645.                 DelayKey();
  646.                 if(KeyThree==KEYDOWN)
  647.                 {
  648.                         while(KeyThree==KEYDOWN);
  649.                         if(AlarmH>=23)       
  650.                                 AlarmH=22;
  651.                         AlarmH+=1;
  652.                 }
  653.         }
  654.         LCD_disp_str(0,1,"   SET ALARMH   ");
  655.         LCD_disp_char(6,2,AlarmH/10+0x30);
  656.         LCD_disp_char(7,2,AlarmH%10+0x30);
  657. }
  658. /* 设置闹钟分钟参数 */
  659. void SetAlarM(void)
  660. {
  661.         if(KeyTwo==KEYDOWN)
  662.         {
  663.                 DelayKey();
  664.                 if(KeyTwo==KEYDOWN)
  665.                 {
  666.                         while(KeyTwo==KEYDOWN);
  667.                         if(AlarmM<=0)       
  668.                                 AlarmM=1;
  669.                         AlarmM-=1;
  670.                 }
  671.         }
  672.         if(KeyThree==KEYDOWN)
  673.         {
  674.                 DelayKey();
  675.                 if(KeyThree==KEYDOWN)
  676.                 {
  677.                         while(KeyThree==KEYDOWN);
  678.                         if(AlarmM>=59)       
  679.                                 AlarmM=58;
  680.                         AlarmM+=1;
  681.                 }
  682.         }
  683.         LCD_disp_str(0,1,"   SET ALARMM   ");
  684.         LCD_disp_char(6,2,AlarmM/10+0x30);
  685.         LCD_disp_char(7,2,AlarmM%10+0x30);
  686. }
  687. /* 逻辑信息处理 */
  688. void Process(void)
  689. {
  690.         unsigned char StartChange=KEYINIT;
  691.         StartChange=KeyProcess();
  692.         if(KeyFour==KEYDOWN)
  693.         {
  694.                 DelayKey();
  695.                 if(KeyFour==KEYDOWN)
  696. ……………………

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

所有资料51hei提供下载:
程序.rar (87.86 KB, 下载次数: 209)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:410107 发表于 2018-10-16 15:23 | 只看该作者
程序很棒,对我学习c51单片机很有帮助
回复

使用道具 举报

板凳
ID:416198 发表于 2018-10-27 11:01 | 只看该作者
allen旭 发表于 2018-10-16 15:23
程序很棒,对我学习c51单片机很有帮助

能发一份我不
回复

使用道具 举报

地板
ID:447638 发表于 2018-12-27 10:14 来自手机 | 只看该作者
就是这个程序,仿真成功,实物时间不走会是什么原因呢
回复

使用道具 举报

5#
ID:564281 发表于 2019-6-18 08:30 来自手机 | 只看该作者
楼主程序在哪里
回复

使用道具 举报

6#
ID:564281 发表于 2019-6-19 11:02 来自手机 | 只看该作者
闹钟怎么设置楼主
回复

使用道具 举报

7#
ID:575637 发表于 2019-7-1 14:30 | 只看该作者
程序很好用,简单易懂
回复

使用道具 举报

8#
ID:607995 发表于 2019-9-6 13:43 | 只看该作者
有没有源码呀
回复

使用道具 举报

9#
ID:607995 发表于 2019-9-8 09:37 | 只看该作者
楼主啊,为啥仿真会显示cpu过载啊
回复

使用道具 举报

10#
ID:738485 发表于 2020-6-10 17:12 | 只看该作者
ability 发表于 2018-12-27 10:14
就是这个程序,仿真成功,实物时间不走会是什么原因呢

文件里的hex文件好像不是这个程序生成的,我的重新生成就不能用了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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