登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看2020|回0|收藏
楼主 ID:977804 只看他
2021-12-21 09:21
帮一个朋友做程序,也是学习吧。哈哈,直接上代码,驱动部分也是在51HEI学习的。
制作出来的实物图如下:
6f1e449bf69ad0369b0c765ef409eea.jpg

单片机源程序如下:

代码:

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int


  4. sfr  P4         =   0xc0;       //I/O端口4              Bit7    Bit6    Bit5    Bit4    Bit3    Bit2    Bit1    Bit0
  5.                                 //位描述                P4.7    P4.6    P4.5    P4.4    P4.3    P4.2    P4.1    P4.0
  6.                                 //初始值=1111,1111      1       1       1       1       1       1       1       1

  7. sbit P47        =   P4^7;       //I/O口P4.7
  8. sbit P46        =   P4^6;       //I/O口P4.6
  9. sbit P45        =   P4^5;       //I/O口P4.5
  10. sbit P44        =   P4^4;       //I/O口P4.4
  11. sbit P43        =   P4^3;       //I/O口P4.3
  12. sbit P42        =   P4^2;       //I/O口P4.2
  13. sbit P41        =   P4^1;       //I/O口P4.1
  14. sbit P40        =   P4^0;       //I/O口P4.0

  15. sbit RST        =   P4^7;       //复位脚,可通过编程器设置
  16. sbit EX_LVD     =   P4^6;       //外部低压检测引脚

  17. sbit P4SPISCLK  =   P4^3;       //SPI总线的时钟脚
  18. sbit P4SPIMISO  =   P4^2;       //SPI总线的主出从入脚
  19. sbit P4SPIMOSI  =   P4^1;       //SPI总线的主入从出脚
  20. sbit P4SPISS    =   P4^0;       //SPI总线的从机选择脚

  21. sbit P4CEX1     =   P4^3;       //比较/捕获/PWM1外部引脚
  22. sbit P4CEX0     =   P4^2;       //比较/捕获/PWM0外部引脚
  23. sbit P4ECI      =   P4^1;       //比较/捕获/PWM模块的外部时钟输入脚(最大值为Fosc/2)

  24. sbit P4TXD2     =   P4^3;       //串口2数据输出脚
  25. sbit P4RXD2     =   P4^2;       //串口2数据输入脚

  26. sfr  P4SW       =   0xbb;       //P4口的功能开关        Bit7    Bit6    Bit5    Bit4    Bit3    Bit2    Bit1    Bit0
  27.                                 //位描述                -    LVD_P4.6 ALE_P4.5 NA_P4.4  -       -       -       -
  28.                                 //初始值=x000,xxxx      x       0       0       0       x       x       x       x

  29. #define P46EN       0x40        //传统的EA脚 0:为LVD的信号引入脚 1:为P4.6
  30. #define P45EN       0x20        //传统的ALE脚 0:仍为ALE 1:为P4.5
  31. #define P44EN       0x10        //传统的PSEN脚 0:无任何功能 1:为P4.4


  32. sbit P2_0 = P2^0;
  33. sbit P2_1 = P2^1;
  34. sbit P2_2 = P2^2;
  35. sbit P2_3 = P2^3;

  36. #define Ds_Bus P0
  37. #define smgp1 P1
  38. sbit DS_CS = P2^6;
  39. sbit DS_AS = P4^5;
  40. sbit DS_RW = P3^6;
  41. sbit DS_DS = P3^7;


  42. uchar count,shi,fen,miao,s1num,week=0,i,day=1,yue=1,year1=0,year2,year3,year4;
  43. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  44.                         0xf8,0x80,0x90};
  45. void delay(uchar i)
  46. {
  47.   uchar j,k;
  48.   for(j=i;j>0;j--)
  49.     for(k=125;k>0;k--);
  50. }

  51. //往DS12CR887写数据函数,add=地址,date=数据。

  52. void ds_write(uchar add,uchar date)         
  53. {
  54.         DS_CS=0; DS_DS=1; DS_RW=1; DS_AS=1;
  55.         Ds_Bus=add;
  56.          DS_AS=0; DS_RW=0;
  57.         Ds_Bus=date;
  58.         DS_RW=1; DS_AS=1; DS_CS=1;
  59. }
  60. //读取DS12CR887的数据函数
  61. uchar ds_read(uchar add)
  62. {
  63.         uchar z;
  64.         DS_AS=1; DS_DS=1;DS_RW=1;DS_CS=0;
  65.         Ds_Bus=add;
  66.         DS_AS=0;         DS_DS=0;
  67.    Ds_Bus=0xff;
  68.         z=Ds_Bus;
  69.         DS_DS=1; DS_AS=1; DS_CS=1;
  70.         return z;
  71. }
  72. //DS12CR887初始化函数
  73. void ds_int()
  74. {
  75.         DS_AS=0; DS_DS=0; DS_RW=0;
  76.         ds_write(0x0a,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
  77.         ds_write(0x0b,0x06);//寄存器B功能设置,不开启闹钟中断使能,数据模式为二进制,24小时模式。
  78. }

  79. void display()
  80. {
  81. // P1=(table[minute%10]& 0x7f); //加0X7F,是一个小数点
  82.            miao=ds_read(0);                         //读取DS12CR887的秒
  83.         //write1632GDRAM(7,2,num1632[sec/10]);
  84. //        write1632GDRAM(8,2,num1632[sec%10]);

  85. // miao=ds_read(0);
  86.    smgp1=(table[miao/10]);
  87.    P2_0 = 0;
  88.    delay(5);
  89.    P2_0 = 1;

  90.    smgp1=(table[miao%10]& 0x7f);
  91.    P2_1 = 0;
  92.    delay(5);
  93.    P2_1 = 1;

  94.    fen=ds_read(2);

  95.    smgp1=table[fen/10];
  96.    P2_2 = 0;
  97.    delay(5);
  98.    P2_2 = 1;

  99.     smgp1=table[fen%10];
  100.    P2_3 = 0;
  101.    delay(5);
  102.    P2_3 = 1;
  103.    
  104. }

  105. /*演示主程序*/
  106. void main(void)
  107. {
  108.     unsigned int  a;
  109.    
  110.         ds_int();                        //时钟芯片初始化
  111. while(1)
  112. {

  113.    for(a=100;a>0;a--)
  114.    {
  115.      display();
  116.    }

  117. }
  118. }

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版