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

📄 qianrushi.c

📁 这是单片机开发的一个程序
💻 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 + -