找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2214|回复: 1
打印 上一主题 下一主题
收起左侧

单片机串口时钟仿真+程序设计 附虚拟串口软件下载

[复制链接]
跳转到指定楼层
楼主

本次设计要求设计一基于单片机控制的串行口调时时钟设计计,该数字钟能同时显小时,分钟和秒。并能对时钟进行设置。时钟开始显示为00时 00分,也就是数码管(或用液晶块)显示 00.00。秒信号用时的个位的小数点表示,秒信号(即小数点)在每秒钟的前半秒点亮,后半秒钟熄灭,秒信号每闪烁 60 次时“分”的计数加 1,秒计数变为 0。分计数加到 59分后,分钟再加 1,分计数变为 0,时计数加 1。依次类推,时钟最大的显示值为 23 小时 59分。只要确定了1秒的定时时间,其他位均以此为基准往上累加。   


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #define INT8U  unsigned char
  5. #define INT16U unsigned int
  6. #define FREQ         11059200        //振荡器频率11.0592MHz

  7. sbit K1=P1^7;
  8. sbit K2=P1^0;

  9.                                               //0   1    2    3   4    5    6    7    8    9   
  10. INT8U code SEG_CODE[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0X86,0xDB,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00 };
  11. INT8U R[] = {0,0,0,0,0,0};        
  12. INT8U S=0,F=0,M=0,k=0,flag=0,L=1;
  13. INT16U cnt=0,Judge=0;

  14. //-----------------------------------------------------------------
  15. // 延时程序
  16. //-----------------------------------------------------------------
  17. void delay_ms(INT16U x)
  18. {
  19.         INT8U t;   
  20.         while(x--)
  21.         for(t = 0; t<120; t++);
  22. }

  23. void Init_USART_uT1()
  24. {
  25.           TMOD=0x21;
  26.           SCON=0X50;                        
  27.         PCON=0x00;
  28.         TH0=(65536-50000)/256;
  29.         TL0=(65536-50000)%256;
  30.         TH1=TL1=0xfd;
  31.         TR1=1;
  32. }
  33. void Send()
  34. {
  35. INT8U *s="请依次输入时分秒!!!\r\n";
  36.   INT8U i=0;
  37.   while(s[i]!='\0')
  38.   {
  39.     SBUF=s[i++];
  40.         while(TI==0);
  41.         TI=0;
  42.   }
  43. }
  44. void Display()
  45. {
  46.         P2=0XFE;P0=SEG_CODE[S/10];delay_ms(1);
  47.         P2=0XFD;P0=SEG_CODE[S%10+10]; delay_ms(1);
  48.         P2=0XFB;P0=SEG_CODE[F/10];delay_ms(1);
  49.         if(M%2){P2=0XF7;P0=SEG_CODE[F%10+10];}
  50.         else   {P2=0XF7;P0=SEG_CODE[F%10];}delay_ms(1);           

  51. }
  52. void keyscan()
  53. {
  54.    if(K1==0)
  55.    {
  56.       delay_ms(5);
  57.           if(K1==0)
  58.           {
  59.             flag=1;        
  60.                  while(!K1);
  61.           }
  62.    }
  63.    if(K2==0)
  64.    {
  65.       delay_ms(5);
  66.           if(K2==0)
  67.           {
  68.              flag=2;               
  69.                  while(!K2);
  70.           }
  71.    }
  72. }
  73. //-----------------------------------------------------------------
  74. // 主程序
  75. //-----------------------------------------------------------------
  76. void main()
  77. {
  78.    EA=1;
  79.    EX0=1;
  80.    IT0=1;
  81.    ET0=1;
  82.    TR0=1;
  83.    ES=1;  
  84.    Init_USART_uT1();
  85.    Send();
  86.    while(1)
  87.    {
  88.          keyscan();
  89.          Display();
  90.          if(flag==2)
  91.          {
  92.            TR0=0;
  93.          }
  94.          if(flag==1)
  95.          {
  96.                 TR0=1;
  97.          }


  98.    }
  99. }
  100. //-----------------------------------------------------------------
  101. // 串口接收中断
  102. //-----------------------------------------------------------------
  103. void receive_4_digit() interrupt 4
  104. {
  105.          static  INT8U i=0;
  106.          INT8U c;
  107.          if(RI)
  108.          {
  109.             RI=0;
  110.                 flag=2;
  111.                 c=SBUF;
  112.                 if(c=='#')i=0;
  113.                 else if(c>='0'&&c<='9')
  114.                 {
  115.                    R[i++]=c-'0';           
  116.                    S=R[0]*10+R[1];
  117.                    F=R[2]*10+R[3];
  118.                    M=R[4]*10+R[5];
  119.                    if(i==6)i=0;
  120.                 }
  121.          }
  122. }
  123. void Time0()interrupt 1
  124. {
  125.         TH0=(65536-50000)/256;
  126.         TL0=(65536-50000)%256;
  127.         ++cnt;        
  128.         if(cnt==20)
  129.         {
  130.           cnt=0;
  131.           Judge++;
  132.           if(Judge==10&&L==1)
  133.           {
  134.                     flag=1;
  135.                  L=2;
  136.           }
  137.          
  138.           if(flag==1)
  139. ……………………

  140. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:附虚拟串口软件
串口通讯.zip (7.81 MB, 下载次数: 70)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2019-4-17 02:05 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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