本次设计要求设计一基于单片机控制的串行口调时时钟设计计,该数字钟能同时显小时,分钟和秒。并能对时钟进行设置。时钟开始显示为00时 00分,也就是数码管(或用液晶块)显示 00.00。秒信号用时的个位的小数点表示,秒信号(即小数点)在每秒钟的前半秒点亮,后半秒钟熄灭,秒信号每闪烁 60 次时“分”的计数加 1,秒计数变为 0。分计数加到 59分后,分钟再加 1,分计数变为 0,时计数加 1。依次类推,时钟最大的显示值为 23 小时 59分。只要确定了1秒的定时时间,其他位均以此为基准往上累加。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #define INT8U unsigned char
- #define INT16U unsigned int
- #define FREQ 11059200 //振荡器频率11.0592MHz
- sbit K1=P1^7;
- sbit K2=P1^0;
- //0 1 2 3 4 5 6 7 8 9
- 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 };
- INT8U R[] = {0,0,0,0,0,0};
- INT8U S=0,F=0,M=0,k=0,flag=0,L=1;
- INT16U cnt=0,Judge=0;
- //-----------------------------------------------------------------
- // 延时程序
- //-----------------------------------------------------------------
- void delay_ms(INT16U x)
- {
- INT8U t;
- while(x--)
- for(t = 0; t<120; t++);
- }
- void Init_USART_uT1()
- {
- TMOD=0x21;
- SCON=0X50;
- PCON=0x00;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=TL1=0xfd;
- TR1=1;
- }
- void Send()
- {
- INT8U *s="请依次输入时分秒!!!\r\n";
- INT8U i=0;
- while(s[i]!='\0')
- {
- SBUF=s[i++];
- while(TI==0);
- TI=0;
- }
- }
- void Display()
- {
- P2=0XFE;P0=SEG_CODE[S/10];delay_ms(1);
- P2=0XFD;P0=SEG_CODE[S%10+10]; delay_ms(1);
- P2=0XFB;P0=SEG_CODE[F/10];delay_ms(1);
- if(M%2){P2=0XF7;P0=SEG_CODE[F%10+10];}
- else {P2=0XF7;P0=SEG_CODE[F%10];}delay_ms(1);
- }
- void keyscan()
- {
- if(K1==0)
- {
- delay_ms(5);
- if(K1==0)
- {
- flag=1;
- while(!K1);
- }
- }
- if(K2==0)
- {
- delay_ms(5);
- if(K2==0)
- {
- flag=2;
- while(!K2);
- }
- }
- }
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- EA=1;
- EX0=1;
- IT0=1;
- ET0=1;
- TR0=1;
- ES=1;
- Init_USART_uT1();
- Send();
- while(1)
- {
- keyscan();
- Display();
- if(flag==2)
- {
- TR0=0;
- }
- if(flag==1)
- {
- TR0=1;
- }
- }
- }
- //-----------------------------------------------------------------
- // 串口接收中断
- //-----------------------------------------------------------------
- void receive_4_digit() interrupt 4
- {
- static INT8U i=0;
- INT8U c;
- if(RI)
- {
- RI=0;
- flag=2;
- c=SBUF;
- if(c=='#')i=0;
- else if(c>='0'&&c<='9')
- {
- R[i++]=c-'0';
- S=R[0]*10+R[1];
- F=R[2]*10+R[3];
- M=R[4]*10+R[5];
- if(i==6)i=0;
- }
- }
- }
- void Time0()interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ++cnt;
- if(cnt==20)
- {
- cnt=0;
- Judge++;
- if(Judge==10&&L==1)
- {
- flag=1;
- L=2;
- }
-
- if(flag==1)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:附虚拟串口软件
串口通讯.zip
(7.81 MB, 下载次数: 70)
|