Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3123|回复: 21

20电信本3刘莹组:电子钟

[复制链接]

1

主题

8

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2022-11-3 21:01:19 | 显示全部楼层 |阅读模式
本帖最后由 Elva 于 2022-11-3 20:49 编辑

仿真负责人:刘莹
仿真图:

仿真文件:

代码:
  1. /* 常规显示“时分,时间正常跑,
  2. 按下按键S1启停,3次按下S1后开启;
  3. 初始化:时间-23小时59分20秒,  */
  4. #include<reg52.h>
  5. #include <elva_lcd1602.h>
  6. //
  7. //矩阵键盘IO定义
  8. sbit R1=P1^0;
  9. sbit R2=P1^1;
  10. sbit R3=P1^2;
  11. sbit R4=P1^3;

  12. sbit C4=P1^4;
  13. sbit C3=P1^5;
  14. sbit C2=P1^6;
  15. sbit C1=P1^7;
  16. //
  17. unsigned char S1_Flag;
  18. unsigned char S2_Flag;
  19. unsigned char S3_Flag;
  20. unsigned char S4_Flag;
  21. //数码管0-9
  22. unsigned char SMGNoDot_CA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  23. unsigned char code riqi[]="2022-11-02";
  24. unsigned char code ck[]="Clock";
  25. //定义变量
  26. unsigned char dat_xs=23;   //时钟
  27. unsigned char dat_fz=59;
  28. unsigned char dat_mi=20;
  29. unsigned char nn=0;
  30. unsigned char i;
  31. unsigned char dat_nxs=2;  //闹钟的
  32. unsigned char dat_nfz=3;
  33. unsigned char dat_nmi=4;
  34. //功能选择标志
  35. unsigned char SetPlace=0;
  36. //设置模式标志位   
  37. bit mod =0;
  38. //闹钟设置需要的标志位         
  39. bit alarmset=0 , alarm=0 ;      
  40. // lcd1602 0~9字码
  41. int num[10]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};  
  42. unsigned char  *time[]={&dat_mi,&dat_fz,&dat_xs};  //指针变量time存放进位标志位的地址,
  43.         //由于数组不能存放标量,但是却可以存放标量的地址,采用指针的方式来间接修改变量的值
  44. unsigned char *nao[]={&dat_nfz, &dat_nxs};        //存放闹钟值的数组

  45. unsigned char statk1=0;//界面
  46. unsigned char statk2=0;       
  47. unsigned char statk3=0;       
  48. unsigned char statk4=0;


  49. unsigned char changeT;         // 0为时钟显示,1为改变时,2为改变分,3为改变秒
  50. unsigned char changewarmT;     // 同上,但改变的为闹钟时间
  51. //函数定义
  52. void write_sfm(unsigned char add,unsigned char dat);
  53. void Delayk(unsigned char t)
  54. {
  55.         while(t--);
  56. }
  57. //===LCD显示时钟时分/分秒/界面
  58. void LCD_display()
  59. {
  60.                                        
  61.         //秒
  62.                 write_sfm(7,num[*time[0]/10]);
  63.                  Delayk(50);
  64.                 write_sfm(8,num[*time[0]%10]);
  65. //时钟模式
  66. //    if (alarmset==0)   
  67. //    {
  68.                write_sfm(4,num[*time[1]/10]);                 //分的十位
  69.                 Delayk(50);
  70.                 write_sfm(5,num[*time[1]%10]);      //分的个位  
  71.             Delayk(50);
  72.                 write_sfm(1,num[*time[2]/10]);                //时的十位
  73.                 Delayk(50);
  74.                 write_sfm(2,num[*time[2]%10]);
  75.                 Delayk(50);
  76. //    }
  77. ////闹钟设置模式
  78. //    if (alarmset==1)            //闹钟设置模式
  79. //    {
  80. //                write_sfm(4,num[*nao[0]/10]);                 //分的十位
  81. //                Delayk(50);
  82. //                write_sfm(5,num[*nao[0]%10]);      //分的个位  
  83. //            Delayk(50);
  84. //                write_sfm(1,num[*nao[1]/10]);                //时的十位
  85. //                Delayk(50);
  86. //                write_sfm(2,num[*nao[1]%10]);
  87. //                Delayk(50);       
  88. //        }                                               
  89. }
  90. //定时器相关的函数
  91. void Init_Timer0()
  92. {
  93.         TMOD=0x01;
  94.         TH0=(65536-50000)/256;
  95.         TL0=(65536-50000)%256;
  96.         ET0=1;
  97.         EA=1;
  98.         TR0=1;
  99. }
  100. void ServiceTimer0() interrupt 1
  101. {
  102.         TH0=(65536-50000)/256;
  103.         TL0=(65536-50000)%256;
  104.        
  105.         nn++;
  106.         if(nn==20)
  107.         {
  108.                 nn=0;
  109.                 dat_mi++;
  110.                 if(dat_mi==60)
  111.                 {
  112.                         dat_mi=0;
  113.                         dat_fz++;
  114.                         if(dat_fz==60)
  115.                         {
  116.                                 dat_fz=0;
  117.                                 dat_xs++;
  118.                                 if(dat_xs==24)
  119.                                 {
  120.                                         dat_xs=0;
  121.                                 }
  122.                                         write_sfm(1,num[*time[changeT]/10]);
  123.                                         Delayk(50);
  124.                                         write_sfm(2,num[*time[changeT]%10]);
  125.                         }
  126.                                         write_sfm(4,num[*time[changeT]/10]);
  127.                                         Delayk(50);
  128.                                         write_sfm(5,num[*time[changeT]%10]);
  129.                 }
  130.                 write_sfm(7,num[*time[changeT]/10]);
  131.                  Delayk(50);
  132.                 write_sfm(8,num[*time[changeT]%10]);
  133.         }       
  134. }

  135. //LCD1602
  136. void LcdShowInit()
  137. {
  138.     //颜文字
  139.     Write_1602com(0x80+1);
  140.         Write_1602dat(0x6f);
  141.     Write_1602com(0x80+2);
  142.         Write_1602dat(0x6f);
  143.     Write_1602com(0x80+3);
  144.         Write_1602dat(0x5f);
  145.     Write_1602com(0x80+4);
  146.         Write_1602dat(0x6f);
  147.         //日期
  148.         Write_1602com(0x80+6);
  149.         for(i=0;i<10;i++)
  150.         {
  151.                 Write_1602dat(riqi[i]);
  152.         }
  153.         //冒号       
  154.         lcdGoXY(1,3);
  155.         Write_1602dat(':');
  156.         lcdGoXY(1,6);          
  157.         Write_1602dat(':');
  158.         //英文字母
  159.         Write_1602com(0x80+0x40+11);
  160.         for(i=0;i<5;i++)
  161.         {
  162.                 Write_1602dat(ck[i]);
  163.         }
  164. }
  165. //==写时分秒函数
  166. void write_sfm(unsigned char add,unsigned char dat)
  167. {
  168.         unsigned char a;
  169.         a=dat;
  170.         Write_1602com(0x80+0x40+add);        //第er行
  171.         Write_1602dat(a);
  172. }
  173. //按键相关内容
  174. void ScanKeyMulti()
  175. {
  176. //======第一行=======
  177.         R1=0;
  178.         R2=R3=R4=1;               
  179.         C1=C2=C3=C4=1;       
  180.         if(C1==0)                           //S1
  181.         {
  182.                 Delayk(100);
  183.                 if(C1==0)
  184.                 {
  185.                         S1_Flag = 1;
  186.                 }while(C1==0);                       
  187.         }
  188.         else if(C2==0)
  189.         {
  190.                 S2_Flag=1;
  191.                 while(C2==0);
  192.         }
  193.         else if(C3==0)
  194.         {
  195.                 S3_Flag=1;
  196.                 while(C3==0);
  197.         }
  198.         else if(C4==0)
  199.         {
  200.                 S4_Flag=1;
  201.                 while(C4==0);
  202.         }

  203.         R2=0;             //第二行
  204.         R1=R3=R4=1;               
  205.         C1=C2=C3=C4=1;
  206.         if(C1==0)
  207.         {
  208.                 while(C1==0);                       
  209.         }
  210.         else if(C2==0)
  211.         {
  212.                 while(C2==0);
  213.         }
  214.         else if(C3==0)
  215.         {
  216.                 while(C3==0);
  217.         }
  218.         else if(C4==0)
  219.         {
  220.                 while(C4==0);
  221.         }
  222.         R3=0;
  223.         R2=R1=R4=1;               
  224.         C1=C2=C3=C4=1;
  225.         if(C1==0)
  226.         {
  227.                 while(C1==0);                       
  228.         }
  229.         else if(C2==0)
  230.         {
  231.                 while(C2==0);
  232.         }
  233.         else if(C3==0)
  234.         {
  235.                 while(C3==0);
  236.         }
  237.         else if(C4==0)
  238.         {
  239.                 while(C4==0);
  240.         }
  241.         R4=0;
  242.         R2=R3=R1=1;               
  243.         C1=C2=C3=C4=1;
  244.         if(C1==0)
  245.         {
  246.                 while(C1==0);                       
  247.         }
  248.         else if(C2==0)
  249.         {
  250.                 while(C2==0);
  251.         }
  252.         else if(C3==0)
  253.         {
  254.                 while(C3==0);
  255.         }
  256.         else if(C4==0)
  257.         {
  258.                 while(C4==0);
  259.         }
  260. }
  261. //====
  262. void main()
  263. {  
  264.         lcd_init();//液晶功能初始化
  265.         Init_Timer0(); //定时器初始化
  266.         LcdShowInit(); //初始显示
  267.         LCD_display();     //lcd1602显示时分秒
  268.         while(1)
  269.         {
  270.                 ScanKeyMulti();       
  271.                 if(S1_Flag==1)
  272.                 {
  273.                         S1_Flag=0;
  274.                         if (changewarmT == 0)  //设置
  275.                         {
  276.                                 changeT++;                //设置模式
  277.                                 if (changeT == 4)
  278.                                 {
  279.                                         changeT = 0;
  280.                                 }
  281.                                 if (changeT == 0)
  282.                                 {
  283.                                         TR0 = 1;
  284.                                 }
  285.                                 else
  286.                                 {
  287.                                         TR0 = 0;
  288.                                 }
  289.                         }
  290.                         if(S3_Flag==1)//加键
  291.                         {
  292.                                 S3_Flag=0;
  293.                                 if (changeT == 1)  //按K1按了一下           1为秒
  294.                                 {                  
  295.                                         (*time[changeT-1])++;
  296.                     if ((((*time[changeT-1]))>=60)&&(changeT == 1))
  297.                     {
  298.                         (*time[changeT-1])=0;            
  299.                     }
  300.                                         write_sfm(1,num[*time[changeT-1]/10]);
  301.                                     Write_1602com(0x80+0x40+1);
  302.                                         Delayk(50);
  303.                                         write_sfm(2,num[*time[changeT-1]%10]);//写入数据
  304.                                         Write_1602com(0x80+0x40+2);
  305.                                         //显示出来                                       
  306.                                 }
  307.                                 if (changeT == 2)
  308.                                 {
  309.                                         (*time[changeT-1])++;
  310.                     if (((*time[changeT-1]))>=60&&(changeT == 2))
  311.                     {
  312.                         (*time[changeT-1])=0;           //2分
  313.                     }                                       
  314.                                 }
  315.                                 if (changeT == 3)
  316.                                 {
  317.                                         (*time[changeT-1])++;
  318.                     if (((*time[changeT-1]))>=60&&(changeT == 3))
  319.                     {
  320.                         (*time[changeT-1])=0;            //为3时,设置10
  321.                     }                                       
  322.                                 }
  323.                         }
  324.                         //减键       
  325.                 }
  326.         }
  327. }

复制代码
目前进度:
仿真部分已经验证完毕,实现效果在LCD1602上显示时间,时,分,秒;可以复位;按键S1按下后停止,按三下时间开始;仿真所用程序由仿真负责人提供;
最后程序实现效果由程序负责人在验收之前下载到实物中的效果为准。(程序负责人目前只剩矩阵键盘部分)
遇到问题:
仿真程序的按键部分已经写了按键可以控制时间界面的加,但是效果并不能呈现出来,不知程序哪里问题









本帖子中包含更多资源

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

x
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2022-11-4 22:35:22 | 显示全部楼层
工作看起来做的不错,附上keil完整的打包程序吧,这样我就可以打开了。
回复

使用道具 举报

1

主题

8

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2022-11-5 11:47:48 | 显示全部楼层

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

8

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2022-11-5 11:49:35 | 显示全部楼层
gaohaikuo1 发表于 2022-11-4 22:35
工作看起来做的不错,附上keil完整的打包程序吧,这样我就可以打开了。 ...

老师,发了,这是我负责仿真的那部分程序;
至于整个电子钟程序已由程序员写出,到时候实物演示
回复

使用道具 举报

1

主题

8

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2022-11-5 11:53:06 | 显示全部楼层
Elva 发表于 2022-11-5 11:49
老师,发了,这是我负责仿真的那部分程序;
至于整个电子钟程序已由程序员写出,到时候实物演示 ...

发的压缩包在论坛上,不知道您可以看到么
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2022-11-6 07:34:18 | 显示全部楼层
看到了
回复

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2022-11-8 13:06:52 | 显示全部楼层
电子钟实验报告

本帖子中包含更多资源

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

x
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2022-11-8 23:07:07 | 显示全部楼层
仔细检查下,需要改的地方我做了标注,但是肯定还有类似的其他错误,多看多改

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2022-11-9 08:46:26 来自手机 | 显示全部楼层
gaohaikuo1 发表于 2022-11-8 23:07
仔细检查下,需要改的地方我做了标注,但是肯定还有类似的其他错误,多看多改 ...

好的,老师
回复

使用道具 举报

1

主题

8

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2022-11-9 19:08:12 | 显示全部楼层
老师,这是我们组实现的最后仿真效果,压缩包内有hex文件,您可以查看(功能如下:仿真开启,时间往前走,按下S4可进入调整时间,调整完毕后按下S1确定,退出时间设置;按下S8进入闹钟设置键,按下S1退出闹钟设置;S2和S3分别是加和减键)、
程序由程序负责人所写

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-8 11:26 , Processed in 0.060025 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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