找回密码
 注册
关于网站域名变更的通知
查看: 147|回复: 3
打印 上一主题 下一主题

基于51单片机的电子钟仿真程序(7个功能,具体功能见帖内介绍)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-23 09:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基本的时间与温度显示功能/时间校准/闹钟功能/秒表(开始、暂停、继续,记录一个秒表时间,秒表进行清零,长按显示记录的秒表时间)/倒计时(开始、暂停、继续,重新倒计时,倒计时清零)/12/24时显示选择
( T" s- M' M) x+ j% r因为各种中断的原因,这个电子钟本身去记录时间的功能已经被破坏掉了,后续应该可以在增加变量,去记录所经历的中断数,对于基础时钟的时间进行补偿,使其达到更加精准的效果。(不过那样又是得花费很多时间去计算所占用的时间啊什么的,实在是肝不动了)' Y; [- u/ Y; v. x
仿真原理图如下
+ q# o2 M' z& H( J# L. ~* ` 4 b1 P- V* b+ @7 m* R- v3 a$ N$ s9 `" L
7 W* u; u4 R5 ^. K9 V; n( @6 }
单片机源程序如下:
* }4 e& j5 s2 [% Q; A" \/ V
  • #include<reg52.h>
  • #include<absacc.h>
  • #include<stdio.h>
  • #include<intrins.h>
  • #define uchar unsigned char
  • #define uint  unsigned int
  • #define out P0
  • sbit RS=P2^0;
  • sbit RW=P2^1;
  • sbit E=P2^2;
  • sbit ctime=P3^2;//外部中断0,时间校准
  • sbit s_alARM=P3^3;//外部中断1,闹钟设定
  • sbit LED=P1^2;//低电平点亮
  • sbit P2_4=P1^1;//24时12时标记位,实在没办法了,data区已经用完了
  • //五个按键低电平有效,上下左右 确认 1234 0
  • void lcd_initial(void);
  • void lcd_initial2(void);
  • void check_busy(void);
  • void write_command(uchar com);
  • void write_data(uchar dat);
  • void string(uchar ad,uchar*s);
  • void delay(uint);
  • int read_keys(void);
  • void c_string(uchar ad,uchar *s);
  • void s_string(uchar ad,uchar s);
  • void write_time(void);
  • void inter_init(void);
  • void base_time(void);
  • void C_time(void);
  • void alarm(void);
  • void stopwatch(void);
  • void countdown(void);
  • void c_down(void);
  • void t24_12(void);
  • struct xwei
  • {
  •         uchar x_address;//显示屏的地址
  •         uchar* zhi;//指向传递值的指针
  • }wei[2][7];
  • struct zwei
  • {
  •         uchar x_address;//显示屏的地址
  •         uchar zhi;//存储值
  • };
  • uchar code mdays[12]={31,29,31,30,31,30,31,31,30,31,30,31};
  • uchar code weeks[7][5]={"Mon","Tues","Wed","Thur","Fri","Sat","Sun"};
  • uchar code tab1[]={"20  -  - "};
  • uchar code tab2[]={"  :  :    "};
  • uchar second[3]={53,55};//记录s//所有数值均以ASCII值表示
  • uchar minute[3]={53,57};//记录min
  • uchar hour[3]={50,51};//记录h
  • uchar day[3]={51,49};//记录日
  • uchar month[3]={49,50};//记录月
  • uchar year[3]={49,56};//记录年
  • uchar week=7;//记录星期几
  • uchar x=0,y=0;//光标位置
  • uchar a_p_m=0;//am,pm标记量
  • uchar pFlag=0;
  • uchar btFlag=1;//基本事件标记
  • uchar bpFlag=0;//基本校准标记
  • uchar bfFlag=0;//基本选择标记
  • uchar swFlag=0;//秒表标记
  • uchar cdFlag=0;//倒计时标记
  • uchar acFlag=0;//闹钟标记
  • uint timer=0;//中断记录变量
  • uint sd=0;//秒表,倒计时记录变量
  • uchar sdFlag=0;//毫秒级计时标记位
  • int  B_state_tag=-1;//按键状态标记位
  • //闹钟变量
  • struct zwei alarm_clock[4];
  • struct zwei TIME_clock[4];
  • void timer0() interrupt 1 using 1//基本时钟
  • {
  •         timer++;
  •         if(timer==10000)
  •         {
  •                 timer=0;
  •                 btFlag=1;
  •         }
  • }
  • void timer1() interrupt 3 using 1//秒表,倒计时时钟
  • {
  •         sd++;
  •         if(sd==800)//每100ms加加//由实际测试得出非计算值
  •         {
  •                 sd=0;
  •                 sdFlag=1;
  •         }
  • }
  • void int0() interrupt 0 using 0//时间校准
  • {
  •         bpFlag=1;
  • }
  • void int1() interrupt 2//功能选择
  • {
  •         bfFlag=1;//带选择
  •         EA=0;
  •         //TR0=0;
  •         pFlag=1;
  •         lcd_initial2();
  •         delay(1);
  •         write_command(0x01);
  •         delay(1);
  •         x=0;
  •         while(bfFlag)
  •         {
  •                 while(read_keys()==-1);//等待按键按下
  •                 B_state_tag=read_keys();
  •                 x=B_state_tag-1;//上下按键选择日期或者时间
  •                 while(bfFlag)//按键与显示屏操作
  •                 {
  •                         while(read_keys()==-1);
  •                         B_state_tag=read_keys();//读取按键值
  •                         while(read_keys()!=-1);
  •                         switch(B_state_tag)
  •                         {
  •                                 case 1://上
  •                                 {
  •                                         string(0x80,"alarm clock");
  •                                         acFlag=1;
  •                                 }break;
  •                                 case 2://下
  •                                 {
  •                                         string(0x80,"stopwatch");
  •                                         swFlag=1;
  •                                 }break;
  •                                 case 3://左
  •                                 {
  •                                         string(0x80,"countdown");
  •                                         cdFlag=1;
  •                                 }break;
  •                                 case 4://右
  •                                 {
  •                                         if(P2_4==0)
  •                                           P2_4=1;
  •                                         if(P2_4==1)
  •                                                 string(0xce,"  ");
  •                                         string(0x80,"24or12");
  •                                 }break;
  •                                 case 0://确认
  •                                 {
  •                                         bfFlag=0;
  •                                 }break;
  •                                 default:break;
  •                         }
  •                         while(read_keys()!=-1);
  •                 }
  •         }
  •         lcd_initial();
  •         inter_init();
  •         bfFlag=0;
  • }
  • //系统时钟为12MHZ
  • void main()
  • {
  •         P2_4=0;
  •         lcd_initial();
  •         inter_init();
  •         P1=0xff;//读取按键,先写入
  •         string(0x80,tab1);
  •         string(0xc0,tab2);
  •         while(1)
  •         {
  •                 if(swFlag==1)//秒表
  •                 {
  •                         for(x=1;x<=1;)//只执行一次清屏操作
  •                         {
  •                                 TR1=1;
  •                                 TH1=0x9C;//100us 中断一次
  •               TL1=0x9C;
  •                                 write_command(0x01);
  •                                 string(0x83,":");
  •                                 x=2;
  •                         }
  •                         stopwatch();
  •                 }
  •                 else
  •                 {
  •                         write_time();
  •                 }
  •                 if(cdFlag==1)//倒计时
  •                 {
  •                         for(x=1;x<=1;)//只执行一次清屏操作
  •                         {
  •                                 write_command(0x01);
  •                                 string(0x83,":");
  •                                 countdown();
  •                                 TH1=0x9C;//100us 中断一次
  •               TL1=0x9C;
  •                                 x=2;
  •                         }
  •                         countdown();
  •                         c_down();
  •                 }
  •                 else
  •                 {
  •                         write_time();
  •                 }
  •                 if(btFlag==1)
  •                 {
  •                         base_time();
  •                 }
  •                 if(bpFlag==1)
  •                 {
  •                         C_time();
  •                 }
  •                 if(acFlag==1)
  •                 {
  •                         LED=1;
  • ……………………
    $ G' W6 t2 l* C; s& _3 s( `. B) E

3 |+ ~% ~$ P7 z9 v
) n" w6 y8 J3 R. g7 E# C

* ^/ h9 R4 L. Q" j8 @5 r

该用户从未签到

2#
发表于 2022-6-23 11:05 | 只看该作者
你这个程序,保熟吗??

点评

(*^▽^*)。||ヽ(* ̄▽ ̄*)ノミ|Ю  详情 回复 发表于 2022-6-23 13:45

该用户从未签到

3#
发表于 2022-6-23 13:45 | 只看该作者
Maskman 发表于 2022-6-23 11:05
) \- c$ O. [& N9 v& }5 T8 H5 b. b你这个程序,保熟吗??
1 r, e; k) a2 b5 h8 }
(*^▽^*)。||ヽ(* ̄▽ ̄*)ノミ|Ю  I' v4 y1 `; H

该用户从未签到

4#
发表于 2022-6-23 13:58 | 只看该作者
从哪入手,比较容易学习??( a2 i; C6 ]; z. o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-29 09:46 , Processed in 0.109375 second(s), 30 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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