找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1688|回复: 0
收起左侧

51单片机编写74hc59数据传输功能,钟表

[复制链接]
ID:334683 发表于 2018-5-21 10:12 | 显示全部楼层 |阅读模式
51 编写74hc59数据传输功能,钟表

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit DAT=P1^1;                //数据传送端口
  6. sbit CLK=P1^2;                //移位寄存器端口
  7. sbit STR=P1^3;                //储存寄存器端口

  8. sbit K1=P3^0;       //移位按键
  9. sbit K2=P3^1;       //数字加1
  10. sbit K3=P3^2;       //数字减1

  11. sbit beep=P2^3;     //蜂鸣器
  12. void beepscan(void);

  13.                                          //0   1        2         3          4          5           6        7         8          9           -
  14. uchar code SMG[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //共阴极数码管段选
  15. uchar code Wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                         //数码管位选
  16. uchar num,num1,num2,num3,miao2,miao1,fen2,fen1,shi2,shi1;
  17. uchar i,j=0;
  18. /*===========
  19. ms级延时函数
  20. =============*/
  21. void delayms(uchar ms)
  22. {
  23.    uint i,j;
  24.    for(i=ms;i>0;i--)
  25.      for(j=115;j>0;j--);
  26. }

  27. /*================
  28. 写位码数据到寄存器
  29. ==================*/
  30. void write_dat(uchar dat)          
  31. {
  32.    uchar i;
  33.    for(i=0;i<8;i++)
  34.    {
  35.            CLK=0;                                   //拉低移位寄存器
  36.            DAT=dat & 0x80;                   //将数据送入数据线
  37.            CLK=1;                                   //拉高移位寄存器,数据寄存器的数据可以移位
  38.            dat <<= 1;                           //数据左移到最高位
  39.    }
  40. }

  41. /*================
  42. 写位码数据到寄存器
  43. ==================*/
  44. void write_dat1(uchar dat1)                  
  45. {
  46.    uchar i;
  47.    for(i=0;i<8;i++)
  48.    {
  49.            CLK=0;
  50.            DAT=dat1 & 0x80;
  51.            CLK=1;
  52.            dat1 <<= 1;
  53.    }
  54. }

  55. /*==========
  56. 输出数据函数
  57. ============*/
  58. void out_dat()                  
  59. {
  60.    STR=0;                           //拉低储存寄存器
  61.    _nop_();
  62.    STR=1;                           //拉高储存寄存器
  63. }

  64. /*======
  65. 显示函数
  66. ========*/
  67. void display(uchar miao1,uchar miao2,uchar fen1,uchar fen2,uchar shi1,uchar shi2)
  68. {
  69.                                              
  70.                  write_dat(Wei[0]);                        //写数码管位码数据第一位
  71.                  delayms(1);                                //等待数据稳定
  72.                  write_dat1(SMG[miao1]);        //写数码管段码数据秒个位
  73.                  delayms(1);                                //等待数据稳定
  74.                  out_dat();                                          //发出数据

  75.                  write_dat(Wei[1]);                        //写数码管位码数据第二位
  76.                  delayms(1);                                //等待数据稳定
  77.                  write_dat1(SMG[miao2]);        //写数码管段码数据秒十位
  78.                  delayms(1);                                //等待数据稳定
  79.          out_dat();                                        //发出数据

  80.                  write_dat(Wei[3]);
  81.                  delayms(1);
  82.                  write_dat1(SMG[fen1]);
  83.                  delayms(1);
  84.                  out_dat();

  85.                  write_dat(Wei[4]);
  86.                  delayms(1);
  87.                  write_dat1(SMG[fen2]);
  88.                  delayms(1);
  89.                  out_dat();

  90.                  write_dat(Wei[6]);
  91.                  delayms(1);
  92.                  write_dat1(SMG[shi1]);
  93.                  delayms(1);
  94.                  out_dat();

  95.                  write_dat(Wei[7]);                                  
  96.                  delayms(1);
  97.                  write_dat1(SMG[shi2]);
  98.                  delayms(1);
  99.                  out_dat();

  100.                  write_dat(Wei[2]);                                     //写数码管第三位
  101.                  delayms(1);
  102.                  write_dat1(SMG[10]);                          //写数码管第十一个断码 即‘-’
  103.                  delayms(1);
  104.                  out_dat();

  105.                  write_dat(Wei[5]);                                  //写数码管第六位
  106.                  delayms(1);
  107.                  write_dat1(SMG[10]);                          //写数码管第十一个断码 即‘-’
  108.                  delayms(1);
  109.                  out_dat();
  110. }
  111. void beepscan()
  112. {
  113.         beep=0;
  114.         delayms(100);
  115.         beep=1;
  116. }

  117. /*=========
  118.   按键函数
  119. ===========*/
  120. void keyscan()
  121. {
  122.         if(K1==0)                         //移位按键按下
  123.         {
  124.                 delayms(10);                  //消抖
  125.             if(K1==0)                     //再次检测
  126.              {
  127.                          i++;
  128.                          while(!K1);                                                                
  129.                          beepscan();                         
  130.                          if(i==1)
  131.                          {
  132.                             TR0=0;  //关闭定时器
  133.                                 write_dat(Wei[0]);                        //写数码管位码数据第一位
  134.                          }
  135.                          if(i==2)
  136.                          {
  137.                                 write_dat(Wei[1]);                        //写数码管位码数据第二位                                 
  138.                          }
  139.                          if(i==3)
  140.                          {
  141.                                 write_dat(Wei[3]);                        //写数码管位码数据第四位                                 
  142.                          }
  143.                          if(i==4)
  144.                          {
  145.                                 write_dat(Wei[4]);                        //写数码管位码数据第五位                                 
  146.                          }
  147.                          if(i==5)
  148.                          {
  149.                                 write_dat(Wei[6]);                        //写数码管位码数据第七位                                 
  150.                          }
  151.                          if(i==6)
  152.                          {
  153.                                 write_dat(Wei[7]);                        //写数码管位码数据第八位
  154.                 TR0=1;                      //打开定时器                                  
  155.                          }
  156.          }
  157.     }
  158.         if(i!=0)
  159.         {       
  160.      if(K2==0)
  161.          {delayms(10);
  162.             if(K2==0)
  163.                 {
  164.                         beepscan();
  165.                         j++;
  166.                         if(j==9)
  167.                         j=0;
  168.                         write_dat1(SMG[j]);                            
  169.                     delayms(1);
  170.                     out_dat();
  171.         }
  172.         }
  173.     if(K3==0)
  174.                 delayms(10);
  175.             if(K3==0)
  176.                 {
  177.                         beepscan();
  178.                         j--;
  179.                         if(j==0)
  180.                         j=9;
  181.                         write_dat1(SMG[j]);                            
  182.                     delayms(1);
  183.                     out_dat();
  184.         }
  185.         }       
  186. }

  187. /*==============
  188. 定时器初始化函数
  189. ================*/
  190. void timer_init()
  191. {
  192.           TMOD=0x11;                //设置定时器0和1为工作方式1
  193.         TH0=(65536-45872)/256;          //装初值50ms
  194.         TL0=(65536-45872)%256;
  195.         EA=1;                                          //开总中断
  196.         ET0=1;                                          //开定时器0中断                                          
  197.         TR0=1;                                          //启动定时器0
  198. }

  199. /*==================
  200. 时分秒转换函数
  201. 转换后送与数码管显示
  202. ====================*/
  203. void CH_time()
  204. {
  205.            if(num1==20)                 //num1加到20,表示一秒时间已到
  206.          {
  207.             num1=0;                         //将num1清零,重新计时
  208.                 num++;                         //秒开始加
  209.             if(num==60)                 //秒加到60          
  210.          {    num=0;                 //将秒清零,重新计时
  211.               num2++;                 //分开始加
  212.                 if(num2==60)
  213.                 {
  214.                   num2=0;
  215.                   num3++;
  216.                   if(num3==24)
  217.                   {
  218.                       num3=0;
  219.                   }

  220.         }       
  221.          }               
  222.         }
  223.             miao2=num/10;                //计算秒个位       
  224.                 miao1=num%10;                //计算秒十位
  225.             fen2=num2/10;
  226.             fen1=num2%10;
  227.             shi2=num3/10;
  228.                 shi1=num3%10;                                 
  229.             display(miao1,miao2,fen1,fen2,shi1,shi2);        //显示时分秒
  230. }

  231. /*=======
  232.   主函数
  233. =========*/
  234. void main()
  235. {
  236.            timer_init();                //初始化函数          
  237.         while(1)
  238.         {
  239.            CH_time();                //转换显示函数
  240.            keyscan();

  241.     }
  242. }

  243. /*=======
  244. 中断函数
  245. =========*/
  246. void T0_time() interrupt 1       
  247. {
  248.      TH0=(65536-45872)/256;                 
  249.          TL0=(65536-45872)%256;
  250.          num1++;
  251. }
复制代码

所有资料51hei提供下载:
74hc595.zip (41.13 KB, 下载次数: 4)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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