找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机万年历模板 带源代码和仿真及原理图

[复制链接]
ID:137190 发表于 2016-9-8 23:18 | 显示全部楼层 |阅读模式


0.png

单片机万年历的仿真原理图
  1. #define uchar unsigned char
  2. #define uint  unsigned int
  3. #define DQ P3_7
  4. #include<AT89X51.H>

  5. uint sec;
  6. uint min=41;
  7. uint hour=18;
  8. uint day=14;
  9. uint month=9;
  10. uint yearl=6;
  11. uint yearh=20;
  12. uint tcnt;
  13. uint cursor=0;
  14. uchar a=0xff;
  15. uchar code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  16. void delay(uint t)
  17. {
  18.     uint i;
  19.     while(t--)
  20.     {for (i=0;i<125;i++);}
  21. }
  22. void Tdelay(unsigned int i)
  23. {
  24. while(i--);
  25. }
  26. void Kdelay()
  27. {
  28.     uchar i,j;
  29.     for(i=100;i>0;i--)
  30.     for(j=248;j>0;j--);
  31. }
  32. Init_DS18B20(void)
  33. {
  34. unsigned char x=0;
  35. DQ = 1;   
  36. Tdelay(8);  
  37. DQ = 0;   
  38. Tdelay(80);
  39. DQ = 1;   
  40. Tdelay(14);
  41. Tdelay(20);
  42. }
  43. //读一个字节
  44. ReadOneChar(void)
  45. {
  46. unsigned char i=0;
  47. unsigned char dat = 0;
  48. for (i=8;i>0;i--)
  49. {
  50.   DQ = 0;
  51.   dat>>=1;
  52.   DQ = 1;
  53.   if(DQ)
  54.    dat|=0x80;
  55.   Tdelay(4);
  56. }
  57. return(dat);
  58. }

  59. //写一个字节
  60. WriteOneChar(unsigned char dat)
  61. {
  62. unsigned char i=0;
  63. for (i=8; i>0; i--)
  64. {
  65.   DQ = 0;
  66.   DQ = dat&0x01;
  67.   Tdelay(5);
  68.   DQ = 1;
  69.   dat>>=1;
  70. }
  71. }

  72. //读取温度
  73. ReadTemperature(void)
  74. {
  75. unsigned char a=0;
  76. unsigned char b=0;
  77. unsigned int t=0;
  78. float tt=0;
  79. Init_DS18B20();
  80. WriteOneChar(0xCC);
  81. WriteOneChar(0x44);
  82. Init_DS18B20();
  83. WriteOneChar(0xCC);
  84. WriteOneChar(0xBE);
  85. a=ReadOneChar();
  86. b=ReadOneChar();
  87. t=b;
  88. t<<=8;
  89. t=t|a;
  90. tt=t*0.0625;        
  91. t= tt*10+0.5;      
  92. return(t);
  93. }

  94. void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,uchar L7,
  95. uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14,uchar L15,
  96. uchar L16)
  97. {
  98.     P2=0x7F;P0=L1;delay(1);  //yearh
  99.     P2=0xBF;P0=L2;delay(1);  //yearh
  100.     if(cursor==6){P2=0xDF|a;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);}   //yearl
  101.     if(cursor==6){P2=0xEF|a;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);}   //yearl
  102.     if(cursor==5){P2=0xF7|a;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);}   //month
  103.     if(cursor==5){P2=0xFB|a;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);}   //month
  104.     if(cursor==4){P2=0xFD|a;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);}   //day
  105.     if(cursor==4){P2=0xFE|a;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);}   //day
  106.     P2=0xFF;
  107.     if(cursor==3){P1=0x7F|a;P0=L9;delay(1);}else{P1=0x7F;P0=L9;delay(1);}   //hour
  108.     if(cursor==3){P1=0xBF|a;P0=L10;delay(1);}else{P1=0xBF;P0=L10;delay(1);}  //hour
  109.     if(cursor==2){P1=0xDF|a;P0=L11;delay(1);}else{P1=0xDF;P0=L11;delay(1);} //min
  110.     if(cursor==2){P1=0xEF|a;P0=L12;delay(1);}else{P1=0xEF;P0=L12;delay(1);} //min
  111.     if(cursor==1){P1=0xF7|a;P0=L13;delay(1);}else{P1=0xF7;P0=L13;delay(1);} //sec
  112.     if(cursor==1){P1=0xFB|a;P0=L14;delay(1);}else{P1=0xFB;P0=L14;delay(1);} //sec
  113.     P1=0xFD;P0=L15;delay(1); //temp
  114.     P1=0xFE;P0=L16;delay(1); //temp
  115.     P1=0xFF;
  116. }

  117. main()
  118. {   
  119.     uint i;   
  120.     TMOD=0x02;            //设置模式为定时器T0的模式2 (8位自动重装计数初值的计数值)        
  121.     TH0=0x06;             //设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
  122.     TL0=0x06;
  123.     TR0=1;                //启动T0
  124.     ET0=1;                //开启定时器T0中断允许
  125.     EA=1;                 //开启中断总控制
  126.     while(1)
  127.     {
  128.         if(P3_0==0)
  129.         {
  130.             Kdelay();
  131.             if(P3_0==0)
  132.             {
  133.                 cursor++;
  134.                 if(cursor>=7){cursor=0;}
  135.             }
  136.         }
  137.         if(P3_1==0)
  138.         {
  139.             Kdelay();
  140.             if(P3_1==0)
  141.             {
  142.                 if(cursor==1){sec++;if(sec==60)sec=0;}
  143.                 if(cursor==2){min++;if(min==60)min=0;}
  144.                 if(cursor==3){hour++;if(hour==24)hour=0;}
  145.                 if(cursor==4){day++;if(day==31)day=0;}
  146.                 if(cursor==5){month++;if(month==12)month=0;}
  147.                 if(cursor==6){yearl++;if(yearl==100)yearl=0;}
  148.                 if(cursor==7){yearh++;if(yearh==30)yearh=20;}
  149.             }
  150.         }
  151.         if(P3_2==0)
  152.         {
  153.             Kdelay();
  154.             if(P3_2==0)
  155.             {
  156.                 if(cursor==1){sec--;}
  157.                 if(cursor==2){min--;}
  158.                 if(cursor==3){hour--;}
  159.                 if(cursor==4){day--;}
  160.                 if(cursor==5){month--;}
  161.                 if(cursor==6){yearl--;}
  162.                 if(cursor==7){yearh--;}
  163.             }
  164.         }
  165.         i=ReadTemperature();
  166.         display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],
  167. Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],Seg[hour/10],
  168. Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10],Seg[i/100],
  169. Seg[i/10%10]);     
  170.     }
  171. }

  172. void t0(void)interrupt 1 using 0   //t0的中断程序
  173. {
  174.     tcnt++;
  175.     if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
  176.     {
  177.         tcnt=0;
  178.         P3_3=~P3_3;
  179.         a=~a;
  180.         sec++;
  181.         if(sec==60)
  182.         {     
  183.             sec=0;
  184.             min++;
  185.             if(min==60)
  186.             {
  187.                 min=0;
  188.                 hour++;
  189.                 if(hour==24)
  190.                 {
  191.                     hour=0;
  192.                     day++;
  193.                     if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&
  194. day==30)day=1;  
  195.                     else if(month==2&&day==29)day=1;
  196.                     else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
  197.                     else if(day==32)day=1;
  198.                     if(day==1)
  199.                     {
  200.                     month++;
  201.                     if(month==13)
  202.                     {
  203.                         month=1;
  204.                         yearl++;
  205.                         if(yearl==100)
  206.                         {
  207.                             yearl=0;
  208.                             yearh++;
  209.                             if(yearh==100)
  210.                             {
  211.                                 yearh=20;
  212.                             }
  213.                         }
  214.                     }
  215.                 }
  216.                 }
  217.             }
  218.         }
  219.     }
  220. }
复制代码

0.png


单片机万年历模板.zip

59.57 KB, 下载次数: 20, 下载积分: 黑币 -5

回复

使用道具 举报

ID:194844 发表于 2017-5-1 14:14 | 显示全部楼层
thanks!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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