📄 课设.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 + -