使用C语言进行单片机电子时钟课程设计

发布者:心想的45号最新更新时间:2019-12-06 来源: 51hei关键字:C语言  单片机  电子时钟 手机看文章 扫描二维码
随时随地手机看文章

第一章 设计目的及要求

1.目的

通过对电子时钟系统进行编程与Protues仿真,进一步掌握单片机的组成,P1、P0、P2、P3口的应用,蜂鸣器的应用,定时中断程序的编写及应用,对之前学习的单片机课程进行回顾与应用;初步掌握Protues仿真方法以及用keil软件编写程序的方法。
2.题目与要求

本次课程设计的题目为:电子时钟的设计,其具体要求为:
(1)能实现时、分、秒的显示;
(2)能实现12、24小时制的切换;
(3)能设定时间;
(4)能设定闹钟;
整个系统要设计键盘和显示器,利用单片机内部时钟完成定时器的定时设计。

第二章 理论基础

1.AT89C52芯片

AT89C52芯片的引脚图如图1所示。

图1 AT89C52芯片引脚

其中主要应用到的引脚口介绍:

(1)P0口的第一功能是作为一般I/O口使用,第二功能是在CPU访问外部存储器时,分时提供低8位地址和8位双向数据。

(2)P1口是8位准双向I/O口,51子系列中P1只能用作一般I/O口,52子系列中P1.0和P1.1引脚还具有第二功能。

(3)P2口是8位准双向I/O口,第二功能是在CPU访问外部存储器时,作为高8位地址总线,输出高8位地址。

(4)P3口是8位准双向I/O口,其第一功能是用作一般I/O口,第二功能是作为中断信号和外部数据存储器的读写控制信号。

(5)RES,复位信号高电平有效。

2.Keil的简单介绍

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。此处简单介绍一下Keil 工程的建立等,以Keil μVision2界面为例。

(1)建立一个工程,选择菜单栏中的【Project】下的【New Project】,菜单栏如图2所示。

图2 菜单栏

(2)选择工程要保存的路径并且输入工程名,以电子时钟工程的建立为例,如图3所示。

图3 “保存新工程”对话框

(3)选择系统要用的单片机如图4(a)所示,选择添加启动文件如图4(b)所示。

图4(a)“选择单片机”对话框

图4(b)“添加启动文件”对话框

(4)建立文件,选择菜单【File】下的【New】,出现界面如图5所示。

图5 新建文件界面

(5)保存文件为“*.c”文件,并且添加文件到所建的工程下,保存文件截面图如图6所示,添加文件显示界面如图7所示,右键点击SourceGroup添加。

图6 保存文件界面

图7 添加文件界面

3.Protues的简单介绍

Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件,它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具,可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。

(1)Keil中生成*.HEX的界面如图8所示。

图8 生成HEX文件界面

(2)Protues中加载HEX文件,在Protues界面中双击AT89C51芯片,所示界面如图9所示。

              图9 加载HEX文件界面

第三章 设计原理以及方案

1.系统总体框图

本电子时钟主要由单片机、键盘、数码管显示接口电路、蜂鸣器电路和复位电路构成,设计的总体方案如图10所示:

图10 总体方案

2.硬件电路

2.1晶振电路

晶振电路如图11所示。

图11 晶振电路

2.2复位电路

复位电路如图12所示。

图12 复位电路

2.3蜂鸣器电路

蜂鸣器电路如图13所示。

图13 蜂鸣器电路

2.4数码管显示电路

数码管显示电路如图14所示。

图14 数码管显示电路

2.5键盘电路

键盘电路如图15所示。

图15 键盘电路

2.6总体电路

在Protues中仿真的总体电路图如图16所示。

图16 总体电路

3.软件系统设计

3.1单片机的使用情况

设计电子时钟使用单片机资源的情况如下:

P0口输出数码管段选信号,P2口输出数码管位选信号;调整功能选择键kgnxz:P3.0口,通过其选择调整时钟还是调整闹钟;调整秒 ksec:P3.1口,按一次使秒加1;调整分kmin:P3.2;按一次使分加1;调整小时khour:P3.3口,按一次使时加1;12与24小时制的转换键kzh:P3.4,默认24小时制,按一次键之后转换为12小时制。具体如下:

(1)实现基本的走时间和显示时间的时、分、秒,上电自动显示初始时间00-00-00。

(2)当第一次按下第一个弹性按键时进入时间的调节状态,按下第二个按键时实现秒的加一调节,按下第三个按键时实现分的加一调节,按下第四个按键时实现小时的加一调节。

(3)当第二次按下第一个弹性按键时进入闹钟的调节状态(闹钟初始值设定为01-00-30),按下第二个按键时实现秒的加一调节,按下第三个按键时实现分的加一调节,按下第四个按键时实现小时的加一调节。

(4)当第三次按下第一个弹性按键时进入原显示时间的状态。

(5)按下第五个按键时实现24到12小时制的转换。

(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态。

3.2软件系统的各个模块

时钟系统的软件设计主要采用以下基本模块来实现,主程序、定时中断服务程序、键盘扫描程序模块、时钟显示模块、闹钟显示模块、转换模块、延时模块和蜂鸣器模块。

主程序:对中断程序初值进行设定,在各种情况下对子函数的调用,保证整个程序的顺序执行。

定时中断服务程序:用于电子时钟的准确运行。

键盘扫描程序模块:用于确定按键并在按键按下时调用相应的程序进行显示。

时钟显示模块:用于显示正常走表的时间。

闹钟显示模块:用于显示设定闹钟的时间。

转换模块:用于将默认的24小时制转换为12小时制。

延时模块:程序中调用延时子程序,用于按键消抖动,数码管消影等。

蜂鸣器模块:用于在设定的闹钟时间与走表的时间相等时,闹钟响起。

3.3软件系统程序流图

主程序的顺序流图如图17所示。

图17 主程序顺序流图

显示程序的顺序流图如图18所示。

图18 显示程序顺序流图

中断程序的顺序流图如图19所示。

图19 中断程序顺序流

第四章 仿真结果与分析

1.仿真结果

上电走表仿真结果图如图20所示。

图20 上电之后走表仿真结果图

按下一次kgnxz键,再分别调整时、分、秒各按键,使得显示时间为15-15-15仿真结果图如图21所示。

图21 调整时分秒仿真结果图

按下kzh键,使得显示时间为03-15-19仿真结果图如图22所示。

图22 24小时制转换为12小时制仿真结果图

按下第二次kgnxz键,再分别调整时、分、秒各按键,即调整的便是闹钟的设定时间(初始设定为01-00-30),仿真结果图如图23所示。

图23 闹钟显示仿真结果图

调整闹钟的设定时间为03-20-30,仿真结果图如图24所示。

图24 闹钟调整显示仿真结果图

按下第三次kgnxz键时,显示走表的时间,并且在到达设定的闹钟时间时蜂鸣器发出声音,即在蜂鸣器发声过程中P1.0口会由原高电平变为低电平,仿真结果图如图25所示。

图25 蜂鸣器发声仿真图

2.仿真结果分析

让手机中的秒表与Protues仿真中的秒同时开始,可以发现他们几乎是同步的(由于个人反应导致按下手机秒表瞬间有微小误差)。而闹钟设定值是完全没有误差的,当时间与设定闹钟时间完全相等时蜂鸣器就会发声。

第五章 总结

本次课程设计利用Keil以及Protues软件,完成了电子时钟系统的程序编写与电路图搭建,并对所设计的电子时钟系统进行了仿真测试。

完成本次课程设计的过程,经历了兴奋、自信、失落、奋发、所悟、完成几个过程。刚开始做课程设计时,仔细阅读设计的题目和要求,想到理论课学得也还差不多,以为没什么太大困难,所用的知识书上都有,各部分程序大都可以参考课本例题完成。开始前两天我就熟悉课本,参考课本内容在稿纸上把自己的思路和各部分程序写了下来,然后就是衔接起来在Keil中编写。经过三天的努力,毫无结果。埋头苦干的过程是痛苦的,尤其是在按自己觉得理论上合理的算法和程序做完,发现根本显示不了的时候,是迷茫,烦躁的。在第三天下午参考别人只是显示出来走表就可以的程序,并且接受别人建议按一步一步调试去编写的情况下,编写运行找错地不断循环中,终于在第五天完善了程序。

通过这次课程设计,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。学习理论课时也是有实践课的,但当时自己只是追求明白课本例题的程序,几乎很少在Protues上去画例题中的仿真图,导致自己对Protues的应用不熟悉,而且也没深入想过课本上那些小的程序之间的联系应用。所以学习知识不能太局限于理论,要与实践结合。学会了单片机的一般设计过程,通常都要进行系统扩展与配置,因此,要完成一个单片机的设计工作,必须依次做到下述工作:

  • 硬件电路的设计、组装与调试;

  • 应用软件的编写、调试;

  • 完整应用软件的调试、固化和脱机运行。

而在进行硬件系统设计时我们应当尽量做到:

  • 尽可能的选择典型电路,并符合单片机的常规使用方法;

  • 在充分满足系统功能要求前提下,留余地以便于二次开发;

  • 硬件结构设计应与软件设计方案一并考虑;

  • 整个系统相关器件要力求性能的匹配;

  • 硬件上要有可靠性与抗干扰设计;

  • 充分考虑单片机的带载驱动能力。

所以我用单片机编写了上面的程序,因为基础知识学的不怎么好,如有错误之处,还望老师理解,并加以批改。通过这次设计使我对单片机有了更深入的了解。培养了我的动手实践能力。



PCB原理图


单片机源程序如下:

#include

#include

#include

sbit kgnxz=P3^0; //功能选择键,按一次设定时间,按两次设定闹钟时间,按三次又显示时间表  

sbit ksec=P3^1;//调整秒

sbit kmin=P3^2;//调整分

sbit khour=P3^3;//调整时

sbit kzh=P3^4;//24与12小时制转换

sbit bear=P1^0;//蜂鸣器控制口

unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按键的计数

               secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定义存储时间和闹钟时分秒的个位和十位

unsigned int num=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定义时间和闹钟的时分秒

unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口

void keyscan();//键盘扫描函数

void display();//时钟显示函数

void display1();//闹钟显示函数

void clock();//闹钟函数即蜂鸣器函数

/***延时函数****/

void delay(unsigned char z)

{unsigned char x,y;

  for(x=z;x>0;x--)

   for(y=255;y>0;y--);

}

/***中断函数****/

void time0() interrupt 1

{num++;

TH0=(65536-50000)/256; 

TL0=(65536-50000)%256;

if(num==20)

   {num=0; 

    sec++;

    if(sec==60)

     {sec=0;

      min++;

      if(min==60)

        {min=0;

         hour++;

         if(hour==24)

           {hour=0;

            }

         }

      }

  display(); }

}

/******时钟显示函数******/

void display()

{

secge=sec%10;

secshi=sec/10;

minge=min%10;

minshi=min/10;

hourge=hour%10;

hourshi=hour/10;

P2=0xfe;

P0=table[secge];

delay(5);

P2=0xfd;

P0=table[secshi];

delay(5);

P2=0xfb;

P0=0x40;

delay(5);

P2=0xf7;

P0=table[minge];

delay(5);

P2=0xef;

P0=table[minshi];

delay(5);

P2=0xdf;

P0=0x40;

delay(5);

P2=0xbf;

P0=table[hourge];

delay(5);

P2=0x7f;

P0=table[hourshi];

delay(5);

}

/*****闹钟显示函数****/

void display1()

{

secge1=sec1%10;

secshi1=sec1/10;

minge1=min1%10;

minshi1=min1/10;

hourge1=hour1%10;

hourshi1=hour1/10;

P2=0xfe;

P0=table[secge1];

delay(10);

P2=0xfd;

P0=table[secshi1];

delay(15);

P2=0xfb;

P0=0x40;

delay(15);

P2=0xf7;

P0=table[minge1];

delay(15);

P2=0xef;

P0=table[minshi1];

delay(15);

P2=0xdf;

P0=0x40;

delay(15);

P2=0xbf;

P0=table[hourge1];

delay(15);

P2=0x7f;

P0=table[hourshi1];

delay(15);

}

/*****键盘扫描*********/

void keyscan()

{if(kgnxz==0)     //功能选择键是否按下 

    {  delay(10);//延时消抖             

        if(kgnxz==0)//再次判断键是否按下              

          {flag++;}        //计数,功能选择键按键次数加一          

          while(!kgnxz);} //释放键  

   if(flag==1)//功能选择键

   {if(ksec==0)//秒调整键

   {delay(10);//延时消抖        

    if(ksec==0)//再次判断键是否按下

      {sec++;//秒加加

       if(sec>=60)//如果秒大于60

       sec=0;//秒清零

       }

  while(ksec==0)//释放键

  display();}

  if(kmin==0)

    {delay(10);

     if(kmin==0)

       {min++;

        if(min>=60)

        min=0;

        }

  while(kmin==0)

  display();

     }

  if(khour==0)

    {delay(10);

     if(khour==0)

       {hour++;

        if(hour==24)

        hour=0;

        }

  while(khour==0)

  display(); 

  }

}

if(flag==2)//闹钟调整

     {if(ksec==0)

        {delay(5);

         if(ksec==0)

          {sec1++;

          if(sec1==60)

           sec1=0;}

           while(!ksec)

           {display1();delay(50);}                  

             }

          if(kmin==0)

         {delay(5);

           if(kmin==0)

             {min1++;

             if(min1==60)

               min1=0;}

           while(!kmin)

                   {display1();}

                 }

       if(khour==0)

         {delay(5);

            if(khour==0)

             {hour1++;

             if(hour1==24)

              hour1=0;}

             while(!khour)

             {display1();} } }}

/*****蜂鸣器*********/

void clock()

   {    unsigned int i;

       for(i=1000;i>0;i--)

        {bear=1;

                P1=0xfe;

                delay(10);

                bear=0;

                P1=0xff;

……………………



关键字:C语言  单片机  电子时钟 引用地址:使用C语言进行单片机电子时钟课程设计

上一篇:51单片机旋转led(POV-LED)显示系统设计报告与代码
下一篇:zlg7289键盘和数码管驱动程序+应用电路

推荐阅读最新更新时间:2024-11-08 13:44

更耐用,ST推出新型STM32L4微控制器
意法半导体的 STM32L412和STM32L422 微控制器(MCU)以功能专一和封装紧凑为特色,为注重成本预算的消费类、工业和医疗应用带来超低功耗技术和优异的处理性能。 新微控制器为设计人员提供了更大的发挥空间,突破各种设计资源的制约,不论是内核性能和能耗限制,还是空间尺寸和物料清单成本限制。通过整合采用意法半导体的FlexPowerControl(FPC)技术经济合算的64KB或128KB闪存和80MHzArm®Cortex®-M4处理器内核,新微控制器的能效和性能达到了同级产品中最佳的EEMBC®测试成绩:273CoreMark® 可提升智能传感器或消费类穿戴设备的处理速度,同时167 ULPMark™-PP(P
[嵌入式]
更耐用,ST推出新型STM32L4<font color='red'>微控制器</font>
51单片机汇编语言子程序调用指令RET RETI
控制转移 指令 用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移 指令 相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 . 子程序调用指令(1条) 子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 LCALL
[单片机]
8051单片机实战分析(以STC89C52RC为例) | 08 - 矩阵按键驱动
1 矩阵键盘 矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。 最常见的键盘布局如图所示。一般由16个按键组成,在单片机中正好可以用一个P1实现16个按键功能,这也是在单片机系统中最常用的形式。 4*4矩阵键盘的电路如图所示: 工作原理: 当无按键闭合时,P10~P13与P14~P17之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。 判断有无按键按下的方法是: ① 设置列线P10~P13为输入状态,从行线P14~P17输出低电平
[单片机]
8051<font color='red'>单片机</font>实战分析(以STC89C52RC为例) | 08 - 矩阵按键驱动
STC89C51单片机流水灯程序
由于程序花样显示比较复杂,所以完全可以通过查表得方式编写程序,简单。如果想显示不同的花样,只需要改写表中的数据即可。 流水灯程序: #include reg51.h #define uint unsigned int #define uchar unsigned char const table ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(uint z) //delay 1ms { uint x,y; for(x=z;x 0;x--) for(y=124;y 0;y--); } void main(void) { uchar x;
[单片机]
STC89C51<font color='red'>单片机</font>流水灯程序
AVR单片机uPD6121/AS6122等红外编码芯片的解码程序
#include #define uchar unsigned char #define ulong unsigned long /*------------------------------显示-----------------------------------*/ #define LED _DATA PORTB const uchar tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; /* 0 1 2 3 4 5 6 7 8 9 A B C
[单片机]
如何设置51单片机的串行口来实现与PC机通信
一、原理简介 51单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,
[单片机]
如何设置51<font color='red'>单片机</font>的串行口来实现与PC机通信
3μcos_II在InfineonC164CI十六位单片机上的移植实现
引 言 μc/osII功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是 μc/osII公开所有的源代码,90% 的代码使用标准的ANSIC语言书写,程序可读性强,移植性好,同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对μc/osII实时操作系统的学习研究、开发、应用具有重要意义。Infineon C164CI-8EM 处理器是一款非常优秀的16位单片机,CPU的体系片上集成了以部件:64KB OTP存储器,2KB 的片上RAM ,16位3/6通道PWM,8通道10位
[单片机]
3μcos_II在InfineonC164CI十六位<font color='red'>单片机</font>上的移植实现
Spansion 借助新型CAN FD拓展Traveo汽车微控制器产品家族
S6J3100系列提供高速带宽、低功耗和较高的安全性。 2014年7月1日,中国北京 –——全球行业领先的嵌入式市场闪存解决方案创新厂商 Spansion 公司(NYSE:CODE)今日宣布开始供应Spansion Traveo™汽车微控制器S6J3100系列的样品。该系列利用高性能的CAN FD接口来增强车载网络。家族中的新产品面向多种不同的汽车应用,其中包括车身控制模块(BCM)和供热通风与空调(HVAC)。 博世公司已在多年前开发出CAN标准,并且一直采用创新解决方案推动车载通讯。博世公司在2012年国际CAN大会上首次推出了CAN FD协议,该协议是对传统CAN技术的无缝升级。如同传统CAN技术,CAN FD
[汽车电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved