找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用89C52单片机制作简易电子表源码和原理图

[复制链接]
ID:336991 发表于 2018-5-27 00:31 | 显示全部楼层 |阅读模式
采用中断的方法‘,使用了两个74HC595和两个数码管,
完全可以用1个6位数码管加一个74HC595完成的,不过开始没想好,画好了原理图也就不想改了。
附上代码和原理图
欢迎探讨。
QQ截图20180527003019.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. unsigned int a=4000;
  4. unsigned char temp0,temp1,temp2,temp3,temp4,temp5;
  5. unsigned int time_buf[]={0,0,0};
  6. unsigned char code t_display[]={
  7. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F   消隐
  8.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};        //段码

  9. sbit ST_CP1=P1^0;
  10. sbit SH_CP1=P1^2;
  11. sbit DS1=P1^1;

  12. sbit ST_CP2=P1^3;
  13. sbit SH_CP2=P1^5;
  14. sbit DS2=P1^4;
  15.        
  16. sbit w1=P1^7;
  17. sbit w2=P1^6;
  18.        
  19.         void delay(unsigned char i)
  20. {
  21.         unsigned char m,n,k;
  22.         for(m=i;m>0;m--)
  23.         for(k=128;k>0;k--)
  24.         for(n=130;n>0;n--);
  25. }

  26. void input1_595(unsigned char dat)        //发送一个字节
  27. {               
  28.         unsigned char        i;
  29.         for(i=0; i<8; i++)
  30.         {
  31.                 if(dat & 0x80)        DS1 = 1;
  32.                 else                        DS1 = 0;
  33.                 SH_CP1 = 1;
  34.                 SH_CP1 = 0;
  35.                 dat = dat << 1;
  36.         }
  37. }

  38. void output1_595()
  39. {
  40.         ST_CP1=0;
  41.         _nop_();
  42.         ST_CP1=1;
  43.         _nop_();
  44.         ST_CP1=0;
  45. }

  46. void input2_595(unsigned char dat)        //发送一个字节
  47. {               
  48.         unsigned char        i;
  49.         for(i=0; i<8; i++)
  50.         {
  51.                 if(dat & 0x80)        DS2 = 1;
  52.                 else                        DS2 = 0;
  53.                 SH_CP2 = 1;
  54.                 SH_CP2 = 0;
  55.                 dat = dat << 1;
  56.         }
  57. }

  58. void output2_595()
  59. {
  60.         ST_CP2=0;
  61.         _nop_();
  62.         ST_CP2=1;
  63.         _nop_();
  64.         ST_CP2=0;
  65. }



  66. void main()
  67. {
  68.         unsigned char a,b,c;
  69.         //unsigned char i;
  70.         while(1)
  71.         {
  72.         TH0=0X06;
  73.         TL0=0X06;
  74.         TMOD=0X02;
  75.         IE=0X82;
  76.         TR0=1;  //TR0启动加一计数
  77.                 temp0=time_buf[2]%10;
  78.                 temp1=time_buf[2]/10;
  79.                 temp2=time_buf[1]%10;
  80.                 temp3=time_buf[1]/10;
  81.                 temp4=time_buf[0]%10;
  82.                 temp5=time_buf[0]/10;
  83.         //for(a=128;a>0;a--)
  84.                 w2=0;w1=0;
  85.         for(b=130;b>0;b--)
  86.                 for(c=20;c>0;c--)
  87.                 {
  88.                         w2=1;w1=1;
  89.                         input1_595(t_display[temp0]);
  90.                         output1_595();
  91.                         input2_595(t_display[temp2]);
  92.                         output2_595();
  93.                         w2=0;w1=1;
  94.                         for(a=5;a>0;a--);
  95.         //                _nop_();        _nop_();        _nop_();
  96.                                 w2=1;w1=1;
  97.                         input1_595(t_display[temp1]);
  98.                         output1_595();
  99.                         input2_595(t_display[temp3]);
  100.                         output2_595();
  101.                         w2=1;w1=0;
  102.                         for(a=5;a>0;a--);
  103.         //                        _nop_();        _nop();        _nop_();
  104.                 }/*
  105.                 input1_595(t_display[temp2]);
  106.                 output1_595();
  107.                 input2_595(t_display[temp3]);
  108.                 output2_595();
  109.                 delay(20);
  110.                 input1_595(t_display[temp4]);
  111.                 output1_595();
  112.                 input2_595(t_display[temp5]);
  113.                 delay(20);*/
  114.         }
  115. }

  116. timer()  interrupt 1  using 1
  117. {
  118.         a--;
  119.         if(a==0)
  120.         {
  121.                 a=4000;
  122.                 time_buf[2]+=1;
  123.                 if(time_buf[2]>=60)
  124.                 {
  125.                         time_buf[2]=0;
  126.                         time_buf[1]+=1;
  127.                         if(time_buf[1]>=60)
  128.                         {
  129.                                 time_buf[1]=0;
  130.                                 time_buf[0]+=1;
  131.                         }
  132.                 }
  133.         }
  134. }
复制代码

所有资料51hei提供下载:
中断.zip (27.18 KB, 下载次数: 20)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-5-27 05:31 | 显示全部楼层
仿真工程文件能分享一下吗?
回复

使用道具 举报

ID:316468 发表于 2018-5-27 09:34 | 显示全部楼层
钟表不能这样做的,晶振速度越快累计误差越大,你这个一个月下来估计都能慢好几分钟。
回复

使用道具 举报

ID:316468 发表于 2018-5-27 09:38 | 显示全部楼层
做钟表类的要用32768的低速晶振,最好用ds1302之类的时钟芯片去做。再加后背电源,断电不用重新设置钟表时间。
回复

使用道具 举报

ID:336991 发表于 2018-6-2 18:47 | 显示全部楼层
lucheng77 发表于 2018-5-27 09:38
做钟表类的要用32768的低速晶振,最好用ds1302之类的时钟芯片去做。再加后背电源,断电不用重新设置钟表时 ...

好的好的,多谢老哥指点,确实有点不求甚解了
我主要是想写下595驱动的程序,之前学的时候没搞懂,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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