基于单片机控制的新型智能台灯 - 图文 联系客服

发布时间 : 星期日 文章基于单片机控制的新型智能台灯 - 图文更新完毕开始阅读ed72f956c850ad02de8041f5

哈尔滨理工大学学士学位论文

附录A

系统整体电路图

- 32 -

哈尔滨理工大学学士学位论文

附录B

/*头文件*/

#include #include

#define uint unsigned int #define uchar unsigned char #define nop() _nop_()

sbit lcd_rs_port = P3^5; /*定义LCD控制端口*/ sbit lcd_rw_port = P3^6; sbit lcd_en_port = P3^4; #define lcd_data_port P0 #define LED P2

sbit guang1=P1^5;//感光检测端口1 sbit guang2=P1^6;//感光检测端口2 sbit hongwai=P1^7;//红外检测端口 sbit beep=P3^0;//蜂鸣器控制端口 sbit rest=P3^1;//休息电路控制端口

sbit T_CLK = P3^2; /*实时时钟时钟线引脚 */ sbit T_IO = P3^7; /*实时时钟数据线引脚 */ sbit T_RST = P3^3; /*实时时钟复位线引脚 */ sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;

sbit s1=P1^0;//功能选择键 sbit s2=P1^1;//加一键 sbit s3=P1^2;//减一键 sbit s4=P1^3;//确认键 sbit s5=P1^4;//调整光强键

bit flag;//标志位flag,表示是否进入调时状态 uint snum;//s1键按下的次数 uint snum1;//s5键按下的次数

uchar miao,fen,shi,ri,yue,nian,zhou,temp;

uchar code mun_to_char[] = {\/*定义数字跟ASCII码的关系*/ uchar data time_data_buff[7]={0x45,0x59,0x21,0x20,0x06,0x04,0x13};/*格式为:

- 33 -

哈尔滨理工大学学士学位论文

秒 分 时 日 月 星期 年 */ uchar data lcd1602_line1[]={%uchar data lcd1602_line2[]={%uchar code Weeks[][3]={{\T\

uchar code REST1[]={%uchar code REST2[]={\

/************************按键扫描***********************/ void keyscan() {

if(s1==0) //按键1按下,时间停止,显示光标,移动 {

delay(60);//延时去抖 if(s1==0) { flag=1;//标志置1,进入调试为 lcd_command_write(0x0f);//显示光标 lcd_command_write(0x80+0x40+7); miao=time_data_buff[0]; //把读取的值保存到秒 fen=time_data_buff[1]; shi=time_data_buff[2]; ri=time_data_buff[3]; yue=time_data_buff[4]; zhou=time_data_buff[5]; nian=time_data_buff[6]; snum++;//s1键按下的次数 while(!s1);//等待键释放 if(snum==1)//按下s1的次数为1,光标在秒处 { lcd_command_write(0x80+0x40+7); }//光标移动到“秒”处 if(snum==2)//按下s1的次数为2,光标移动到分处 { lcd_command_write(0x80+0x40+4); } if(snum==3)//按下s1的次数为1,光标在小时处 { lcd_command_write(0x80+0x40+1); } if(snum==4)//按下s1的次数为1,光标在日期处 { lcd_command_write(0x80+9); } if(snum==5)//按下s1的次数为1,光标在月份处 { lcd_command_write(0x80+6); }

- 34 -

哈尔滨理工大学学士学位论文

if(snum==6)//按下s1的次数为1,光标在年份处 { lcd_command_write(0x80+3); } if(snum==7)//按下s1的次数为1,光标在星期处 { lcd_command_write(0x80+13); } if(snum==8)snum=0;//snum清零回到秒处 } } if(s2==0) //s2键按下,说明光标处加一 { delay(60);//延时去抖 if(s2==0) { while(!s2); if(snum==1) //秒 60秒 { int x1,x2,i; lcd_command_write(0x80+0x40+7); x1=miao%0x10;//秒的个位 把秒16进制转换为十进制 x2=miao/0x10;//秒的十位 x1++; //秒的个位自加一 if(x1>=10) {x1=0;x2++;if(x2>=6)x2=0;}//个位加满10后,清零,向十位进一,十位加到6后,清零 miao=x1+x2*16; //把十进制转换为十六进制 time_data_buff[0]=miao; //把秒送到time_data_buff保存 lcd1602_line2[6]=mun_to_char[miao/0x10]; lcd1602_line2[7]=mun_to_char[miao%0x10];

for(i=6;i<8;i++)lcd_char_write(i,1,lcd1602_line2[i]);//显示秒 } if(snum==2) //分 60分 { int x1,x2,i; lcd_command_write(0x80+0x40+4); x1=fen%0x10;//分的个位 x2=fen/0x10;//分得十位 x1++; if(x1>=10)

- 35 -