📄 qianrushi.c
字号:
#include <REG51.h>
#define TIMER0_COUNT 0XEc78 /*10000H-(12000000/(12*200)) 循坏200次计时一秒*/
#define TRUE 1
#define FALSE 0
#define TIMES 25
sbit P2_6=P2^6;
sbit P0_0=P0^0;
sbit P0_7=P0^7;
sbit P1_7=P1^7;
sbit P2_1=P2^1;
sbit 2_2=P2^2;
sbit P2_0=P2^0;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
const seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
const scan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*定义时间表示结构*/
struct time{
unsigned char hour;
unsigned char minute;
unsigned char second;
} now;
struct alter{ /*闹铃时间结构体变量*/
unsigned char minute;
unsigned char hour;
}alter1;
void display(); //显示函数
void changetime(); //走时单元转换函数
void clock(); //闹铃函数
void clocksay(); //整点响铃函数
void alterdisplay(); //
int k;
unsigned char timer0_tick,s=0,KeyA=0,KeyE=0,KeyAlter=0,mode=0;
unsigned int i,j;
/*--------------------------------------------------------------------------------------------*/
void init_timer() //定时器函数
{
TMOD=0x01; /*T0模式1*/
TL0=0X78;
TH0=0XEC;
IE=0X82; /*启动定时器T0中断*/
TR0=1;
now.hour=12; //开机时间初始化,
now.minute=0;
now.second=0;
alter1.hour=0;
alter1.minute=0;
alter1.second=0;
display(); //并显示在数码管上
}
/*-------------------------------------------------------------*/
//中断服务函数
void time0_isr(void) interrupt 1
{
TL0=0X78;
TH0=0XEC;
timer0_tick++;
if(timer0_tick==200){ //计时程序,TF0中断200次计时1秒
timer0_tick=0;
now.second++;
if(now.second==60){
now.minute++;
now.second=0;
if(now.minute==60){
now.hour++;
now.minute=0;
if(now.hour==24) {now.hour=0;}
}
}
}
if(now.hour==alter1.hour &&
now.minute==alter1.minute) //到达闹铃时间,开始打铃
{
clock();
for(k=1000;k>0;k--); /*------------------------------*/
}
if(now.minute==59 && now.second>=55 &&
now.second<59) //到整点前5秒打铃
{
clocksay();
for(k=1000;k>0;k--);
}
if(now.minute==59 && now.second==59)
{
unsigned int i,j;
for(i=0;i<5000;i++)
{
P2_6=0;
for(j=0;j<10;j++){}
P2_6=1;
for(j=0;j<10;j++);
}
for(k=10000;k>0;k--);
}
}
/*------------------------------------------------------------------*/
//时间转换函数
/*void changetime()
{
if(timer0_tick==200){ //计时程序,TF0中断200次计时1秒
timer0_tick=0;
now.second++;
if(now.second==60){
now.minute++;
now.second=0;
if(now.minute==60){
now.hour++;
now.minute=0;
if(now.hour==24) {now.hour=0;}
}
}
}
if(now.hour==alter1.hour &&
now.minute==alter1.minute) //到达闹铃时间,开始打铃
{
clock();
for(k=1000;k>0;k--);
}
if(now.minute==59 && now.second>=55 &&
now.second<59) //到整点前5秒打铃
{
clocksay();
for(k=1000;k>0;k--);
}
if(now.minute==59 && now.second==59)
{
unsigned int i,j;
for(i=0;i<5000;i++)
{
P2_6=0;
for(j=0;j<10;j++){}
P2_6=1;
for(j=0;j<10;j++);
}
for(k=10000;k>0;k--);
}
}*/
/*--------------------------------------------------------------------------*/
//显示时间功能的设计
void display()
{
P0=scan[s]; //数码管位选择
switch(s){
case 0:P1=seven_seg[now.hour/10];
for(k=100;k>0;k--);
break;
case 1:P1=seven_seg[now.hour%10];
for(k=100;k>0;k--);
break;
case 2:P1=0xbf;
for(k=100;k>0;k--);
break;
case 3:P1=seven_seg[now.minute/10];
for(k=100;k>0;k--);
break;
case 4:P1=seven_seg[now.minute%10];
for(k=100;k>0;k--);
break;
case 5:P1=0xbf;
for(k=100;k>0;k--);
break;
case 6:P1=seven_seg[now.second/10];
for(k=100;k>0;k--);
break;
case 7:P1=seven_seg[now.second%10];
for(k=100;k>0;k--);
break;
}
s++;
if(s==8) s=0;
}
/*-----------------------------------------------------------------*/
//显示时间功能的设计
void alterdisplay()
{
P0=scan[s]; //数码管位选择
switch(s){
case 0:P1=seven_seg[alter1.hour/10];
for(k=100;k>0;k--);
break;
case 1:P1=seven_seg[alter1.hour%10];
for(k=100;k>0;k--);
break;
case 2:P1=0xbf;
for(k=100;k>0;k--);
break;
case 3:P1=seven_seg[alter1.minute/10];
for(k=100;k>0;k--);
break;
case 4:P1=seven_seg[alter1.minute%10];
for(k=100;k>0;k--);
break;
case 5:P1=0xbf;
for(k=100;k>0;k--);
break;
case 6:P1=seven_seg[alter1.second/10];
for(k=100;k>0;k--);
break;
case 7:P1=seven_seg[alter1.second%10];
for(k=100;k>0;k--);
break;
}
s++;
if(s==8) s=0;
}
/*------------------------------------------------------------------------*/
//调时功能的设计
void set_time()
{
unsigned char m;
if(P2_2==0) for(k=100;k>0;k--); /*按下K3 键,消除抖动*/
if(P2_2==0)
{
now.hour++;
if(now.hour==24) now.hour=0;
}
for(m=0;m<30;m++)
{
display(); //调用显示数码管函数
if(P0_0==0){
P1_7=0; //点亮秒位小数点
}
delay(1);
}
if(P2_1==0) for(k=100;k>0;k--); //按下K2键,消除抖动
if(P2_1==0)
{
now.minute++;
if(now.minute==60)
{
now.minute=0; //分钟到60,从0开始
if(P0_0==0){
P1_7=0; //点亮秒位小数点
}
}
}
for(m=0;m<30;m++)
{
display(); //调用显示函数
for(k=100;k>0;k--);
}
}
/*------------------------------------------------------------------------*/
//定时功能的设计
void alter_time()
{
unsigned char m;
if(P2_2==0) for(k=100;k>0;k--); /*按下K3 键,消除抖动*/
if(P2_2==0)
{
alter1.hour++;
if(alter1.hour==24) alter1.hour=0;
}
for(m=0;m<30;m++)
{
alterdisplay(); //调用显示数码管函数
for(k=100;k>0;k--);
}
if(P2_1==0) for(k=100;k>0;k--); //按下K2键,消除抖动
if(P2_1==0)
{
alter1.minute++;
if(alter1.minute==60)
{
alter1.minute=0; //分钟到60,从0开始
}
}
for(m=0;m<30;m++)
{
alterdisplay(); //调用显示函数
for(k=100;k>0;k--);
}
}
/*----------------------------------------------------------------*/
//闹铃函数
void clock()
{
unsigned int i,j,k;
for(k=0;k<20;k++) //循环20次
{
for(i=0;i<4000;i++) //循环8000次,4kHZ音长0.8秒
{
P2_6=0;
for(j=0;j<10;j++); //延时0.1ms;
P2_6=1;
for(j=0;j<10;j++)
}
for(k=20000;k>0;k--); //停止打铃0.2秒
}
}
/*----------------------------------------------------------------*/
//整点响铃函数
void clocksay()
{
unsigned int i,j,k;
for(k=0;k<5;k++)
{
for(i=0;i,2500;i++)
{
P2_6=0;
for(j=0;j<10;j++) {}
P2_6=1;
for(j=0;j<10;j++) {}
}
for(k=30000;k>0;k--);
}
}
/*----------------------------------------------------------*/
//调用程序函数
void time()
{
changetime(); //走时单元转换函数
display(); //显示数码管时间函数
}
/*--------------------------------------------------------------*/
//扫描按键函数
void scan_key()
{
for(k=100;k>0;k--);
if(KeyA!=0){ //键盘事件KeyA设置模式:计时还是修改时间
KeyA--;
if(KeyA==0 && P2_0==0){
mode++;
if(mode==2) mode=0;
}
}else if(P2_0==0) KeyA=TIMES;/////////////////////////////////////////
}
/*-------------------------------------------------------------------------*/
//时间校正函数
void clip()
{
for(k=100;k>0;k--);
if(KeyE!=0){
KeyE--;
if(KeyE==0 && P2_3==0){
if(now.minute>=55)
{
now.minute=0;
now.hour++;
if(now.hour==24) now.hour=0;
}
else if(now.minute<=5){
now.minute=0;
}
}
for(k=100;k>0;k--);
}else if(P2_3==0) KeyE=TIMES;
}
/*-----------------------------------------------------------------*/
/*void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++){} //延时1ms,121是实验得出的结果
}
}
*/
/*--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------*/
void main()
{
init_timer();
while(1)
{
if(P2_0==0) scan_key(); //若有模式键按下,调用按键扫描函数
if(P2_3==0) clip(); //若有校正键按下,则调用校正的函数
if(P2_4==0) alter_time; //如果有定时键按下,则开始定时
switch(mode)
{
case 0:display();
break; //走时程序
case 1:set_time();
break; //走时调整
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -