单片机的数字时钟程序

发布者:SereneDreamer最新更新时间:2016-09-08 来源: eefocus关键字:单片机  数字时钟 手机看文章 扫描二维码
随时随地手机看文章
#include

#include

#define unit unsigned int

#define uchar unsigned char

 

/*定义字型字位口*/

#define DIGPORT  XBYTE [0x8000]

#define WORDPORT  XBYTE [0x4000]

 

/*定义P1口各管脚*/

sbit K0=P1^0;

sbit K1=P1^1;

sbit K2=P1^2;

sbit BEEP=P1^3;

sbit L0=P1^4;

sbit L1=P1^5;

sbit L2=P1^6;

sbit L3=P1^7;

 

uchar data BUFFER[2]={0,0};            /*显示缓冲区(依次为低位,高位)*/

uchar data CLOCK[4]={0,0,0,0};        /*存放时钟时间(依次为百分秒,秒,分和时位)*/

uchar data SECOND[2]={0,0};           /*存放秒表时间(依次为百分秒,秒)*/

uchar data REVERSE[4]={0,0,0,0};     /*存放倒计时时间(依次为百分秒,秒,分和时位)*/

 

/*定义运行状态*/

uchar data STATE=0;

/*STATE=0,秒表*/

/*STATE=1,倒计时分调整*/

/*STATE=2,倒计时小时调整*/

/*STATE=3,倒计时运行*/

/*STATE=4 or 7,时钟运行*/

/*STATE=5,时钟分调整*/

/*STATE=6,时钟时调整*/

 

bit bdata SND=0;                               /*秒表START*/

bit bdata RST=0;                                /*秒表RESET*/

bit bdata STP=0;                                /*倒计时STOP*/

 

/*数码管显示编码"0"-"9","A","-"*/

uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};

 

void display(void)

{    

       uchar i;                               /*显示缓冲区首址*/

       uchar delay;                                /*显示延时*/

       uchar disp;                                 /*显示内容*/

       uchar digit;                                /*定义数码管显示位*/

       digit=0x08;

       for (i=0;i<2;i++)                         /*秒表,显示百分秒和秒*/

       {

              if (BUFFER[i]>100) disp=BUFFER[i]%10+10;

              else disp=BUFFER[i]%10;           

             

              DIGPORT=digit;

              WORDPORT=TABLE[disp];

             

              for (delay=0;delay<=200;delay++);

              digit=digit>>1;

              disp=BUFFER[i]/10;

             

              DIGPORT=digit;

              WORDPORT=TABLE[disp];

             

              for (delay=0;delay<=200;delay++);

              digit=digit>>1;

       }

}

 

 

void timer0(void)  interrupt 1 using 1

{

       /*重置定时初值*/

       TH0=-5000/256;

       TL0=-5000%256;

      

       /*时钟处理*/

       CLOCK[0]=CLOCK[0]+1;

       if ((CLOCK[0]==50) && (STATE>=4))

              {

              L0=!L0;

              }

       if (CLOCK[0]==100)

              {    

              if (STATE>=4) L0=!L0;

              CLOCK[0]=0;

              CLOCK[1]=CLOCK[1]+1;

             

              if (CLOCK[1]==60)

              {

                     CLOCK[1]=0;

                     CLOCK[2]=CLOCK[2]+1;

                     if (CLOCK[2]==60)

                     {

                            CLOCK[2]=0;

                            CLOCK[3]=CLOCK[3]+1;

                            if (CLOCK[3]==24)

                            {    

                            CLOCK[3]=0;

                            }

                     }

              }

       }    

}

 

void timer2(void) interrupt 5 using 3

{

       TF2=0;

       TH2=-5000/256;

       TL2=-5000%256;

       /*秒表处理*/

       if (STATE==0)

       {

              SECOND[0]=SECOND[0]+1;

              if (SECOND[0]==50)

              {    

              L1=!L1;

              }

              if (SECOND[0]==100)

              {    

                     L1=!L1;

                     SECOND[0]=0;

                     SECOND[1]=SECOND[1]+1;

                     if (SECOND[1]==100)

                     {

                            SECOND[1]=0;

                     }

              }           

       }

      

       /*倒计时处理*/

       if (STATE==3)

       {

              REVERSE[0]=REVERSE[0]+1;

              if (REVERSE[0]==50)

              {    

              L2=!L2;

              }

             

       if (REVERSE[0]==100)

       {    

                     L2=!L2;

                     REVERSE[0]=0;

                     REVERSE[1]=REVERSE[1]+1;

                     if (REVERSE[1]==60)

                     {

                     REVERSE[1]=00;

                     REVERSE[2]=REVERSE[2]-1;

                           

       if ((REVERSE[2]==0) && (REVERSE[3]==0))

       {

                                   TR2=0;

                                   STP=1;

                                   BEEP=0;

                            }

       else if (REVERSE[2]==0xff)

                            {    

                            REVERSE[2]=59;

                            REVERSE[3]=REVERSE[3]-1;

                            }

                     }

              }           

       }

}

 

 

void intsvr1(void)  interrupt 2 using 2

{

       if (STATE==5)

       {    

              CLOCK[2]=CLOCK[2]+1;

              if (CLOCK[2]==60) CLOCK[2]=0;

       }

       if (STATE==6)

       {    

       CLOCK[3]=CLOCK[3]+1;

       if (CLOCK[3]==24) CLOCK[3]=0;

       }

}

 

void timer1(void)  interrupt 3 using 3

{

       if (STATE==0)

       {

              if (RST)

              {    

                     SECOND[0]=0;

                     SECOND[1]=0;

                     L1=1;

                     RST=0;  

              }

             

       else

              {

                     if (SND) TR2=1;

       else 

              {    

                     L1=1;

                     TR2=0;

                     RST=1;

                     }

                     SND=!SND;  

              }

       }

      

       else if (STATE==1)

              {

              REVERSE[2]=REVERSE[2]+1;

              if (REVERSE[2]==60) REVERSE[2]=0;

              }

      

else if (STATE==2)

       {

              REVERSE[3]=REVERSE[3]+1;

              if (REVERSE[3]==24) REVERSE[3]=0;     

       }

      

else

       {

              if (STP)

              {    

                     BEEP=1;

                     L2=1;

                     STP=0; 

              }

              else TR2=0;   

       }

}

 

 

void main(void)

{

       uchar stabak;                       /*上一次程序运行的状态*/

       P1=0x0f;

       EA=1; IT1=1; ET0=1;

      

       TMOD=0x61;                      /*T1方式2计数,T0方式1计时*/

       TH0=-5000/256; TL0=-5000%256;

       TH1=0xff; TL1=0xff;

       T2CON=0; TH2=-5000/256; TL2=-5000%256;

      

       K0=1; K1=1; K2=1;

       STATE=P1&0x07;

       stabak=STATE;

             

       for (;;)

       {    

       switch (STATE)

              {

              case 0:                                /*STATE=0,秒表*/

                     {

                            EX1=0; ET1=1; ET2=1; TR1=1;  SND=1;

                            L1=1; L0=0; L2=0;

                            SECOND[0]=0;

                            SECOND[1]=0;

                     } break;

                    

              case 1:                                /*STATE=1,倒计时分调整*/

                     {

                            EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;

                            L2=1; L0=0; L1=0;

                            REVERSE[0]=0;

                            REVERSE[1]=0;

                     } break;

                    

              case 2:                                /*STATE=2,倒计时小时调整*/

                     {

                            EX1=0; ET1=1; ET2=1; TR1=1; TR2=0;

                            L2=1; L0=0; L1=0;

                            REVERSE[0]=0;

                            REVERSE[1]=0;

                     } break;

                    

              case 3:                                /*STATE=3,倒计时运行*/

                     {

                            EX1=0; ET1=1; ET2=1; TR1=1;

                            if ((REVERSE[2]==0)&&(REVERSE[3]==0)) L2=1;

                            else TR2=1;

                            L0=0; L1=0;

                     } break;

                    

              case 5:                                /*STATE=5,时钟分调整*/

                     {

                            IE1=0; EX1=1; ET1=0; ET2=1; TR0=0;

                            L0=1; L1=0; L2=0;

                     } break;

                    

              case 6:/*STATE=6,时钟时调整*/

                     {

                            IE1=0; EX1=1; ET1=0; ET2=1; TR0=0;

                            L0=1; L1=0; L2=0;

                     } break;

                    

              default:                                /*STATE=4 or 7,时钟运行*/

                     {

                            EX1=0; ET1=0; ET2=1; TR0=1;

                            L1=0; L2=0;

                     }

              }

             

       while (STATE==stabak)

              {

                     switch (STATE)

                            {

                            case 0:                         /*STATE=0,秒表*/

                            {

                                   BUFFER[0]=SECOND[0];

                                   BUFFER[1]=SECOND[1];

                            } break;

                           

                            case 1:                         /*STATE=1,倒计时分调整*/

                            {

                                   BUFFER[0]=REVERSE[2];

                                   BUFFER[1]=101;/*A-*/

                            } break;

                           

                            case 2:                         /*STATE=2,倒计时小时调整*/

                            {

                                   BUFFER[0]=110;/*-A*/

                                   BUFFER[1]=REVERSE[3];

                            } break;

                           

                            case 3:                         /*STATE=3,倒计时运行*/

                            {                                

                                   BUFFER[0]=REVERSE[2];

                                   BUFFER[1]=REVERSE[3];

                            } break;

                           

                            case 5:                         /*STATE=5,时钟分调整*/

                            {

                                   BUFFER[0]=CLOCK[2];

                                   BUFFER[1]=101;/*A-*/

                            } break;

                           

                            case 6:                         /*STATE=6,时钟时调整*/

                            {

                                   BUFFER[0]=110;/*-A*/

                                   BUFFER[1]=CLOCK[3];

                            } break;

                           

                            default:                         /*STATE=4 or 7,时钟运行*/

                            {

                                   BUFFER[0]=CLOCK[2];

                                   BUFFER[1]=CLOCK[3];                           

                            }

                     }

                    

                     display();

                     K0=1; K1=1; K2=1;

                     STATE=P1&0x07;               

              }

              stabak=STATE;

       }    

}

 

 

 

DS1820温度测量程序

 

 

#include

#include

#include

#include

#include

#define   uchar unsigned char

#define   uint unsigned int

#define   dsyawh XBYTE[0x0600] // 定义双端口RAM中的存储单元地址;

#define   dsyawl   XBYTE[0x0100]

#define   dspitchh        XBYTE[0x0200]

#define   dspitchl XBYTE[0x0300]

#define   dsrollh    XBYTE[0x0400]

#define   dsrolll     XBYTE[0x0500]

 

sbit P1_0=P1^0;

sbit P1_2=P1^2;

uchar idata     stringyaw[6];

uchar idata     stringpitch[6];

uchar idata     stringroll[6];

uint k, i,j;

uint yaw0,yaw0flag;

uint record,number;

uint iyaw, ipitch, iroll;

uint numbercoma;

uint len1,len2,len3;

uint numyaw,numroll,numpitch;

 

 

//主函数,初始化串口和变量

main()

{    

TMOD=0x20;

TL1=0xfd;

TH1=0xfd;

SCON=0x50;

PCON=0x00;

        

IE=0x90;

TR1=1;

P1_0=0;

k=2;

        

dsyawh=0;    

dsyawl=0;     

dspitchh=0;

dspitchl=0;

dsrollh=0;      

dsrolll=0;

yaw0flag=0;

i=0;

P1_2=1;

while(1);

}    

// 由于采用的是专用的通信单片机,可以使用中断方式进行串行通信,提高通信质量。

serial () interrupt 4 using 1   

{

RI=0; //软件清除中断标志位

//判断是否收到HPR格式语句的第一个字符"$",其数值为0x24,如果收到,则开始记录数据,

//并设置记录标志record=1。*/

if (SBUF==0x24)

{

record=1;

i=0;

iyaw=0;                //记录航向数据字符数量的变量

ipitch=0;                      //记录俯仰数据字符数量的变量

iroll=0;                 //记录横滚数据字符数量的变量

numbercoma=0;           // 记录逗号数量的变量

}

             

if (record==1)  // 开始处理HPR中的数据信息

{

       //利用HPR数据中的逗号间隔,区分接收到的字符处于何种姿态数据中。

       if(SBUF==0x2c)    {numbercoma++;}

                                  

       // 第一个逗号之后的字符属于航向数据,参见HRP语句

       if (numbercoma==1)

       {    

       stringyaw[iyaw]=SBUF;              // 将字符放入航向字符串"stringyaw[ ]"中

       iyaw++; 

       }

 

       // 第三个逗号之后的字符属于俯仰数据

       if (numbercoma==3)

       {

       stringpitch[ipitch]=SBUF;            // 将字符放入俯仰字符串"stringpitch[ ]"中

       ipitch++;

       }

 

       // 第五个逗号之后的字符属于滚转数据

       if (numbercoma==5)

       {

stringroll[iroll]=SBUF; // 将字符放入横滚字符串"stringroll[ ]"中

              iroll++;

       }

 

       //判断是否收到HPR格式语句的字符"*",如果收到,则结束记录,开始处理。

       if (SBUF=='*')

       {           

              stringyaw[iyaw]='\0';                // 给出结束航向数据字符串的结束符

              stringpitch[ipitch]='\0';

              stringroll[iroll]='\0';

                                  

              // 开始处理航向数据的相关字符,转化为数据格式

              j=0;               

              // 将航向字符用sprintf()函数连接成字符串,并舍掉最后一个逗号

              len1=sprintf(stringyaw,"%s",stringyaw+1);  

             

//用atoi()函数将字符串转化为数据格式

              if (len1!=0)

{

numyaw=atoi(stringyaw);    

}    

                                  

              // 开始处理俯仰数据的相关字符,转化为数据格式

              j=0;

              len2=sprintf(stringpitch,"%s",stringpitch+1);

              if (len2!=0)

{

 numpitch=atoi(stringpitch);       

}

                                  

              // 开始处理滚转数据的相关字符,转化为数据格式 

              j=0;     

              len3=sprintf(stringroll,"%s",stringroll+1);

              if (len3!=0)

{

 numroll=atoi(stringroll);  

}

 

// 返回初始值;  

numyaw=0;

numroll=0;

numpitch=0;

numbercoma=0;

record=0;

ipitch=0;

iroll=0;

iyaw=0;

       }

}

}

关键字:单片机  数字时钟 引用地址:单片机的数字时钟程序

上一篇:步进电机正反转可调速度
下一篇:C51中的code关键字

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

51单片机控制的红外遥控LED电子钟设计
  自制LED电子钟在很多电子类报刊杂志上都可以见到,但多数在断电后要重新设置时间等参数,给使用带来不便。也有用电池作为备用电源的,但往往体积较大。本文介绍的LED电子钟克服了上述弊端,加上采用家电通用的红外遥控器进行控制,使用方便。该电子钟有一路闹铃输出,可以通过遥控器设置闹铃时间及闹铃允许。   一、工作原理   实时时钟芯片DS1302采用串行数据传输,可为掉电保护电源提供可编程的充电功能,也可以关闭充电功能,芯片采用32768Hz晶振。   AT89C2051作为主控芯片,其功能一是对接收到的红外遥控编码进行判断识别,并进行相应的处理;二是定期读取DS1302中的时间,并把小时和分钟送显示;三是比较设置的闹铃时间与实时时间
[单片机]
51<font color='red'>单片机</font>控制的红外遥控LED电子钟设计
PIC单片机的输入输出端口
在学习这个部门的时候,曾经碰到过一些题目.PIC 单片机 的引脚未几,大多都是复用引脚,例如AD、IO、比较器、外接晶振等等,所以在配置端口的时候,一定要知道每个功能怎样设置才能实现的,在这一小节中,我要讲的是通用IO口的设置题目. PIC16F616有12个IO口,但是有一个引脚(RA3)只能作为输入引脚用,不能用作输出,另外,A口具有电平变化间断的功能,而C口没有,在设计的时候要留意. 在设置的时候,一般要进行以下几项设置: (1)设置端口是模拟端口仍是数字端口,可以通过寄存器ANSEL来设置.例如你想用AD,就要将相应的引脚设置为模拟输入端口. (2)假如你选择的是数字端口,接下来就要设置端口的方向,是输入仍是输出(RA3除
[单片机]
基于Java语言的51单片机串口通讯PC机程序
1 硬件部分(KeilC) 图1 硬件电路图 串口通讯硬件部分电路,收发器件采用max232,5V供电。J31接一单片机如AT89C52,单片机的串口与max232的10和11脚相连。 max232与微机通过9针接头相连。 本文的实验环境是AT89C52,单片机的内部程序是用KeilC语言编写的,程序功能非常简单,检测到开始信号后从串口读数据,然后把读入的数据发送给串口,遇到结束符停止。C语言代码如下供大家参考。在uv3中含有两个文件comm.h和comm.c,代码分别为: // /* comm.h */ /*
[单片机]
基于Java语言的51<font color='red'>单片机</font>串口通讯PC机程序
单片机串口笔记
REN=1; //打开串口数据接收 SM0=0; SM1=1; TMOD=0x20; 使用T1计时器,因为M0=0;M1=1;则为0010 0000 为0x20 TH1=0xfd; TL1=0xfd; TR1=1; ES=1; ES:串行口中断允许位 位于单片机中断允许寄存器IE当中,可直接寻址(ACH),ES=0时,禁止串行口中断;ES=1时,允许串行口中断。 EA=1; 中断4: //接收部分 RI=0; somebody=SBUF; //发送部分 ES=0; SBUF='a'; while(TI==0); TI=0; E
[单片机]
51单片机入门之七:按键检测
按键是单片机系统中最常用的交互方式,大学课程里介绍按键的时候,分为了两种:独立式按键和矩阵式按键。在单片机初期,各种扩展芯片的匮乏,导致了IO口资源的宝贵。而今各种按键管理芯片层出不穷,可以实现用尽可能少的IO口检测较多的按键,所以本人认为,矩阵式键盘如今存在的意义只是用在教学上了。下面介绍按键检测的方法。 功能描述: 图中有8个按键,8个发光二极管,1个数码管。当按键1按下时,数码管显示数字1,同时第一个发光二极管点亮。依次类推,当第八个按钮按下时,数码管显示8,并且第八个发光二极管点亮。 硬件分析:按键的一端接单片机,另一端接地,按键按下后单片机侧为低电平,所以当单片机检测到相应的端口为低电平时即可判断按键被按下,(实
[单片机]
51<font color='red'>单片机</font>入门之七:按键检测
基于FPGA和单片机的串行通信接口设计
摘要:本文针对由FPGA构成的高速数据采集系统数据处理能力弱的问题,提出FPGA与单片机实现数据串行通信的解决方案。在通信过程中完全遵守RS232协议,具有较强的通用性和推广价值。 1 前言 现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU系统来实现数据的处理功能,这就使FPGA系统与其他CPU系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL语言实现 FPGA与单片机的串口异步通信电路。 整个设计采用模块化的设计思想,可分为四个模块:FPGA数据发送模块,FPGA波特率发生控制模块,FPGA总体接口模块以
[工业控制]
基于FPGA和<font color='red'>单片机</font>的串行通信接口设计
51单片机学习——1--点亮第一个LED
点亮LED 原理: 此单片机的LED灯就是个发光二极管,只能单向通行。图中LED阴极接IO口,阳极接VCC,也就是电源,为高电平,而正常情况下P2口默认输出高电平,所以只需令P2口输出低点平即可。 代码: #include reg52.h sbit led=P2^0;//通过位定义,令led代表P20口 void main() { while(1) { led=0;//令P20为低电平 } } 总结: 知识点: 设置管脚sbit name=Px^x(IO口) 令目标led灯对应的IO口输出低电平 拓展: 也可以直接对P2的所有IO口进行赋值输出。即1111 1111从高位到低位分别对应从左到右
[单片机]
51<font color='red'>单片机</font>学习——1--点亮第一个LED
基于单片机设计的通用汉字文本播音系统
  嵌入式语音播放系统应用日益广泛。汉字语音播放的方法有录音芯片法、语音合成芯片法及汉字语音库法等。Flash存储器容量不断增大,利用Windows的Speech SDK可以方便地提取汉字语音文件,因此汉字语音库法得以广泛应用。   汉字语音库法可分为专用语音播放和通用语音播放两类。专用语音播放系统只存储少量固定的语音资源,只需较小的存储容量,但应用范围有限。通用语音播放系统存储所有不同读音汉字的单字语音资源,可实现任意文本组合的语音播放,适用于播放内容经常更新的场合。本系统由1220个不同读音汉字读音文件构成语音库,存于一片Flash存储器中,实现了基于SPCE061A的嵌入式通用汉字文本语音播放系统。系统硬件简单,使用方便,
[单片机]
基于<font color='red'>单片机</font>设计的通用汉字文本播音系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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