📄 timer05.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 + -