找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2880|回复: 3
收起左侧

DS1302可调时钟源代码

[复制链接]
ID:85764 发表于 2015-7-15 23:15 | 显示全部楼层 |阅读模式
数码管显示部分的原理图:http://www.51hei.com/f/51hei-5.pdf

源代码:

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit wela=P2^7;
  5. sbit dula=P2^6;
  6. sbit scl=P2^0;
  7. sbit sda=P2^1;
  8. sbit rst=P2^4;
  9. uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  10. uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  11. uchar dis_smg[6];
  12. uchar flag,keyscan,flag_s,key_set;
  13. uchar miao,fen,shi;
  14. bit flag_500ms;
  15. uchar read_ds1302(uchar add);
  16. void write_ds1302(uchar add,uchar dat);
  17. void write_SFM();
  18. void delay_1ms(uchar t)
  19. {
  20. uchar i,j;
  21. for(i=0;i<t;i++)
  22.   for(j=0;j<120;j++);
  23. }
  24. uchar bcdtoasc(uchar cha)
  25. {
  26.   cha=((cha/16)*10+(cha%16));
  27.   return cha;
  28. }
  29. uchar asctobcd(uchar cha)
  30. {
  31. cha=((cha/10)*16+(cha%10));
  32. return cha;
  33. }
  34. uchar bdata bdat;
  35. sbit dat0=bdat^0;
  36. sbit dat1=bdat^1;
  37. sbit dat2=bdat^2;
  38. sbit dat3=bdat^3;
  39. sbit dat4=bdat^4;
  40. sbit dat5=bdat^5;
  41. sbit dat6=bdat^6;
  42. sbit dat7=bdat^7;
  43. void smg_s(uchar dat)
  44. {  bdat=dat;
  45. if(dat0==1)
  46.   dis_smg[0]=0x00;
  47. if(dat1==1)
  48.   dis_smg[1]=0x00;
  49. if(dat2==1)
  50.   dis_smg[2]=0x00;
  51. if(dat3==1)
  52.   dis_smg[3]=0x00;
  53. if(dat4==1)
  54.   dis_smg[4]=0x00;
  55. if(dat5==1)
  56.   dis_smg[5]=0x00;
  57. if(dat6==1)
  58.   dis_smg[6]=0x00;
  59. if(dat7==1)
  60.   dis_smg[7]=0x00;

  61. }
  62. void scan()
  63. {
  64. static uchar i;
  65. uchar key;
  66. keyscan=10;
  67. keyscan=10;
  68. P3=0xf0;
  69. key=P3;
  70. key=key&0xf0;
  71. if(key!=0xf0)
  72. {
  73.   i++;
  74.   if(i>=7)
  75.   if(flag==0)
  76.   {
  77.    flag=1;
  78.    switch(key)
  79.    {
  80.     case 0xe0:keyscan=1;break;
  81.     case 0xd0:keyscan=2;break;
  82.     case 0xb0:keyscan=3;break;
  83.    }
  84.   }
  85. }
  86. else{flag=0;i=0;}
  87. }
  88. void clock_can()
  89. {
  90. delay_1ms(5);
  91. if(keyscan==1)
  92. {
  93.   write_ds1302(0x8e,0x00);
  94.   write_ds1302(0x80,0x80);
  95.   write_ds1302(0x8e,0x80);
  96.   key_set++;
  97.   if(key_set==1)
  98.    flag_s=0x30;
  99.   if(key_set==2)
  100.    flag_s=0x0c;
  101.   if(key_set==3)
  102.    flag_s=0x03;
  103.   if(key_set>=4)
  104.   {
  105.    key_set=0;
  106.    flag_s=0x00;
  107.    write_ds1302(0x8e,0x00);
  108.    write_ds1302(0x80,0x00);
  109.    write_ds1302(0x8e,0x80);
  110.   }
  111. }
  112. if(keyscan==2)
  113. {
  114.   if(key_set==1)
  115.   {
  116.    write_ds1302(0x8e,0x00);
  117.    shi=read_ds1302(0x85);
  118.    shi=bcdtoasc(shi);
  119.    shi++;
  120.    if(shi==24)
  121.    shi=0;
  122.    shi=asctobcd(shi);
  123.    write_ds1302(0x84,shi);
  124.    write_ds1302(0x8e,0x80);
  125.   }
  126.   if(key_set==2)
  127.   {
  128.    write_ds1302(0x8e,0x00);
  129.    fen=read_ds1302(0x83);
  130.    fen=bcdtoasc(fen);
  131.    fen++;
  132.    if(fen==60)
  133.    fen=0;
  134.    fen=asctobcd(fen);
  135.    write_ds1302(0x82,fen);
  136.    write_ds1302(0x8e,0x80);
  137.   }
  138.   if(key_set==3)
  139.   {
  140.    write_ds1302(0x8e,0x00);
  141.    miao=read_ds1302(0x81);
  142.    miao=bcdtoasc(miao);
  143.    miao++;
  144.    if(miao==60)
  145.    miao=0;
  146.    miao=asctobcd(miao);
  147.    write_ds1302(0x80,miao);
  148.    write_ds1302(0x8e,0x80);
  149.   }
  150. }
  151. if(keyscan==3)
  152. {
  153.   if(key_set==1)
  154.   {
  155.    write_ds1302(0x8e,0x00);
  156.    shi=read_ds1302(0x85);
  157.    shi=bcdtoasc(shi);
  158.    if(shi==0)
  159.    shi=24;
  160.    shi--;
  161.    shi=asctobcd(shi);
  162.    write_ds1302(0x84,shi);
  163.    write_ds1302(0x8e,0x80);
  164.   }
  165.   if(key_set==2)
  166.   {
  167.    write_ds1302(0x8e,0x00);
  168.    fen=read_ds1302(0x83);
  169.    fen=bcdtoasc(fen);
  170.    if(fen==0)
  171.    fen=60;
  172.    fen--;
  173.    fen=asctobcd(fen);
  174.    write_ds1302(0x82,fen);
  175.    write_ds1302(0x8e,0x80);
  176.   }
  177.   if(key_set==3)
  178.   {
  179.    write_ds1302(0x8e,0x00);
  180.    miao=read_ds1302(0x81);
  181.    miao=bcdtoasc(miao);
  182.    if(miao==0)
  183.    miao=60;
  184.    miao--;
  185.    miao=asctobcd(miao);
  186.    write_ds1302(0x80,miao);
  187.    write_ds1302(0x8e,0x80);
  188.   }
  189. }
  190. }
  191. void write_ds1302(uchar add,uchar dat)
  192. {
  193. uchar i;
  194. rst=1;
  195. for(i=0;i<8;i++)
  196. {
  197.   scl=0;
  198.   sda=add&0x01;
  199.   scl=1;
  200.   add>>=1;
  201. }
  202. for(i=0;i<8;i++)
  203. {
  204.   scl=0;
  205.   sda=dat&0x01;
  206.   scl=1;
  207.   dat>>=1;
  208. }
  209. rst=0;
  210. scl=0;
  211. sda=0;
  212. }
  213. uchar read_ds1302(uchar add)
  214. {
  215. uchar i,value;
  216. rst=1;
  217. for(i=0;i<8;i++)
  218. {
  219.   scl=0;
  220.   sda=add&0x01;
  221.   scl=1;
  222.   add>>=1;
  223. }
  224. for(i=0;i<8;i++)
  225. {
  226.   scl=0;
  227.   value>>=1;
  228.   if(sda==1)
  229.   value|=0x80;
  230.   scl=1;
  231. }
  232. rst=0;
  233. scl=0;
  234. sda=0;
  235. return value;
  236. }
  237. void write_SFM()
  238. {
  239. scl=0;rst=0;
  240. write_ds1302(0x8e,0x00);
  241. write_ds1302(0x80,0x55);
  242. write_ds1302(0x82,0x59);
  243. write_ds1302(0x84,0x23);
  244. write_ds1302(0x8e,0x80);
  245. }
  246. void dis_init()
  247. {
  248.     miao=read_ds1302(0x81);;
  249. fen =read_ds1302(0x83);;
  250. shi =read_ds1302(0x85);
  251. dis_smg[0]=smg_du[miao%16];       ;
  252. dis_smg[1]=smg_du[miao/16];        ;
  253. dis_smg[2]=smg_du[fen%16]|0x80;        ;
  254. dis_smg[3]=smg_du[fen/16];        ;
  255. dis_smg[4]=smg_du[shi%16]|0x80;        ;
  256. dis_smg[5]=smg_du[shi/16];     
  257. }
  258. void display()
  259. {
  260. static uchar i;
  261. P0=0x00;
  262. dula=1;dula=0;
  263. P0=smg_we[i];
  264. wela=1;wela=0;
  265. P0=dis_smg[5-i];
  266. dula=1;dula=0;
  267. i++;
  268. if(i>=6)i=0;
  269. }
  270. void init_time0()
  271. {
  272. TMOD=0X01;
  273. TR0=1;
  274. ET0=1;
  275. EA=1;
  276. }
  277. void main()
  278. {
  279.   write_SFM();
  280.   init_time0();
  281. while(1)
  282. {
  283.   if(flag_500ms)
  284.      dis_init();
  285.   else
  286.    smg_s(flag_s);
  287.   
  288.   scan();
  289.   clock_can();
  290.   display();
  291. }
  292. }
  293. void timer0() interrupt 1
  294. {
  295.   uchar i;
  296.   TH0=0xdb;
  297.   TL0=0xf0;
  298.   i++;
  299.   if(i>=50)
  300.   {
  301.    i=0;
  302.   flag_500ms=~flag_500ms;
  303.   }
  304. }
复制代码
回复

使用道具 举报

ID:140489 发表于 2017-1-18 14:35 | 显示全部楼层
能走时,但不能调时
回复

使用道具 举报

ID:140489 发表于 2017-1-18 15:13 | 显示全部楼层
能走时,能调时。开始不能调时是我的实验板按键的脚位和这个程序不配套,修改后可以了
回复

使用道具 举报

ID:740383 发表于 2020-6-3 10:32 | 显示全部楼层
好东西
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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