51单片机学习笔记,简易时钟

发布者:DreamyEclipse最新更新时间:2017-02-19 来源: eefocus关键字:51单片机  简易时钟 手机看文章 扫描二维码
随时随地手机看文章

使用芯片STC89C52RC, 2个锁存器

6个带小数点共阴极数码管显示一个24时制时钟

没有时钟芯片,所以掉电后时间会复位

原理图为TX-1C开发板

 

暂时显示了半小时,一秒不差,

未验证有无其他bug,代码贴上来,欢迎高手指点

 

 

==============================

最终显示的<时.分.秒>是 16.31.37  形式

C代码  收藏代码

  1. #include   

  2. #include "MY51.H"  

  3.   

  4. void show();  

  5. uint8  shi=15;   //初始时间15:45:00  按复位按钮对时  

  6. uint8  fen=45;  

  7. uint8  miao=0;  

  8.   

  9. void main()       

  10. {  

  11.     startT0(1000);  //开始定时器  

  12.     while(1)  

  13.     {         

  14.         show();  

  15.     }  

  16. }  

  17.   

  18. void show()  //显示时钟  

  19. {  

  20.     uint8 oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela; //oneWela是最左边的数码管  

  21.     sixWela =miao%10;  

  22.     fiveWela=miao/10;     

  23.     foreWela=fen%10;  

  24.     threeWela=fen/10;  

  25.     twoWela=shi%10;  

  26.     oneWela=shi/10;  

  27.     displaySMG(oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela,0xf5); //0xf5小数点位置  

  28. }  

  29.   

  30. void T0_Work()  //T0定时器调用的工作函数  

  31. {    

  32.    miao++;  

  33.     if(miao>59)  

  34.     {  

  35.         miao=0;  

  36.         fen++;  

  37.     }  

  38.   

  39.     if(fen>59)  

  40.     {  

  41.         fen=0;  

  42.         shi++;  

  43.     }   

  44.       

  45.     if(shi>23)  

  46.     {  

  47.         shi=0;  

  48.     }  

  49. }  

 

 

C代码  收藏代码

  1. #ifndef _MY51_H_  

  2. #define _MY51_H_  

  3. #include   

  4. #include   

  5.   

  6. typedef int                 int16  ;  

  7. typedef int                 INT16  ;  

  8. typedef unsigned int    uint16 ;  

  9. typedef unsigned int    UINT16 ;  

  10. typedef unsigned short  uint ;  

  11. typedef unsigned short  UINT ;  

  12. typedef unsigned short  word ;  

  13. typedef unsigned short  WORD ;  

  14. typedef unsigned long   uint32 ;  

  15. typedef unsigned long   UINT32 ;  

  16. typedef unsigned long   DWORD ;  

  17. typedef unsigned long   dword ;  

  18. typedef signed long    int32     ;  

  19. typedef signed long    INT32  ;  

  20. typedef float                   float32  ;  

  21. typedef double              double64  ;  

  22. typedef signed char     int8 ;  

  23. typedef signed char         INT8 ;  

  24. typedef unsigned char   byte ;  

  25. typedef unsigned char    BYTE    ;      //WINDOWS的windef.h里面是这么定义的  

  26. typedef unsigned char   uchar ;  

  27. typedef unsigned char   UCHAR ;  

  28. typedef unsigned char   UINT8 ;  

  29. typedef unsigned char   uint8 ;  

  30. typedef unsigned char   BOOL     ;      //windows中定义BOOL为int  

  31. typedef unsigned char   bool     ;          //bool是c++的内置类型  

  32.   

  33. #define TRUE     1  

  34. #define true     1  

  35. #define FALSE    0  

  36. #define false    0  

  37.   

  38. #define open     1    //open和close用于 标志打开和关闭状态  

  39. #define OPEN     1  

  40. #define close    0  

  41. #define CLOSE    0  

  42. #define lock     0  

  43. #define start    1  

  44. #define START    1  

  45. #define stop     0  

  46. #define STOP     0  

  47.   

  48. uint8    dulaIndex=0;       //数码管0~F段编码索引号  

  49. uint8    welaIndex=0;       //0~5位的数码管位索引号  

  50.   

  51. sbit dula =P2^6;  //段选锁存器控制  控制笔段  

  52. sbit wela =P2^7;  //位选锁存器控制  控制位置  

  53.   

  54. #define led P1    //灯总线控制  

  55. sbit led0=P1^0;   //8个led灯  

  56. sbit led1=P1^1;  

  57. sbit led2=P1^2;  

  58. sbit led3=P1^3;  

  59. sbit led4=P1^4;  

  60. sbit led5=P1^5;  

  61. sbit led6=P1^6;  

  62. sbit led7=P1^7;  

  63. sbit keyS2=P3^4; //4个独立按键  

  64. sbit keyS3=P3^5;  

  65. sbit keyS4=P3^6;  

  66. sbit keyS5=P3^7;  

  67.   

  68. void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);   

  69. void delayms(uint16 ms);  

  70. void T0_Work();  

  71. //////////////////////////////////////////////////////////////////////////  

  72. void delayms(uint16 ms)  //软延时函数  

  73. {  

  74.     uint16 i,j;  

  75.     for(i=83;i>0;i--)  

  76.     {  

  77.         for(j=ms;j>0;j--)  

  78.         {}  

  79.     }  

  80. }  

  81.   

  82. ///////////////////////////////////////////////////////////////////////////  

  83. #define dark    0x11  //也就是索引第17号元素0x00,共阴极数码管正极全部输入低电平  

  84. uint8 code table[]= {           //0~F外加小数点和空输出的数码管编码  

  85.  0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3  

  86.  0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7  

  87.  0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B  

  88.  0x39 , 0x5e , 0x79 , 0x71 , // C D E F  

  89.  0x80 , 0x00                 // . 空     空时是第0x11号也就是第17号元素  

  90.  };  

  91.   

  92. /////////////////////////////////////////////////////////////////////////////  

  93. uint8   TH0Cout=0 ;     //初值      

  94. uint8   TL0Cout=0 ;      

  95. uint16  T0IntCout=0;     //中断计数  

  96. uint16  T0IntCountAll=0; //(N-1)/65536+1;  //总中断次数  

  97. bool    bT0Delay=false;  //使用延时函数标志,初始未用  

  98. bool    bT0Over=false;   //中断处理函数执行结果之一  

  99.   

  100. void startT0(uint32 ms)  //开启定时器  

  101. {     

  102.     float32   t=ms/1000.0;               //定时时间  

  103.     double64    fox =11.0592*(pow(10,6));  //晶振频率  

  104.     uint32    N=(t*fox)/12 ;                 //定时器总计数值  

  105.   

  106.     TH0Cout =(65536-N%65536)/256;        //装入计时值零头计数初值  

  107.     TL0Cout =(65536-N%65536)%256;  

  108.     T0IntCountAll=(N-1)/65536+1;             //总中断次数  

  109.     TMOD=TMOD | 0x01;                        //设置定时器0的工作方式为1  

  110.       

  111.     EA =open;   //打开总中断  

  112.     ET0=open;   //打开定时器中断  

  113.   

  114.     TH0=TH0Cout;  //定时器装入初值  

  115.     TL0=TL0Cout;  

  116.     TR0=start;   //启动定时器  

  117. }  

  118.   

  119. void delayT0(uint32 ms)     //硬延时函数,自己乱写的不好用,求指点  

  120. {  

  121.     startT0(ms);                //启动定时器  

  122.     bT0Delay=true;          //告诉T0定时器,起用延时模式  

  123.     while(bT0Over==false);  //时间没到的话继续检测  

  124.     bT0Over=false;              //时间到了,让标志复位  

  125. }  

  126.   

  127. void T0_times() interrupt 1 //T0定时器中断函数  

  128. {  

  129.     T0IntCout++;  

  130.     if(T0IntCout==T0IntCountAll)  //达到总中断次数值  

  131.     {     

  132.         T0IntCout=0;         //中断次数清零,重新计时  

  133.         bT0Over=true;     //时间真的到了  

  134.         if(bT0Delay)             //本次中断是用来延时的吗  

  135.         {  

  136.             TR0=stop;        //如果是由延时函数开启T0的话,关闭T0  

  137.             return;  

  138.         }  

  139.   

  140.         TH0=TH0Cout;        //循环定时的话要重装初值,每次定时1秒,重装一次  

  141.         TL0=TL0Cout;  

  142.         T0_Work();             //工作函数  

  143.     }  

  144. }  

  145.   

  146. ////////////////////////////////////////////////////////////////////////////////  

  147. void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  

  148. {       //控制6位数码管显示函数,不显示的位用参数 dark  

  149.         dula=1;         //小数点  

  150.         P0=table[16];  

  151.         dula=0;  

  152.         P0=0xff;  

  153.         wela=1;  

  154.         P0=dot;          

  155.         wela=0;  

  156.         delayms(1);  

  157.   

  158.          dula=1;  

  159.         P0=table[oneWela];   //送段数据  

  160.         dula=0;  

  161.         P0=0xff;    //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器  

  162.         wela=1;  

  163.         P0=0xfe;  

  164.         wela=0;  

  165.         delayms(1);  

  166.   

  167.         dula=1;  

  168.         P0=table[twoWela];  

  169.         dula=0;  

  170.         P0=0xff;  

  171.         wela=1;  

  172.         P0=0xfd;  

  173.         wela=0;  

  174.         delayms(1);  

  175.   

  176.         dula=1;  

  177.         P0=table[threeWela];  

  178.         dula=0;  

  179.         P0=0xff;  

  180.         wela=1;  

  181.         P0=0xfb;  

  182.         wela=0;  

  183.         delayms(1);  

  184.   

  185.         dula=1;  

  186.         P0=table[fourWela];  

  187.         dula=0;  

  188.         P0=0xff;  

  189.         wela=1;  

  190.         P0=0xf7;  

  191.         wela=0;  

  192.         delayms(1);  

  193.   

  194.         dula=1;  

  195.         P0=table[fiveWela];  

  196.         dula=0;  

  197.         P0=0xff;  

  198.         wela=1;  

  199.         P0=0xef;  

  200.         wela=0;  

  201.         delayms(1);  

  202.   

  203.         dula=1;  

  204.         P0=table[sixWela];  

  205.         dula=0;  

  206.         P0=0xff;  

  207.         wela=1;  

  208.         P0=0xdf;  

  209.         wela=0;  

  210.         delayms(1);  

  211. }  

  212.   

  213. #endif  

 


关键字:51单片机  简易时钟 引用地址:51单片机学习笔记,简易时钟

上一篇:51单片机学习笔记:可对时电子钟
下一篇:热敏打印机的心电图形快速打印方法介绍

推荐阅读最新更新时间:2024-03-16 15:33

51单片机-定时器工作模式2
1.工作模式2的使用 这里我们顺便讲解一下定时器0的工作模式2,也就是使用“小试管”的方式,TMOD的初始化就为“TMOD=0x02;”。 我们知道工作模式2的最长溢出时间仅为256*(12/11059200)=0.000277秒=277微秒。 我们想实现间隔51ms的流水灯实验该怎么做,首先我们定义一个变量cnt用来记录每次的溢出次数,然后我们的定时时间为51微秒(因为最大定时只有278微秒),cnt记录的值等于1000的时候,证明时间已经过去了51ms,于是再去执行流水灯的任务。 我们已经知道工作模式2是不需要在溢出之后再填充初始值的,比如我们定时的时间为51微秒,那么计算出“距离溢出的刻度”就为47(实际计算
[单片机]
51单片机学习三 关于静态数码管的使用
单片机芯片型号 STC89C516 需求 需要知识 1.有关数码管 数码管是一种半导体发光器件,其基本单元是发光二极管。就是若干个二极管拼出来的。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点( DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为 1 位、 2 位、 3 位、 4 位、 5 位、6 位、7 位等数码管。 2.共阳极数码管和共阴极数码管 按单元连接方式可分为共阳极数码管和共阴极数码管。 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管, 共阳数码管在使用时将公共极 COM 接到一
[单片机]
<font color='red'>51单片机</font>学习三 关于静态数码管的使用
51单片机复习001
1、更改keil uvision3的字体以及关键字颜色的设置: 修改顺序入下 1 打开edit 2 打开edit 最下方configuration 3 打开colars 4 选择8051 edit c file 可以修改 C语言的大小 和关键词着色 问题。 源自http://zhidao.baidu.com/question/137561189.html 2、位定义:sbit LED00 = P0^0 ; (放在头文件下面,main()函数上方)。 3、12M晶振,1ms基准延时程序如下: void delay1ms(unsigned int i) { unsigned char j;
[单片机]
<font color='red'>51单片机</font>复习001
51单片机的功能和用法详细介绍
51单片机是一个芯片,内部有n个寄存器,外部长着n个脚,由于51单片机系列种类众多,具体有多少寄存器、长着几个脚要看具体型号。一般来说,在做产品的时候,以够用为原则。 单片机属于数字器件,所以它的引脚只有两种状态,即高低电平,5V的单片机,高电平是5V,低电平是0V;3.3V的单片机,高电平是3.3V,低电平是0V。即高电平的电压等于电源电压。部分单片机内部集成有DAC功能,即数模转换器,把数字量转换成模拟量的模块,带有DAC功能的单片机DAC输出引脚可以输出0到电源电压之间的任何电压值。有些单片机内部集成ADC功能,可以把连接到引脚上的0到电源电压之间的任何电压值转换成数字量存储到单片机内部寄存器。 单片机就是靠着它自身
[单片机]
8051单片机在机器人技术和医疗领域的应用
  距离8051单片机的诞生已有40多年,由于专利的到期,国内8051单片机,在价格上一般都会便宜很多。随着科学技术的发展,单片机的使用减小了电子产品的尺寸、成本和复杂性。由于其简单性和优势,越来越多地电子产品使用这些嵌入式芯片和单片机。   我们可以进行单片机编程,以根据电路操作的要求执行各种任务。因此,仅通过改变程序指令就可以在不改变项目的任何硬件电路的情况下由单个电路执行各种任务。因此,单片机在科学技术中的应用正在迅速增加。   一、单片机的应用   单片机通常用于电气和电子项目或电路。有各种类型的单片机,例如:英锐恩的8051系列8位单片机EN8F5113等。但是,由于8051单片机与其他单片机相比具有优势,因此经
[单片机]
80<font color='red'>51单片机</font>在机器人技术和医疗领域的应用
11-基于51单片机的光照和温湿度检测报警
具体实现功能 由STC89C52单片机+LCD1602液晶显示屏+ADC0832模块+蜂鸣器+DHT11温湿度传感器 +光照传感器+LED+按键构成。 具体功能: 1、LCD1602液晶第一行显示当前的光照值,第二行显示当前的温度和湿度值; 2、可以设置光照、温湿度上下限报警值。共4个按键:复位按键、减键、加键、设置键;设定的参数具有掉电保存,保存在STC单片机的内部,上电无需重新设置; 3、当光照值高于设定的报警值或温度湿度超出上下限范围,蜂鸣器和指示灯会发出声光报警; 4、当温湿度值低于或高于设定的范围时,相应的指示灯亮,蜂鸣器报警。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有
[单片机]
11-基于<font color='red'>51单片机</font>的光照和温湿度检测报警
50-基于51单片机的智能台灯设计
具体实现功能 系统由STC89C52单片机+L数码管+光敏电阻+人体感应模块+红外接近传感器模块构成。 具体功能: (1)亮度不够且有人靠近时台灯自动亮; (2)靠的太近会提醒坐姿不正(蜂鸣器); (3)附近无人时台灯自动熄灭(30秒),时间可调; (4)根据环境亮度调节等亮度; (5)可手动调节台灯亮度; (6)设定学习时间。 设计背景 台灯已是千家万户的必需生活用品,经常由于忘记关灯而造成巨大的能源浪费。当夜晚来临时,人们又摸黑去开灯,非常不方便。在这里设计了以人体红外辐射(波长为9.5um)传感控制电路。当人体在台灯的范围内且环境光强较弱时,自动感应开灯;当人体太靠近桌面时,台灯自动感应,
[单片机]
50-基于<font color='red'>51单片机</font>的智能台灯设计
8051单片机的历史_8051单片机的应用领域
  目前,有关8051单片机的说法很多:8051单片机是Intel发明的,可与8位系列处理器一起使用。现在,8051单片机已广泛应用于各个行业以及家庭的各种家用电器上。      一、8051单片机的历史   如果我们回顾历史,8051单片机是由微处理器巨头Intel于1980年首次发明的,并且逐渐被全世界所接受,并且随着未来的每一天,8051单片机的重要性正在不断提高。当它由英特尔发明时,它是通过NMOS技术开发的,但作为NMOS技术却不是很有效。   为了提高效率和生产率,英特尔通过实施CMOS技术对它进行了改型,并出现了一个新版本,名称中带有字母“C”,比如:“80C51”。新版8051单片机具有两条总线,一条总线用于程序
[单片机]
80<font color='red'>51单片机</font>的历史_80<font color='red'>51单片机</font>的应用领域
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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