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

📄 课设.c

📁 51单片机实现夜间防睡记录器
💻 C
字号:
/*接口*/
/*	P0接键盘*/
/*	p1接数码管的位选端
	P2接段码
	p3.2接蜂鸣器
	P3.4接P3.3
	P3.1/P3.0接发光二极管
*/
#include <reg52.h>
#define uchar unsigned char
uchar cout, k;//计数标志。
unsigned int cout_j;
uchar miao = 0;	//时间初始化
uchar fen = 0;
uchar hour = 10;
uchar i,key,n=0;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_4=P3^4;
sbit P2_7=P2^7;
bit flag_60,flag_11,flag_10,flag_ma,flag_c;//超过60分报警标志
uchar code duanma[10] ={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
uchar code weima[6] ={ 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf};
uchar room[9][3],huanchun[6];
void delay(uchar i,uchar k)//延时程序采用将要显示的数据不断地读入huanchun数组中
{
	do{	if(flag_ma==0)
		{	huanchun[0] = miao % 10;
    		huanchun[1] = miao / 10;
    		huanchun[2] = fen % 10;
    		huanchun[3] = fen / 10;
    		huanchun[4] = hour % 10;
    		huanchun[5] = hour / 10;
		}
		else
		{	huanchun[0] = room[k][0] % 10;
    		huanchun[1] = room[k][0] / 10;
    		huanchun[2] = room[k][1]% 10;
    		huanchun[3] = room[k][1] / 10;
    		huanchun[4] = room[k][2] % 10;
    		huanchun[5] = room[k][2] / 10;
		}
	   }while(i--);
}
baocun(uchar i)	   //保存当前时刻时间数据
{	room[i][0]=miao;
	room[i][1]=fen;
	room[i][2]=hour;
}
void dingshi()interrupt 1 	  //定时50ms
{
  TH0 = 0x4c;//初始设置
  TL0 = 0x00;
  cout++;
  P3_4=0;	   //外部中断启动报警 
  if (cout==2)  //   以秒为单位
  {	flag_c=~flag_c; //10min时灯闪的频率定为2秒
    miao++;
    cout = 0;
	cout_j++;//计数标志。
    if (miao==60)
    {
      miao = 0;
      fen++;
      if (fen==60)
      {
        fen = 0;
        hour++;
        if (hour==24)hour = 0;
      }
    }
	 if(cout_j==600)flag_10=1;//10MIN标志,
	 if(cout_j==660)flag_11=1; //11分标志,
	 if(cout_j==3600){flag_60=1;baocun(n);n++;}
	 //报警开,记录当前时刻,存储单元指向下一个以便下次报警记录时间
  }
}
void xianshi()interrupt 3 	//中断显示
{	
	  TH1=0Xf8;		   //显示定时两毫秒。
	  TL1=0Xcc;
      P1 = weima[i];
      P2 = duanma[huanchun[i]];
      i++;
	  if((i==3||i==5)&&flag_ma==0)P2_7=flag_c;
      if(i==6)i=0;
}//该中断显示huanchun中的数据
unsigned char scankey()//键盘扫描以坐标形式取键值
{
	unsigned char k,down,up;
	P0=0xF0;
	k=P0;
	if(k==0xF0)return 0xFF;//确定列
	delay(100,key);		////////////
	down=3;
	while(k&0x80)down--,k<<=1;
	P0=0x0F;
	k=P0;
	if(k==0x0F)return 0xFF;//确定行
	up=0;
	while(k&0x01)up+=4,k>>=1;
	return up+down;///行值加键值=坐标值
}//scankey
jianpan(uchar i)//键盘功能处理
{	switch(i)
	{	
		case 8:
		case 9:
		case 10:
		case 11:
		case 12:
		case 13:break;
		case 14:key=8;//该键按下后将记录的次数读入room中
				room[8][0]=n;
				room[8][1]=0;
				room[8][2]=0;
				flag_ma=~flag_ma;//显示时钟(时,分,秒)或显示记录次数
				break;//跳出switch
		case 15:flag_11=0;//复位,清计数,定时
				flag_10=0;
				flag_60=0;
				cout_j=0;
				P3_0=1;
				P3_1=1;
				P3_2=1;
				break;	 //跳出switch
		default:key=k;flag_ma=~flag_ma; //显示时钟(时,分,秒)或显示记录的时间
	}
}
void shortb()interrupt 2	//定时中断显示
{	P3_4=1;	//清除外部定时标志以便下次中断
	if(flag_10==1){P3_2=flag_c;}//如果计时至十分钟,p3.2将会输出2hz频率的方波直到flag_10被清0
	if(flag_11==1){P3_0=~P3_0;P3_2=~P3_2;flag_10=0;}//11min灯1s闪烁

⌨️ 快捷键说明

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