电子钟.docx
- 文档编号:23341401
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:46
- 大小:41.78KB
电子钟.docx
《电子钟.docx》由会员分享,可在线阅读,更多相关《电子钟.docx(46页珍藏版)》请在冰豆网上搜索。
电子钟
电子钟
/*2051电子钟3
第1步:
测试程序全面测试硬件工作情况测试显示、按钮功能
1、测试6个数码管:
轮流点亮各笔画
2、*测试LED1,LED2:
各亮3次
3、测试蜂鸣器:
响3次
4、测试键盘:
按住某一键,对应数码管点亮各笔画一次
*/
#include
#defintucharunsignedchar/*数据类型unsignedchar用宏定义为简写形式uchar*/
#defintuintunsignedint/*数据类型unsignedint用宏定义为简写形式uint*/
#defineFANGZHEN0/*仿真时不能调试P37*/
sbitLED1=P3^7;/*端口定义*/
sbitLED2=P3^5;
sbitBEEP=P3^3;
bitbKey;
/*----------软件延时--------------*/
voiddelay(longn)/*定义delay延时子函数,形参传递标识符为n长型*/
{while(--n);}/*(1S)*/
/*----------74LS138输出-----------*/
voidout_138(ucharn)/*定义out_138子函数,形参传递标识符为n无符号字符型*/
{P3=n|~0x07;}/*P32,P31,P30为138译码输入(0x07取反再与n与)*/
/*----------取键值=1-6,无键返回7-----------*/
ucharget_key(void)/*定义get_key键盘扫描子函数*/
{
uchari,kbuf;/*定义无符号字符变量i,kbuf*/
P1=0xff;/*释放P1*/
out_138(7);/*138-Y7输出,选择键盘*/
kbuf=~P1&0x3f;/*读取键盘(按位与再取反)*/
i=0;/*?
*/
if(kbuf)/*kbuf不等于0,执行for语句*/
{ for(i=1;i<=6;i++)
{if(kbuf&0x20)break;kbuf<<=1;}/*查看下一个键*/
returni;/*返回i值*/
}/*for语句返回*/
}/*get_key键盘扫描子函数返回*/
/*----------笔画表----------------*/
ucharcodeTab_bh[8]={0x20,0x10,0x02,0x04,0x08,0x40,0x80,0x01};
/*----------主程序----------------*/
voidmain(void)/*定义main主函数*/
{/*main主函数开始*/
uchari,j;/*定义无符号字符变量i,j*/
while
(1)/*永不退出测试6个数码管,轮流点亮各笔画*/
{/*while
(1)语句开始*/
for(i=0;i<6;i++)
{out_138(i);/*选择第i个数码管*/
for(j=0;j<8;j++)/*8段笔画,轮流点亮*/
{P1=~Tab_bh[j];delay(5000);}/*笔画*/
}/*for语句结束*/
#if(!
FANGZHEN)
for(i=0;i<6;i++){LED1=!
LED1;delay(5000);}/*测试LED1*/
#endif
for(i=0;i<6;i++){LED2=!
LED2;delay(5000);}/*测试LED2*/
for(i=0;i<6;i++){BEEP=!
BEEP;delay(5000);}/*测试蜂鸣器*/
while
(1)/*测试键盘*/
{i=get_key();
if(i)/*有键按下*/
{ out_138(6-i);/*选择第i个数码管*/
for(j=0;j<8;j++)/*8段笔画,轮流点亮*/
{P1=~Tab_bh[j];delay(5000);}/*笔画*/
}/*if语句结束*/
}/*while
(1)语句结束*/
}/*while
(1)语句结束*/
}/*main主函数结束*/
/*
2051电子钟3
第2步:
基本框架、C51程序框架、基本显示、键盘、定时功能
1、在数码管上显示内部变量Cnt值
2、按K4键,Cnt加1
3、按K5键,Cnt减1
4、按K6键,Cnt清0
*/
#include
#include
#defintucharunsignedchar/*数据类型unsignedchar用宏定义为简写形式uchar*/
#defintuintunsignedint/*数据类型unsignedint用宏定义为简写形式uint*/
/*-------口、位地址定义-----------*/
#defineFANGZHEN0/*仿真时不能调试P37*/
sbitLED1=P3^7;/*定义位LED1标志并赋初值0*/
sbitLED2=P3^5;
sbitBEEP=P3^3;/*端口定义*/
/*-----------全局常量--------------*/
#defineT0_VAL(65536-921)/*=0xfc67,T0重装初值(11.0592Mhz时1ms)*/
/*------特殊字符定义---------------*/
#defineSPACE0x10/*空白,宏定义用0x10替代SPACE*/
#defineBAR0x11/*一横,宏定义用0x11替代BAR*/
#defineCH_P0x12/*P,宏定义用0x12替代CH_P*/
/*------键定义---------------*/
#defineKEY10x20/*字符串0x20用宏定义为宏名KEY1*/
#defineKEY20x10/*字符串0x10用宏定义为宏名KEY2*/
#defineKEY30x08/*字符串0x08用宏定义为宏名KEY3*/
#defineKEY40x04/*字符串0x04用宏定义为宏名KEY4*/
#defineKEY50x02/*字符串0x02用宏定义为宏名KEY5*/
#defineKEY60x01/*字符串0x01用宏定义为宏名KEY6*/
/*-----------全局字节变量----------*/
dataucharDispbuf[6];/*显示缓冲区:
00-0F数字,10-1F:
特殊*/
dataucharDispout[6];/*显示输出映像(存放数据转换成的段码)*/
dataucharKey1;/*定义无符号字符全局变量Key1*/
dataucharT_Beep;/*音响定时,定义无符号字符变量T_Beep*/
dataintCnt;/*定义整型变量Cnt*/
/*-----------全局位变量------------*/
bitb1ms;/*定义位变量b1ms*/
/*-----------响铃n*10ms(Beep)----------*/
voidBeep(ucharn)/*定义函数名为Beep的子函数,形参n*/
{
T_Beep=n;/*n赋予T_Beep变量*/
}
/*-----------在w处,显示00-99----*/
voidDisp_99(ucharw,ucharv)/*定义函数名为Disp_99的子函数,形参w、v*/
{/*Disp_99子函数开始*/
Dispbuf[w+0]=v/10;/*十位,v/10的整数赋予Dispbuf[w+0]*/
Dispbuf[w+1]=v%10;/*个位,v/10的余数赋予Dispbuf[w+1]*/
}/*Disp_99子函数结束*/
/*-------在w处,显示0000-9999----*/
voidDisp_9999(ucharw,uintv)/*定义Disp_9999的子函数,形参w、v*/
{/*Disp_9999子函数开始*/
Disp_99(w+0,v/100);/*调用Disp_99子函数,显示千、百位*/
Disp_99(w+2,v%100);/*调用Disp_99子函数,显示十、个位*/
}/*Disp_9999子函数结束*/
/*----------74LS138输出(out_138)-----------*/
voidout_138(ucharn)/*定义函数名为out_138的子函数形参n*/
{
P3=P3&~0x07|n;/*0x07取反后与P3再或n结果赋予P3(138的输入)*/
}
/*----------键盘输入(key_input)---------------*/
voidkey_input(void)/*定义函数名为key_input的键盘输入子函数*/
{
P1=0xff;/*释放P1*/
out_138(7);/*(调用138输出out_138子函数(形参7)138-Y7输出,选择键盘*/
Key1=~P1&0x3f;/*本次键(读P1,P1取反再与0x3f结果送变量Key1)*/
}
/*----------取键上沿(get_keySy)---------------*/
ucharget_keySy(void)/*定义函数名为get_keySy的子函数*/
{
staticuchark0;/*定义变量k0为无符号字符静态局部变量*/
uchark1,ksy;/*定义变量k1、ksy为无符号字符变量*/
k1=Key1;/*Key1赋予变量k1*/
ksy=(k1^k0)&k1;/*键上沿(k1和k0按位异或再按位与K1)*/
k0=k1;;/*本次送上次*/
returnksy;/*ksy返回*/
}
/*----------键盘处理(KeyPro)-------------*/
voidKeyPro(void)/*定义函数名为KeyPro的键盘处理子函数*/
{
ucharksy;/*定义变量ksy为无符号字符变量*/
ksy=get_keySy();/*调用get_keySy按键扫描子函数,并将变量ksy的值赋给ksy*/
if(ksy)/*有按键上沿,如果ksy为真(非0值)执行switch语句,否则不执行*/
{
switch(ksy)
{
caseKEY1:
LED1=!
LED1;break;/*ksy等于KEY1即0x20,则P3.7取反送P3.7*/
caseKEY2:
LED2=!
LED2;break;/*ksy等于KEY2即0x10,则P3.5取反送P3.5*/
caseKEY3:
break;/*ksy等于KEY3即0x08*/
caseKEY4:
Cnt++;/*ksy等于KEY4即0x04,Cnt++*/
if(Cnt>9999)Cnt=0;break;/*若Cnt>9999,则Cnt=0*/
caseKEY5:
Cnt--;/*ksy等于KEY5即0x02,Cnt--*/
if(Cnt<0)Cnt=9999;break;/*若Cnt<0,则Cnt=9999*/
caseKEY6:
Cnt=0;break;/*ksy等于KEY6即0x01,Cnt=0*/
}/*switch语句结束*/
Beep(10);/*调用函数名为Beep的子函数,形参n*/
}/*if语句结束*/
}/*KeyPro的键盘处理子函数结束*/
/*----------显示1位(Disp_1w)-------------*/
voidDisp_1w(void)/*定义函数名为Disp_1w的显示1位子函数*/
{
staticdataucharDispp=0;/*定义变量Dispp为无符号字符静态局部变量并赋值0*/
if(Dispp==0)key_input();/*Dispp==0为真,调用key_input键盘输入子函数*/
out_138(6);/*调用out_138子函数(关显示/y6=0)*/
P1=~Dispout[5-Dispp];/*送7段码(存放数据转换成的段码)*/
out_138(Dispp);/*显示位(从138输出数码管的位选)*/
Dispp+=1;
if(Dispp>6)
{Dispp=0;}
}
/*----------7段码表-------------*/
codeucharTab_7d[]={0x7e,0x12,0xbc,0xb6,0xd2,0xe6,0xee,0x32,
0xfe,0xf6,0xfa,0xce,0x6c,0x9e,0xec,0xe8,0x00,0x80,0xf8};
/*定义数组Tab_7d[],存储区选code,数码管0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,暗、-,P的字形码*/
/*------显示buf->Dispout(Dispbuf_out)---------*/
voidDispbuf_out(void)/*定义函数名为Dispbuf_out的子函数*/
{
uchari,v;/*定义变量i,v为无符号字符局部变量0*/
for(i=0;i<6;i++)
{
v=Tab_7d[Dispbuf[i]];/*将显示缓冲区(Dispbuf[i]数组构成)的数据通过Tab_7d[Dispbuf[i]]数组转变为端码送变量v*/
Dispout[i]=v;/*将变量v的值分别送Dispout[i]数组*/
}
}
/*----------显示处理(Disp_Pro)-------------*/
voidDisp_Pro(void)/*定义函数名为Disp_Pro的子函数*/
{
Disp_9999(2,Cnt);
Dispbuf_out();
}
/*----------1ms处理(do1ms)--------------*/
voiddo1ms(void)/*定义函数名为do1ms的子函数*/
{Disp_1w();}/*调用函数名为Disp_1w的显示1位子函数*/
/*----------10ms处理(do10ms)-------------*/
voiddo10ms(void)/*定义函数名为do10ms的子函数*/
{ if(T_Beep)T_Beep--;
BEEP=!
(bit)T_Beep;/*T_Beep取反送BEEP(P3.3)*/
}
/*----------100ms处理(do100ms)------------*/
voiddo100ms(void)/*定义函数名为do100ms的子函数*/
{
KeyPro();/*调用键盘处理(Key_Pro)函数*/
Disp_Pro();/*调用显示处理(Disp_Pro)函数*/
}
/*----------1000ms处理(do1000ms)-----------*/
voiddo1000ms(void)/*定义函数名为do1000ms的子函数*/
{ }
/*---------初始化(First)----------------*/
voidFirst(void)/*定义函数名为First的初始化子函数*/
{
TMOD=0x11;/*定时器T0、T1中断方式1*/
TH0=T0_VAL/256;/*T0的初值*/
TL0=T0_VAL%256;
TR0=1;/*开启T0*/
IE=0x82;/*允许T0中断*/
Dispbuf[0]=SPACE;/*将SPACE(0x10)赋予Dispbuf[0]*/
Dispbuf[1]=SPACE;/*将SPACE(0x10)赋予Dispbuf[1]*/
Dispbuf_out();
}
/*----------主程序(main)----------------*/
voidmain(void)/*定义函数名为main的主函数*/
{/*main主函数开始*/
uchart10ms=0,t100ms=0,t1000ms=0;/*定义变量t10ms、t100ms、t1000ms*/
First();/*调用函数名为First的初始化子函数*/
while
(1)/*永不退出*/
{/*while语句开始*/
if(b1ms)/*等待1ms到(b1ms=1,执行语句)*/
{/*if(b1ms)语句开始*/
b1ms=0;/*清除1ms标志*/
do1ms();/*调用函数名为do1ms的1ms处理子函数*/
if(++t10ms==10)/*t10ms变量到10则执行10ms处理*/
{/*if(++t10ms==10)语句开始*/
t10ms=0;
do10ms();/*调用函数名为do10ms的10ms处理子函数*/
if(++t100ms==10)/*t100ms变量的值到10则执行100ms处理*/
{/*if(++t100ms==10)语句开始*/
t100ms=0;
do100ms();/*调用函数名为do100ms的100ms处理子函数*/
if(++t1000ms==10)/*t1000ms变量的值到10则执行1000ms处理*/
{t1000ms=0;
do1000ms();}/*调用函数名为do1000ms的1000ms处理子函数*/
}/*if(++t100ms==10)语句结束*/
}/*if(++t10ms==10)语句结束*/
}/*if(b1ms)语句结束*/
}/*while语句结束*/
}/*main主函数结束*/
/*-----------定时器0中断,1ms--------*/
voidInt_T0(void)interrupt1/*定义函数名为Int_T0的T1中断服务函数,使用默认的寄存器组*/
{
TH0=T0_VAL/256;/*T0的初值*/
TL0=T0_VAL%256;
b1ms=1;
}
/*2051电子钟3
第3步:
2051基本电子钟、时分秒计时、显示功能、键盘修改时分功能
1、在数码管上显示时分秒:
00.00.00
2、可以用按键修改时分值
3、K1键=时+1;K2键=时-1K3键=分+1;K4键=分-1;
*/
#include
#include
#defintucharunsignedchar/*数据类型unsignedchar用宏定义为简写形式uchar*/
#defintuintunsignedint/*数据类型unsignedint用宏定义为简写形式uint*/
/*-------口位地址定义-----------*/
#defineFANGZHEN0/*仿真时不能调试P37*/
sbitLED1=P3^7;
sbitLED2=P3^5;
sbitBEEP=P3^3;
/*-----------全局常量--------------*/
#defineT0_VAL(65536-921)/*=0xfc67,T0重装值(11.0592Mhz时1ms)*/
/*------特殊字符定义---------------*/
#defineSPACE0x10/*空白*/
#defineBAR0x11/*一横*/
#defineCH_P0x12/*P*/
/*------键定义---------------*/
#defineKEY10x20
#defineKEY20x10
#defineKEY30x08
#defineKEY40x04
#defineKEY50x02
#defineKEY60x01
/*-----------全局字节变量----------*/
dataucharDispbuf[6];/*显示缓冲区00-0F:
数字,10-1F:
特殊*/
dataucharDispout[6];/*显示输出映像*/
dataucharKey1;
dataucharT_Beep;/*音响定时*/
datacharhour,min,sec; /*时钟分、秒*/
/*-----------全局位变量------------*/
bitb1ms;
/*-----------响铃n*10ms----------*/
voidBeep(ucharn)
{T_Beep=n;}
/*-----------在w处,显示00-99-----*/
voidDisp_99(ucharw,ucharv)
{
Dispbuf[w+0]=v/10;/*十位*/
Dispbuf[w+1]=v%10;/*个位*/
}
/*----------74LS138输出-----------*/
voidout_138(ucharn)
{P3=P3&~0x07|n;}/*P32,P31,P30为138译码输入*/
/*----------键盘输入-----------*/
voidkey_input(void)
{
P1=0xff;/*释放P1*/
out_138(7);/*138-Y7输出,选择键盘*/
Key1=~P1&0x3f; /*本次键*/
}
/*----------取键上沿-----------*/
ucharget_keySy(void)
{
staticuchark0;uchark1,ksy;
k1=Key1;
ksy=(k1^k0)&k1; /*键上沿*/
k0=k1;/*本次送上次*/
returnksy;
}
/*------键盘处理-------------*/
voidKeyPro(void)
{
ucharksy;
ksy=get_keySy();
if(ksy)/*有按键上沿*/
{
switch(ksy)
{
caseKEY1:
if(++hour>23)hour=0;break;
caseKEY2:
if(--hour<0)hour=23;break;
caseKEY3:
if(++min>59)min=0;break;
caseKEY4:
if(--min<0)min=59;break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子钟