作息时间为主多功能设计.docx
- 文档编号:25218056
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:22
- 大小:19.02KB
作息时间为主多功能设计.docx
《作息时间为主多功能设计.docx》由会员分享,可在线阅读,更多相关《作息时间为主多功能设计.docx(22页珍藏版)》请在冰豆网上搜索。
作息时间为主多功能设计
#include
#include
#defineucharunsignedchar
#defineuintunsignedint//宏定义
/***********************************************************************
以下是DS1302芯片的操作程序
************************************************************************/
ucharcodedigit[10]={"0123456789"};//定义字符数组显示数字
sbitRST=P0^1;//位定义1302芯片的接口,复位端口定义
sbitDATA=P0^2;//位定义1302芯片的接口,数据输出端定义
sbitSCLK=P0^0;//位定义1302芯片的接口,时钟输出端口定义
sbitLED=P2^5;
sbitdula=P2^6;//数码管段选锁存端
sbitwela=P2^7;////数码管位选锁存端
sbitRS=P3^5;
sbitRW=P3^6;
sbitDD=P3^7;
sbitE=P3^4;
sbitBF=P0^7;//忙碌标志位,,将BF位定义
sbitfm=P2^3;
chark=0,q=0,w=0,e=0,r=12,t=11,y=5,u=10;
ucharcodetable1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};//LED字段
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
ucharge,shi,bai,qian;
uinttt;
voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);//函数声明
voiddelay(uint);
/*数码管显示模块函数*/
voiddisplaymain()
{
uintttt;
{
TMOD=0x10;//设置定时器1为工作方式1
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;//开总中断y
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
for(ttt=5000;ttt>0;ttt--)
{
display(0,0,qian,bai,shi,ge);
}
TR1=0;
}
}
voidexter0()interrupt3//定时器1中断
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
tt++;
if(tt==60000)
tt=0;
qian=tt/1000;
bai=tt/100%10;
shi=tt%10%10;
ge=tt%10;
}
voiddisplay(ucharone,uchartwo,ucharthree,ucharfour,ucharfive,ucharsix)
{
dula=1;
P0=table[one];//送段数据
dula=0;
P0=0xff;//送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器
wela=1;
P0=0xfe;
wela=0;
delay
(1);
dula=1;
P0=table[two];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay
(1);
dula=1;
P0=table[three];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay
(1);
dula=1;
P0=table[four];//送段数据
dula=0;
P0=0xff;//送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器
wela=1;
P0=0xf7;
wela=0;
delay
(1);
dula=1;
P0=table[five];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay
(1);
dula=1;
P0=table[six];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay
(1);
}
/**/
voiddelay(uintz)//延时子函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*蜂鸣器*/
voidSPEAKER()//蜂鸣器
{
ucharx;
for(x=10;x>0;x--)
{
delay(100);
fm=0;
delay(100);
fm=1;
}
}
/*流水灯显示*/
voidLLED()//流水灯函数闪烁10S
{
ucharx,n1;
for(x=32;x>0;x--)
{
LED=1;
P1=table1[n1];
delay(200);
n1=n1+1;
if(n1==8)
n1=0;
}
P1=table1[8];
}
/***函数功能:
延时程序******/
voiddelaynus(ucharn)
{
unsignedchari;
for(i=0;i ; } /****函数功能: 向1302写一个字节数据****/ voidWrite1302(uchardat) { uchari; SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus (2);//稍微等待,使硬件做好准备 for(i=0;i<8;i++)//连续写8个二进制位数据 { DATA=dat&0x01;//取出dat的第0位数据写入1302 delaynus (2);//稍微等待,使硬件做好准备 SCLK=1;//上升沿写入数据 delaynus (2);//稍微等待,使硬件做好准备 SCLK=0;//重新拉低SCLK,形成脉冲 dat=dat>>1;//将dat的各数据位右移1位,准备写入下一个数据位 } } /***************************************************** 函数功能: 根据命令字,向1302写一个字节数据 入口参数: Cmd,储存命令字;dat ***************************************************/ voidWriteSet1302(ucharCmd,uchardat) { RST=0;//禁止数据传递 SCLK=0;//确保写数居前SCLK被拉低 RST=1;//启动数据传输 delaynus (2);//稍微等待,使硬件做好准备 Write1302(Cmd);//写入命令字 Write1302(dat);//写数据 SCLK=1;//将时钟电平置于已知状态 RST=0;//禁止数据传递 } /***************************************************** 函数功能: 从1302读一个字节数据 ***************************************************/ ucharRead1302(void) { uchari,dat; delaynus (2);//稍微等待,使硬件做好准备 for(i=0;i<8;i++)//连续读8个二进制位数据 {dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA==1)//如果读出的数据是1 dat|=0x80;//将1取出,写在dat的最高位 SCLK=1;//将SCLK置于高电平,为下降沿读出 delaynus (2);//稍微等待 SCLK=0;//拉低SCLK,形成脉冲下降沿 delaynus (2);//稍微等待 } returndat;//将读出的数据返回 } /***************************************************** 函数功能: 根据命令字,从1302读取一个字节数据 入口参数: Cmd ***************************************************/ ucharReadSet1302(ucharCmd) { unsignedchardat; RST=0;//拉低RST SCLK=0;//确保写数居前SCLK被拉低 RST=1;//启动数据传输 Write1302(Cmd);//写入命令字 dat=Read1302();//读出数据 SCLK=1;//将时钟电平置于已知状态 RST=0;//禁止数据传递 returndat;//将读出的数据返回 } /***************************************************** 函数功能: 1302进行初始化设置 ***************************************************/ voidInit_DS1302(void) { WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((50/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((50/10)<<4|(9%10)));//根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((0/10)<<4|(5%10)));//根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((10/10)<<4|(11%10)));//根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((0/10)<<4|(15%10)));//根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8a,((5/10)<<4|(5%10)));//根据写星期寄存器命令字,写入星期的初始值 WriteSet1302(0x8c,((10/10)<<4|(12%10)));//根据写年寄存器命令字,写入年的初始值 } /******************************************************************************* /***************************************************** 函数功能: 延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ voiddelay1ms() { unsignedchari,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能: 延时若干毫秒 入口参数: n ***************************************************/ voiddelaynms(ucharn) { unsignedchari; for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ bitBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(uchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 ***************************************************/ voidWriteAddress(ucharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 ***************************************************/ voidWriteData(uchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38);//连续三次,确保初始化成功 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5);//延时5ms ,给硬件一点反应时间 } /************************************************************** 以下是1302数据的显示程序 **************************************************************/ /***************************************************** 函数功能: 显示秒 ***************************************************/ voidDisplaySecond(ucharx) { unsignedchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x49);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(40);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示分钟 ***************************************************/ voidDisplayMinute(ucharx) { uchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x46);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD if(j==0) SPEAKER(); delaynms(40);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示小时 ***************************************************/ voidDisplayHour(ucharx) { uchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x43);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(40);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示日 ***************************************************/ voidDisplayDay(ucharx) { uchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x0b);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(40);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示月 ***************************************************/ voidDisplayMonth(ucharx) { uchari,j;//j,k,l分别储存温度的百位、十位和个位 i=x/10;//取十位 j=x%10;//取个位 WriteAddress(0x08);//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCD WriteData(digit[j]);//将十位数字的字符常量写入LCD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作息 时间 为主 多功能 设计
