a6000单片机的定时闹钟代码.docx
- 文档编号:8644341
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:17.39KB
a6000单片机的定时闹钟代码.docx
《a6000单片机的定时闹钟代码.docx》由会员分享,可在线阅读,更多相关《a6000单片机的定时闹钟代码.docx(15页珍藏版)》请在冰豆网上搜索。
a6000单片机的定时闹钟代码
适用于a6000单片机的倒计时器代码
#include
#defineuintunsignedint//宏定义
#defineucharunsignedchar
ucharkey_num=11;
longints,q,l,m;
uchars1=8,s2=8,s3=8,s4=8,s5=8,s6=8,smin=0,ssecond=0,shour=0,tmin=0,tsecond=0,thour=0,pp,i,j=1,LOL=1,LUL=1;//四个输入值,,smin是分钟数,ssecond是秒数,i是无用循环数,PP是定时器的一秒循环数
sbitBUZZER=P3^4;//fengmingqi
////////////////////////////////////////////////////////////////////////////////////////
/*延时函数*/
voiddelay(ucharx)
{
uchari,j;
for(i=x;i>0;i--)
for(j=100;j>0;j--);
}
/////////////////////////////////////////////////////////////////////////////////////////
/*键盘扫描*/
voidkeyboard(void)
{
uchartemp;
P1=0xef;//将第1列置位低电平,其余的为高电平
temp=P1;//读取P1口当前的状态,赋值给临时变量temp,用于后面的计算
temp=temp&0x0f;//判断temp的,低四位是否为0,
if(temp!
=0x0f)//如果temp不等于0x0f,说明有按键按下
{
delay(10);//延时消抖
temp=P1;//重新读一次P1口数据
temp=temp&0x0f;//如果temp仍然不等于0x0f,这次说明第1列真的有按键按下
if(temp!
=0x0f)
{
temp=P1;
switch(temp)//判断按下的是该列的第几行
{
case0xee:
//如果读到P1是0xee,说明是第1列和第1行的交叉键,即数字键7
key_num=7;
break;
case0xed:
//如果读到P1是0xed,说明是第1列和第2行的交叉键,即数字键4
key_num=4;
break;
case0xeb:
//如果读到P1是0xeb,说明是第1列和第3行的交叉键,即数字键1
key_num=1;
break;
case0xe7:
//如果读到P1是0xe7,说明是第1列和第4行的交叉键,即数字键0
key_num=0;
break;
}
}
//在判断完按键序号后,还要等待按键被释放,检测释放语句如下:
while(temp!
=0x0f)//等待按键被释放
{
temp=P1;
temp=temp&0x0f;//不断的读取P1口数据,然后和0x0f“与”运算,只要结果不等于0x0f,说明按键没有被释放,直到按键被释放才退出while
}
}
//以下程序意义同上,继续进行第2、3、4列的检测
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
switch(temp)
{
case0xde:
key_num=8;
break;
case0xdd:
key_num=5;
break;
case0xdb:
key_num=2;
break;
}
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P1;
switch(temp)
{
case0xbe:
key_num=9;
break;
case0xbd:
key_num=6;
break;
case0xbb:
key_num=3;
break;
case0xb7:
//如果读到P1是0xe7,说明是第3列和第4行的交叉键,即按键“="显示数字11
key_num=99;
break;
}
}
while(temp!
=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
sbitDIG_DATA=P0^2;//74HC595的数据输入引脚
sbitDIG_SHCP=P0^4;//74HC595的移位脉冲引脚
sbitDIG_STCP=P2^3;//74HC595的锁存脉冲引脚
codeunsignedcharSegment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF,0xB7};//数字段码,Segment[0]~Segment[9]分别对应数字0~9的段码
codeunsignedcharSelect[]={0xff,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选,Select[0]为全选,Select[1]~Select[8]分别对应第1位(最右侧)~第8位(最左侧)
/**********************************************
功能:
输出位选字节和段码字节到74HC595
输入参数:
SelectByte:
位选字节
SegmentByte:
段码字节
输出参数:
无
返回值:
**********************************************/
voidDigOutput(unsignedcharSelectByte,unsignedcharSegmentByte)
{
unsignedchari;
DIG_SHCP=0;//74HC595的移位脉冲引脚输出低电平
DIG_STCP=0;//74HC595的锁存脉冲引脚输出低电平
/*将段码字节(共8位,高位在前)移入74HC595芯片*/
for(i=0;i<8;i++)
{
/*判断数据的最高位,如果最高位是1,数据引脚输出高电平;如果是0,输出低电平*/
if(SegmentByte&0x80)
{
DIG_DATA=1;
}
else
{
DIG_DATA=0;
}
/*输出74HC595芯片的数据移位脉冲,每输出一个移位脉冲,74HC595内部的数据移动一位*/
DIG_SHCP=1;
DIG_SHCP=0;
/*要输出的数据左移一位,即为下一位数据的输出作准备*/
SegmentByte<<=1;
}
/*将位选字节(共8位,高位在前)移入74HC595芯片*/
for(i=0;i<8;i++)
{
if(SelectByte&0x80)
{
DIG_DATA=1;
}
else
{
DIG_DATA=0;
}
DIG_SHCP=1;
DIG_SHCP=0;
SelectByte<<=1;
}
/*输出74HC595芯片的数据锁存脉冲,即将74HC595芯片接收到的最新数据输出到芯片的所有数据引脚*/
DIG_STCP=1;
DIG_STCP=0;
}
voidshow(unsignedcharw1,unsignedcharw2,unsignedcharw3,unsignedcharw4,unsignedcharw5,unsignedcharw6,unsignedcharw7,unsignedcharw8)
{
while
(1)
{
DigOutput(Select[8],Segment[w1]);//第8位(最左侧)显示数字1
DigOutput(Select[7],Segment[w2]);//第7位显示数字2
DigOutput(Select[6],Segment[w3]);//第6位显示数字3
DigOutput(Select[5],Segment[w4]);//第5位显示数字4
DigOutput(Select[4],Segment[w5]);//第4位显示数字5
DigOutput(Select[3],Segment[w6]);//第3位显示数字6
DigOutput(Select[2],Segment[w7]);//第2位显示数字7
DigOutput(Select[1],Segment[w8]);//第1位(最右侧)显示数字8
keyboard();
if(key_num==99)
{
break;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sbitled=P1^0;
voidtime()
{
TMOD=0x00;//模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TH0=0XEC;//定时器设置,每隔100微秒发起一次中断。
TL0=0X00;
TR0=1;//打开定时器
pp=2000;
led=1;
while(LOL)
{
if(TF0==1)
{
TF0=0;
pp--;
if(pp==0)
{
if(ssecond==60)
{
smin++;
ssecond=0;
if(smin==60)
{
shour++;
smin=0;
}
}
if(shour==thour&&smin==tmin&&ssecond==tsecond)
{
while(LOL)
{key_num=11;
BUZZER=1;
led=0;
keyboard();
if(key_num!
=11)
{
BUZZER=0;
led=1;
LOL=0;
}
}
}
ssecond++;
if(key_num==99)
{
while(LUL)
{
if(key_num==99)
{
LUL=0;
break;
}
}
BUZZER=0;
led=1;
}
}
s1=shour/10;
s2=shour%10;
s3=smin/10;
s4=smin%10;
s5=ssecond/10;
s6=ssecond%10;
TL0=0X00;
TH0=0X78;
show(s1,s2,11,s3,s4,11,s5,s6);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
voidmain(void)
{
key_num=11;
BUZZER=0;
while
(1)
{
keyboard();
if(key_num!
=11)
{
s1=key_num;
break;
}
}
show(s1,10,11,10,10,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s2=key_num;
break;
}
}
show(s1,s2,11,10,10,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s3=key_num;
break;
}
}
show(s1,s2,11,s3,10,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s4=key_num;
break;
}
}
show(s1,s2,11,s3,s4,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s5=key_num;
break;
}
}
show(s1,s2,11,s3,s4,11,s5,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s6=key_num;
break;
}
}
show(s1,s2,11,s3,s4,11,s5,s6);////////以上主函数为输入设定时间的内容
////////////////////////////////////////////////////////////////////////
shour=s1*10+s2;
smin=s3*10+s4;
ssecond=s5*10+s6;
show(1,10,11,10,10,11,10,10);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
key_num=11;
BUZZER=0;
while
(1)
{
keyboard();
if(key_num!
=11)
{
s1=key_num;
break;
}
}
show(s1,10,11,10,10,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s2=key_num;
break;
}
}
show(s1,s2,11,10,10,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s3=key_num;
break;
}
}
show(s1,s2,11,s3,10,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s4=key_num;
break;
}
}
show(s1,s2,11,s3,s4,11,10,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s5=key_num;
break;
}
}
show(s1,s2,11,s3,s4,11,s5,10);
key_num=11;
while
(1)
{keyboard();
if(key_num!
=11)
{
s6=key_num;
break;
}
}
show(s1,s2,11,s3,s4,11,s5,s6);
/////////////////////////////////////////////////////////////////////////////////////////
//以上为设定闹钟时间
thour=s1*10+s2;
tmin=s3*10+s4;
tsecond=s5*10+s6;
time();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- a6000 单片机 定时 闹钟 代码