⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer05.c

📁 这是用51单片机开发的电子时钟
💻 C
字号:

 /*
* Copyright (c) 2005, Owen Studio
* All rights reserved.
*
* 文件名称:MyBoard.c
* 当前版本:Version 1.0
* 
* 本程序为通过调试的源程序
*
* 功能描述:上电后系统等待用户输入登陆密码,用户可查询储存在24C02中的登陆密码(A键),也可修改登陆密码(B键),
* 当输入登陆密码后按D键,如果密码正确则进入系统。进入系统后6个数码管开始计时,同时循环播放4首音乐,发光二
* 极管也按预定流水灯程序循环闪动。此时按1-9键则播放第1-9首音乐。按0键则停止播放。按D键开始/停止音乐自动播
* 放。按*键开始/停止流水灯自动演示。按#键切换流水灯方案臘键则跳到下一首音乐,按A键、B键、C键则分别对时、分
* 、秒进行调节。
* 另外本程序集成了与PC通信的串口服务程序,所有按键的功能也可以通过PC机的控制软件实现。状态也可以反馈到此
* 控制软件上。
*
* 资源配置:Timer0用于为系统提供时基;Timer1用于音乐播放;Timer2用于串口波特率发生器。
* 3个中断源,其中两个为Timer0和Timer1中断,另一个为串口中断,主要完成与PC机的通信。
*/
/*************************************************************************/
//////////////////////////Beginning of Program/////////////////////////////
/*************************************************************************/
#include <reg52.h>
#include <intrins.h>
           
#define  uchar unsigned char    
#define  uint  unsigned int


#define  SCAN_CYCLE 500
sbit P3_3=P3^3;
sbit P3_7=P3^7;
static const char c_keyCode[16]={0x01,0x02,0x03,0x0a,            /*键盘1,2,3,A*/
                                 0x04,0x05,0x06,0x0b,            /*键盘4,5,6,B*/
                                 0x07,0x08,0x09,0x0c,            /*键盘7,8,9,C*/
                                 0x0e,0x00,0x0f,0x0d};           /*键盘*,0,#,D*/
/*************************************************************************/
/*System Variables*/
       			
uchar hour=10;min=0;sec=0;
uchar DisplayArray[6];  
 

uchar Int0Flag,TH0Global,TL0Global;
uchar modifyTimeFlag=0;
/*System Variables Over*/
/*************************************************************************/
/*System Functions*/

void MainSystem(void);            /*系统主程序*/
void ScrShift(uchar keyIndex);    /*六位数码管顺序左移*/
void Delay (uint value);          /*10us延时*/
void ModifyTime(void);            /*调整时间*/
void ScanSeg7();                  /*数码管扫描显示*/    
/*System Functions Over*/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
void main(void)         /*主程序入口*/
{
    TMOD=0x11;          /*Timer0工作在案MODE1,16位定时器,Timer1工作在MODE2,自动重新装载模式*/
                        /*|    定时器1        |     定时器1       |*/
                        /*| GATE|C/T| M1 | M0 | GATE|C/T| M1 | M0 |*/
    TH0=(65536-SCAN_CYCLE)/256; /*设定Timer0每隔SCAN_CYCLEu中断一次*/
    TL0=(65536-SCAN_CYCLE)%256;
    TR0=1;                      /*启动TEMER0*/
    
    IE=0x9a;            /*使能总中断、Timer0,1中断、外部中断1,2*/
                        /*| EA| - | ET2| ES | ET1| EX1| ET0| EX0|*/
    IP=0x12;            /*优先Timer0中断*/
                        /*| - | - | PT2| PS | PT1| PX1| PT0| PX0|*/
   
    P3_3=1;             /*关喇叭*/
    P2=0x00;            /*点亮8个发光二极管*/
   
}
/*************************************************************************/

/*************************************************************************/
void MainSystem(void)           /*系统主程序*/
{
    
    
   
    if(modifyTimeFlag==1)
    {
        ModifyTime();           /*根据新秒值调整时间*/
        modifyTimeFlag=0;
    }
}
/*************************************************************************/

/*************************************************************************/

/*************************************************************************/
/*************************************************************************/

/*************************************************************************/
void ScrShift(uchar keyIndex)       /*六位数码管顺序左移*/
{
    uchar i;    		
    for(i=5;i>0;i--)
    {
        DisplayArray[i]=DisplayArray[i-1];  
    }
    DisplayArray[0]=c_keyCode[0x0d];    
}   		
/*************************************************************************/
/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/
void Delay (unsigned int value)     /*10us延时*/
{
    while (value!=0) 
    {
        value--;	
    }
}
/*************************************************************************/
void ModifyTime(void)               /*调整时间*/
{
    uchar ucharTemp;
    ucharTemp=sec;      	
    sec%=60;                        /*秒除60取余数为sec*/
    min+=ucharTemp/60;              /*分加上秒的进位先暂存于min*/
    ucharTemp=min;
    min%=60;                        /*分再除60取余数为min*/
    hour=(hour+ucharTemp/60)%24;    /*时加上分的进位除24取余数为hour时*/
    DisplayArray[0]=(sec%10);       /*将时间存入显示缓冲区*/	
    DisplayArray[1]=(sec/10);   	
    DisplayArray[2]=(min%10);   	
    DisplayArray[3]=(min/10);   	
    DisplayArray[4]=(hour%10);  
    DisplayArray[5]=(hour/10);  
}   	
/*************************************************************************/     
void ScanSeg7()                             /*数码管扫描显示*/
{
    static uchar s_scanCounter;
    s_scanCounter++;
    if(s_scanCounter>5) s_scanCounter=0;                    /*ptr1>5表示6个数码管都已经扫描过*/
    P0=s_scanCounter|(DisplayArray[s_scanCounter]<<4);
}   
/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/

/*************************************************************************/
void Timer0Int() interrupt 1 using 2        /*每隔SCAN_CYCLEus中断扫描一次数码管*/
{
  	 TH0=(65536-SCAN_CYCLE)/256; /*设定Timer0每隔SCAN_CYCLEu中断一次*/
     TL0=(65536-SCAN_CYCLE)%256;
   
     ScanSeg7();
     ScrShift();
          	
}   
/*************************************************************************/

/*************************************************************************/
/////////////////////////////End of Program////////////////////////////////
/*************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -