找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2270|回复: 4
收起左侧

51单片机1602+1302+18b20四位数据线驱动程序

[复制链接]
ID:447989 发表于 2019-1-23 14:57 | 显示全部楼层 |阅读模式
QQ图片20181217151052.jpg

单片机源码:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar tab0[]="00.0";
  6. uchar tab1[]="0123456789";
  7. uchar tab2[]="xinqi";

  8. uchar knum;
  9. uchar miao,miao1,miao2,nian,nian1,nian2,
  10.          fen,fen1,fen2,yue,yue1,yue2,
  11.          shi,shi1,shi2,ri,ri1,ri2,xq,xq1;

  12. bit flag;
  13. uint temp;                //是否读取时间的标志位
  14. uchar setn=0;            //复位键、增加键、减少键按下次数

  15. //sbit led1 = P2^4;
  16. sbit led2 = P0^1;
  17. sbit SCLK = P2^1;                  
  18. sbit IO = P2^2;                     
  19. sbit RST = P2^3;
  20. sbit rs = P3^5;
  21. sbit rw = P3^3;
  22. sbit lcden = P3^4;
  23. sbit ds = P3^7;

  24. sbit s1 = P2^7;
  25. sbit s2 = P2^4;
  26. sbit set= P2^6;

  27. void delays(uchar t)
  28. {
  29.    while(t--);      
  30. }

  31. void delay(uint z)
  32. {   
  33.    uint x,y;
  34.     for(x=z;x>0;x--)
  35.        for(y=110;y>0;y--);
  36. }

  37. void write_com(uchar com)
  38. {
  39.     rs = 0;
  40.     rw = 0;
  41.     P1=com&0xf0;
  42.     delay(2);
  43.     lcden  = 1;
  44.     delay(2);
  45.     lcden  = 0;

  46.     P1=(com<<4)&0xf0;
  47.     delay(2);
  48.     lcden  = 1;
  49.     delay(2);
  50.     lcden  = 0;
  51. }

  52. void write_data(uchar dat)
  53. {   
  54.     rs = 1;
  55.     rw = 0;
  56.     P1=dat&0xf0;
  57.     delay(2);
  58.     lcden  = 1;
  59.     delay(2);
  60.     lcden  = 0;

  61.     P1=(dat<<4)&0xf0;
  62.     delay(2);
  63.     lcden  = 1;
  64.     delay(2);
  65.     lcden  = 0;

  66. }

  67. void init_1602()
  68. {   
  69.     write_com(0x32);
  70.     write_com(0x28);
  71.     write_com(0x0c);
  72.     write_com(0x06);
  73.     write_com(0x01);

  74. }

  75. void input_1byte(uchar dat)
  76. {
  77.     uchar i;
  78.     for (i=0; i<8; i++)             //8位计数器
  79.     {
  80.         SCLK = 0;                   //时钟线拉低
  81.         _nop_();                    //延时等待
  82.         _nop_();
  83.         dat >>= 1;                  //移出数据
  84.         IO = CY;                    //送出到端口
  85.         SCLK = 1;                   //时钟线拉高
  86.         _nop_();                    //延时等待
  87.         _nop_();
  88.     }
  89. }

  90. uchar output_1byte()
  91. {
  92.     uchar i;
  93.     uchar dat = 0;
  94.     for (i=0; i<8; i++)             //8位计数器
  95.     {
  96.         SCLK = 0;                   //时钟线拉低
  97.         _nop_();                    //延时等待
  98.         _nop_();
  99.         dat >>= 1;                  //数据右移一位
  100.         if (IO) dat |= 0x80;        //读取数据
  101.         SCLK = 1;                   //时钟线拉高
  102.         _nop_();                    //?óê±μè′y
  103.         _nop_();
  104.     }
  105.     return dat;
  106. }

  107. void write_ds1302(uchar add,uchar dat)
  108. {
  109.    {
  110.     RST = 0;
  111.     _nop_();                        //延时等待
  112.     _nop_();
  113.     SCLK = 0;
  114.     _nop_();                        //延时等待
  115.     _nop_();
  116.     RST = 1;
  117.     _nop_();                        //延时等待
  118.     _nop_();
  119.     input_1byte(add);         //写地址
  120.     input_1byte(dat);          //写数据
  121.     SCLK = 1;
  122.     RST = 0;
  123.    }
  124. }

  125. uchar read_ds1302(uchar add)
  126. {
  127.     uchar dat;
  128.     RST = 0;
  129.     _nop_();                        
  130.     _nop_();
  131.     SCLK = 0;
  132.     _nop_();                        
  133.     _nop_();
  134.     RST = 1;
  135.     _nop_();                       
  136.     _nop_();
  137.     input_1byte(add);         
  138.     dat = output_1byte();      
  139.     SCLK = 1;
  140.     RST = 0;
  141.     return dat;
  142. }

  143. void ds1302_init()
  144. {   
  145.     write_ds1302(0x8e, 0x00);
  146.     //write_ds1302(0x90, 0xaa);  
  147.     write_ds1302(0x80, 0x32);   //miao  
  148.     write_ds1302(0x82, 0x43);   //fen
  149.     write_ds1302(0x84, 0x12);   //shi
  150.     write_ds1302(0x86, 0x11);   //ri
  151.     write_ds1302(0x88, 0x12);   //yue
  152.     write_ds1302(0x8a, 0x02);   //xq
  153.     write_ds1302(0x8c, 0x18);   //nian
  154.     write_ds1302(0x8e, 0x80);   
  155. }

  156. void display()
  157. {
  158.    miao=read_ds1302(0x81);
  159.    miao1=miao/16+'0';
  160.    miao2=miao%16+'0';
  161.    fen=read_ds1302(0x83);
  162.    fen1=fen/16+'0';
  163.    fen2=fen%16+'0';
  164.    shi=read_ds1302(0x85);
  165.    shi1=shi/16+'0';
  166.    shi2=shi%16+'0';

  167.    xq=read_ds1302(0x8b);
  168.    xq1=xq%16+'0';

  169.    nian=read_ds1302(0x8d);
  170.    nian1=nian/16+'0';
  171.    nian2=nian%16+'0';
  172.    yue=read_ds1302(0x89);
  173.    yue1=yue/16+'0';
  174.    yue2=yue%16+'0';
  175.    ri=read_ds1302(0x87);
  176.    ri1=ri/16+'0';
  177.    ri2=ri%16+'0';

  178.    write_com(0x81);
  179.    write_data(shi2);
  180.    write_com(0x80);
  181.    write_data(shi1);
  182.    write_com(0x82);
  183.    write_data(':');
  184.    write_com(0x84);
  185.    write_data(fen2);
  186.    write_com(0x83);
  187.    write_data(fen1);
  188.    write_com(0x85);
  189.    write_data(':');
  190.    write_com(0x87);
  191.    write_data(miao2);
  192.    write_com(0x86);
  193.    write_data(miao1);

  194.    write_com(0xc1);
  195.    write_data(nian2);
  196.    write_com(0xc0);
  197.    write_data(nian1);
  198.    write_com(0xc2);
  199.    write_data('/');
  200.    write_com(0xc4);
  201.    write_data(yue2);
  202.    write_com(0xc3);
  203.    write_data(yue1);
  204.    write_com(0xc5);
  205.    write_data('/');
  206.    write_com(0xc7);
  207.    write_data(ri2);
  208.    write_com(0xc6);
  209.    write_data(ri1);
  210.    write_com(0xcf);
  211.    write_data(xq1);
  212. }

  213. uchar change(uchar x)//十进制转换成十六进制
  214. {
  215. uchar tep,y;
  216. y=x;
  217. tep=y/16;
  218. y=y%16;
  219. y=y+tep*10;
  220. return y;
  221. }


  222. void keyscan()
  223. {
  224. uchar tem[2],tp;//存储要更改的时间数据

  225. if(set==0)
  226. {
  227. flag=1;//时间停止
  228. delay(40);//去键盘按下抖动
  229. if(set==0)
  230. {
  231. delay(40);
  232. while(!set);
  233. delay(40);//去键盘抬起时抖动
  234. while(!set);
  235. delay(40);
  236. setn++;

  237. if(setn==1)
  238. {
  239. write_ds1302(0x8E,0X00);
  240. write_ds1302(0x80,0X80);
  241. write_com(0x87);
  242. }

  243. if(setn==2)
  244. {
  245. write_com(0x84);

  246. }

  247. if(setn==3)
  248. {

  249. write_com(0x81);

  250. }

  251. if(setn==4)
  252. {

  253. write_com(0xc7);

  254. }

  255. if(setn==5)
  256. {

  257. write_com(0xc4);

  258. }

  259. if(setn==6)
  260. {

  261. write_com(0xc1);

  262. }

  263. if(setn==7)
  264. {

  265. write_com(0xcf);

  266. }

  267. if(setn==8)
  268. {
  269. setn=0;
  270. write_ds1302(0x8E,0X00);               //关闭写保护
  271. write_ds1302(0x80,0x00);
  272. write_ds1302(0x8E,0x80);               //打开写保护
  273. flag=0;//时钟正常运行
  274. write_com(0x0c);//光标停止闪烁
  275. }

  276. }
  277. }

  278. if(setn!=0)//更改时间
  279. {
  280. if(s1==0)//增加时间
  281. {
  282. delay(40);
  283. if(s1==0)
  284. {
  285. while(!s1);
  286. delay(40);//去键盘抬起时抖动
  287. while(!s1);

  288. if(setn==2)
  289. {
  290. fen=change(fen);
  291. fen++;
  292. if(fen==60)
  293. fen=0;
  294. {
  295. tp=fen/10;
  296. fen=fen%10;
  297. fen=fen+tp*16;
  298. write_ds1302(0x8E,0X00);//关闭写保护
  299. write_ds1302(0x82,fen);
  300. write_ds1302(0x8E,0x80);//打开写保护
  301. }
  302. write_com(0x83);
  303. tem[0]=fen/16;//数据的转换
  304. tem[1]=fen&0x0f;
  305. write_data(0x30+tem[0]);
  306. write_data(0x30+tem[1]);
  307. write_com(0x84);
  308. }

  309. if(setn==3)
  310. {
  311. shi=change(shi);
  312. shi++;
  313. if(shi>=24)
  314. shi=0;
  315. {
  316. tp=shi/10;
  317. shi=shi%10;
  318. shi=shi+tp*16;
  319. write_ds1302(0x8E,0X00);//关闭写保护
  320. write_ds1302(0x84,shi);
  321. write_ds1302(0x8E,0x80);//打开写保护
  322. }
  323. write_com(0x80);
  324. tem[0]=shi/16;//数据的转换
  325. tem[1]=shi&0x0f;
  326. write_data(0x30+tem[0]);
  327. write_data(0x30+tem[1]);
  328. write_com(0x81);
  329. }

  330. if(setn==4)
  331. {
  332. ri=change(ri);
  333. ri++;
  334. if(ri>=32)
  335. ri=0;
  336. {
  337. tp=ri/10;
  338. ri=ri%10;
  339. ri=ri+tp*16;
  340. write_ds1302(0x8E,0X00);//关闭写保护
  341. write_ds1302(0x86,ri);
  342. write_ds1302(0x8E,0x80);//打开写保护
  343. }
  344. write_com(0xc6);
  345. tem[0]=ri/16;//数据的转换
  346. tem[1]=ri&0x0f;
  347. write_data(0x30+tem[0]);
  348. write_data(0x30+tem[1]);
  349. write_com(0xc7);
  350. }

  351. if(setn==5)
  352. {
  353. yue=change(yue);
  354. yue++;
  355. if(yue>=13)
  356. yue=1;
  357. {
  358. tp=yue/10;
  359. yue=yue%10;
  360. yue=yue+tp*16;
  361. write_ds1302(0x8E,0X00);//关闭写保护
  362. write_ds1302(0x88,yue);
  363. write_ds1302(0x8E,0x80);//打开写保护
  364. }
  365. write_com(0xc3);
  366. tem[0]=yue/16;//数据的转换
  367. tem[1]=yue&0x0f;
  368. write_data(0x30+tem[0]);
  369. write_data(0x30+tem[1]);
  370. write_com(0xc4);
  371. }

  372. if(setn==6)
  373. {
  374. nian=change(nian);
  375. nian++;
  376. if(nian>=99)
  377. nian=0;
  378. {
  379. tp=nian/10;
  380. nian=nian%10;
  381. nian=nian+tp*16;
  382. write_ds1302(0x8E,0X00);//关闭写保护
  383. write_ds1302(0x8c,nian);
  384. write_ds1302(0x8E,0x80);//打开写保护
  385. }
  386. write_com(0xc0);
  387. tem[0]=nian/16;//数据的转换
  388. tem[1]=nian&0x0f;
  389. write_data(0x30+tem[0]);
  390. write_data(0x30+tem[1]);
  391. write_com(0xc1);
  392. }

  393. if(setn==7)
  394. {
  395. xq=change(xq);
  396. xq++;
  397. if(xq>=8)
  398. xq=1;
  399. {
  400. tp=xq/10;
  401. xq=xq%10;
  402. xq=xq+tp*16;
  403. write_ds1302(0x8E,0X00);//关闭写保护
  404. write_ds1302(0x8a,xq);
  405. write_ds1302(0x8E,0x80);//打开写保护
  406. }
  407. write_com(0xce);
  408. tem[0]=xq/16;//数据的转换
  409. tem[1]=xq&0x0f;
  410. write_data(0x30+tem[0]);
  411. write_data(0x30+tem[1]);
  412. write_com(0xcf);
  413. }

  414. }
  415. }

  416. if(s2==0)//减少时间
  417. {
  418. delay(40);
  419. if(s2==0)
  420. {
  421. while(!s2);
  422. delay(40);//去键盘抬起时抖动
  423. while(!s2);

  424. if(setn==2)
  425. {
  426. fen=change(fen);
  427. if(fen!=0)
  428. fen--;
  429. if(fen==0)
  430. fen=59;
  431. {
  432. tp=fen/10;
  433. fen=fen%10;
  434. fen=fen+tp*16;
  435. write_ds1302(0x8E,0X00);//关闭写保护
  436. write_ds1302(0x82,fen);
  437. write_ds1302(0x8E,0x80);//打开写保护
  438. }
  439. write_com(0x83);
  440. tem[0]=fen/16;//数据的转换
  441. tem[1]=fen&0x0f;
  442. write_data(0x30+tem[0]);
  443. write_data(0x30+tem[1]);
  444. write_com(0x84);
  445. }

  446. if(setn==3)
  447. { shi=change(shi);
  448. if(shi!=0)
  449. shi--;
  450. if(shi==0)
  451. shi=23;
  452. {
  453. tp=shi/10;
  454. shi=shi%10;
  455. shi=shi+tp*16;
  456. write_ds1302(0x8E,0X00);//关闭写保护
  457. write_ds1302(0x84,shi);
  458. write_ds1302(0x8E,0x80);//打开写保护
  459. }
  460. write_com(0x80);
  461. tem[0]=shi/16;//数据的转换
  462. tem[1]=shi&0x0f;
  463. write_data(0x30+tem[0]);
  464. write_data(0x30+tem[1]);
  465. write_com(0x81);
  466. }

  467. if(setn==4)
  468. {
  469. ri=change(ri);
  470. if(ri!=0)
  471. ri--;
  472. if(ri==0)
  473. ri=31;
  474. {
  475. tp=ri/10;
  476. ri=ri%10;
  477. ri=ri+tp*16;
  478. write_ds1302(0x8E,0X00);//关闭写保护
  479. write_ds1302(0x86,ri);
  480. write_ds1302(0x8E,0x80);//打开写保护
  481. }
  482. write_com(0xc6);
  483. tem[0]=ri/16;//数据的转换
  484. tem[1]=ri&0x0f;
  485. write_data(0x30+tem[0]);
  486. write_data(0x30+tem[1]);
  487. write_com(0xc7);
  488. }

  489. if(setn==5)
  490. {
  491. yue=change(yue);
  492. if(yue!=0)
  493. yue--;
  494. if(yue==0)
  495. yue=12;
  496. {
  497. tp=yue/10;
  498. yue=yue%10;
  499. yue=yue+tp*16;
  500. write_ds1302(0x8E,0X00);//关闭写保护
  501. write_ds1302(0x88,yue);
  502. write_ds1302(0x8E,0x80);//打开写保护
  503. }
  504. write_com(0xc6);
  505. tem[0]=yue/16;//数据的转换
  506. tem[1]=yue&0x0f;
  507. write_data(0x30+tem[0]);
  508. write_data(0x30+tem[1]);
  509. write_com(0xc7);
  510. }

  511. if(setn==6)
  512. {
  513. nian=change(nian);
  514. if(nian!=0)
  515. nian--;
  516. if(nian==0)
  517. nian=99;
  518. {
  519. tp=nian/10;
  520. nian=nian%10;
  521. nian=nian+tp*16;
  522. write_ds1302(0x8E,0X00);//关闭写保护
  523. write_ds1302(0x8c,nian);
  524. write_ds1302(0x8E,0x80);//打开写保护
  525. }
  526. write_com(0xc0);
  527. tem[0]=nian/16;//数据的转换
  528. tem[1]=nian&0x0f;
  529. write_data(0x30+tem[0]);
  530. write_data(0x30+tem[1]);
  531. write_com(0xc1);
  532. }

  533. if(setn==7)
  534. {
  535. xq=change(xq);
  536. if(xq!=0)
  537. xq--;
  538. if(xq==0)
  539. xq=7;
  540. {
  541. tp=xq/10;
  542. xq=xq%10;
  543. xq=xq+tp*16;
  544. write_ds1302(0x8E,0X00);//关闭写保护
  545. write_ds1302(0x8a,xq);
  546. write_ds1302(0x8E,0x80);//打开写保护
  547. }
  548. write_com(0xce);
  549. tem[0]=xq/16;//数据的转换
  550. tem[1]=xq&0x0f;
  551. write_data(0x30+tem[0]);
  552. write_data(0x30+tem[1]);
  553. write_com(0xcf);
  554. }

  555. }
  556. }
  557. }
  558. }
  559. /*******************************************************/
  560. void ds_reset()
  561. {
  562.    ds=1;
  563.    delays(220);
  564.    ds=0;
  565.    delays(220);
  566.    ds=1;
  567.    delays(85);
  568.    if(ds==0)
  569.      flag=1;
  570.    else
  571.      flag=0;
  572.    delays(130);
  573. }

  574. bit ds_read_bit()
  575. {
  576.    bit dat;
  577.    ds=0;
  578.    _nop_();
  579.    _nop_();
  580.    ds=1;
  581.    _nop_();
  582.    _nop_();
  583.    dat=ds;
  584.    delays(50);
  585.    return dat;
  586. }

  587. uchar ds_read_byte()
  588. {
  589.    uchar i,j,k;
  590.    for(i=0;i<8;i++)
  591. {
  592.    j= ds_read_bit();
  593.    k=(j<<7)|(k>>1);
  594.    delays(100);
  595. }
  596.    return k;
  597. }

  598. void ds_write_byte(uchar dat)
  599. {
  600.    uchar i;
  601.    for(i=0;i<8;i++)
  602. {
  603.    ds=0;
  604.    _nop_();
  605.    _nop_();
  606.    ds=dat&0x01;
  607.    delays(50);
  608.    ds=1;
  609.    dat=dat>>1;
  610. }
  611.    delays(85);
  612. }

  613. uint read_temperture()
  614. {
  615.    uchar a,b;
  616.    ds_reset();
  617.    ds_write_byte(0xcc);
  618.    ds_write_byte(0xbe);
  619.    a=ds_read_byte();
  620.    b=ds_read_byte();

  621.    temp=b;
  622.    temp=temp<<8;
  623.    temp=temp|a;

  624.     if(b>=0x08)
  625.    {
  626.     temp=~temp+1;
  627.     write_com(0x89);
  628.     write_data('-');
  629.    }
  630.    else
  631.    {
  632.     write_com(0x89);
  633.     write_data(' ');
  634.    }

  635.    temp=temp*0.0625*10+0.5;
  636.    return temp;
  637. }

  638. void display3(uint num)
  639. {
  640.     uchar bai1,shi1,ge1,i;
  641.     bai1=num/100;
  642.     shi1=num%100/10;
  643.     ge1=num%100%10;
  644. {
  645.     tab0[0]=tab1[bai1];
  646.     tab0[1]=tab1[shi1];
  647.     tab0[3]=tab1[ge1];

  648.     write_com(0x8a);
  649.     for(i=0;i<4;i++)
  650. {   
  651.     write_data(tab0[i]);
  652. }
  653.     write_com(0x8e);
  654.     write_data(0xdf);
  655.     write_com(0x8f);
  656.     write_data(0x43);

  657.     write_com(0xca);
  658.    for(i=0;i<5;i++)
  659. {
  660.    write_data(tab2[i]);
  661. }
  662. }  
  663. }

  664. void main()
  665. {
  666.    init_1602();
  667.    delay(2);
  668.    //ds1302_init();
  669.    //delay(2);
  670.    while(1)
  671. {
  672.   ds_reset();
  673.   ds_write_byte(0xcc);
  674.   ds_write_byte(0x44);
  675.   display3(read_temperture());

  676.   keyscan();
  677.   display();   
  678. }                  
  679. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:447989 发表于 2019-1-23 14:59 | 显示全部楼层
没能增加光标指示有点遗憾,其他的功能还行
回复

使用道具 举报

ID:89286 发表于 2019-1-23 17:53 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:472213 发表于 2019-1-23 18:40 | 显示全部楼层
还行,可以参考
回复

使用道具 举报

ID:447989 发表于 2019-1-24 14:04 | 显示全部楼层

记得把1302初始化打开
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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