├── main.c ├── README.md ├── main.h ├── lcd1602.c └── dianji.c /main.c: -------------------------------------------------------------------------------- 1 | 2 | #include"main.h" 3 | 4 | 5 | void main() 6 | { init(); 7 | while(1) 8 | { 9 | Go(); //步进电机运行 10 | display(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 作品名称:智能养花系统 2 | 作品简介:由于主人不在家或者懒人朋友们的疏于照顾,可能导致花卉干枯乃至死亡。本作品设计目的在于可以实现完全自动的养花系统不需要人为操作,避免了无人照看时花卉会死亡的情况甚至可以比人为干预下更好的实现花卉的养护工作。 3 | 本作品用52单片机控制通过检测土壤湿度实现自动浇水;用电机带动转盘实现自动旋转,满足植物对光照的需求;GSM通信,使用户可以通过手机短信控制植物生长状态,并有闲时聊天功能,更加人性化。 4 | -------------------------------------------------------------------------------- /main.h: -------------------------------------------------------------------------------- 1 | #include 2 | #define uchar unsigned char 3 | #define uint unsigned int 4 | #define speed 110 5 | #define water D0 6 | 7 | 8 | void delay(int time); 9 | void Go(); 10 | 11 | void delayms(uint xms); 12 | void write_com(uchar com); 13 | void write_data(uchar date); 14 | void init(); 15 | uint keyscan(void); 16 | void display(); 17 | -------------------------------------------------------------------------------- /lcd1602.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define uchar unsigned char 3 | #define uint unsigned int 4 | #define water D0 5 | sbit water=P3^0; 6 | sbit EN=P2^7; 7 | sbit RS=P2^6; 8 | sbit RW=P2^5; 9 | sbit dula=P2^6; 10 | sbit wela=P2^7; 11 | sbit key1=P3^1; 12 | sbit key2=P3^2; 13 | sbit RELAY=P3^3; 14 | sbit led1=P2^1; 15 | sbit led2=P2^2; 16 | uchar code watering[]="I want watering!"; 17 | uchar code fine[]="I am very fine!!"; 18 | uchar code chat[]=" Chat with me~ "; 19 | uchar code message[]=" message "; 20 | uchar num; 21 | uint x; 22 | 23 | void delayms(uint xms) 24 | { 25 | uint i,j; 26 | for(i=xms;i>0;i--) 27 | for(j=110;j>0;j--); 28 | } 29 | 30 | void write_com(uchar com) 31 | { 32 | RS=0; 33 | P0=com; 34 | delayms(5); 35 | EN=1; 36 | delayms(5); 37 | EN=0; 38 | } 39 | 40 | void write_data(uchar date) 41 | { 42 | RS=1; 43 | P0=date; 44 | delayms(5); 45 | EN=1; 46 | delayms(5); 47 | EN=0; 48 | } 49 | 50 | void init() 51 | { 52 | RW=0; 53 | EN=0; 54 | write_com(0x38); 55 | write_com(0x0c); 56 | write_com(0x06); 57 | write_com(0x01); 58 | } 59 | 60 | 61 | uint keyscan(void) 62 | { 63 | static uint a; 64 | if(key1==0 || key2==0) 65 | { 66 | // led1=0; 67 | // led2=0; 68 | delayms(2); //20毫秒软件消抖 69 | if(key1 == 0) 70 | { 71 | a=0; 72 | led1=1; 73 | led2=0; 74 | } 75 | else if(key2 == 0) 76 | { 77 | a=1; 78 | led2=1; 79 | led1=0; 80 | } 81 | } 82 | else 83 | { 84 | led1=0; 85 | led2=0; 86 | } 87 | return a; 88 | } 89 | 90 | void autowater() 91 | { 92 | if(water) 93 | { 94 | RELAY = 0; //继电器闭合 95 | write_com(0x80); 96 | for(num=0;num<16;num++) 97 | { 98 | write_data(watering[num]); 99 | delayms(5); 100 | } 101 | } 102 | else 103 | { 104 | RELAY=1; 105 | write_com(0x80); 106 | for(num=0;num<16;num++) 107 | { 108 | write_data(fine[num]); 109 | delayms(5); 110 | } 111 | } 112 | } 113 | 114 | void gsmwater() /*gsm控制模块,需要改动*/ 115 | { 116 | if(water) 117 | { 118 | RELAY = 0; //继电器闭合 119 | write_com(0x80); 120 | for(num=0;num<16;num++) 121 | { 122 | write_data(message[num]); 123 | delayms(5); 124 | } 125 | } 126 | else 127 | { 128 | RELAY=1; 129 | write_com(0x80); 130 | for(num=0;num<16;num++) 131 | { 132 | write_data(chat[num]); 133 | delayms(5); 134 | } 135 | } 136 | } 137 | 138 | 139 | 140 | void display() 141 | { 142 | x=keyscan(); 143 | switch(x) 144 | { 145 | case 0: 146 | autowater(); 147 | break; 148 | case 1: 149 | gsmwater(); 150 | break; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /dianji.c: -------------------------------------------------------------------------------- 1 | /************************************************************************************* 2 | * 标题: 步进电机试验四(采用2细分) * 3 | * * 4 | * 通过本例程了解步进马达使用及驱动程序编写 * 5 | *; 单相四拍通电驱动时序: * 6 | *; 正转: A/ B A B/ * 7 | * 反转: B/ A B A/ * 8 | * * 9 | * UDN2916电流控制真值表: * 10 | * I0 I1 输出电流 * 11 | * L L 最大 * 12 | * H L 最大*2/3 * 13 | * L H 最大*1/3 * 14 | * H H 0 * 15 | * 请学员一定要消化掉本例程 * 16 | * 注意:J14短路冒需断开 * 17 | **************************************************************************************/ 18 | #include 19 | 20 | 21 | #define speed 110 22 | //Motor 23 | sbit PH1 = P1^0; //定义管脚 24 | sbit PH2 = P1^1; 25 | sbit I01 = P1^2; 26 | sbit I11 = P1^3; 27 | sbit I02 = P1^4; 28 | sbit I12 = P1^5; 29 | 30 | unsigned char TableA[] = { 0XF7,0XFB,0XF3}; //A线圈细分表 31 | unsigned char TableB[] = { 0XeF,0XdF,0XcF}; //B线圈细分表 32 | 33 | void delay(int time); 34 | 35 | /*************************************** 36 | 函数功能:产生单相四拍脉冲控制步进机 2细分 37 | **************************************/ 38 | void Go() 39 | { char i ,temp; 40 | //A 41 | PH1 = 0; //PH1为0 则A线圈为反向电流 42 | for(i = 0; i<3; i++) 43 | { temp = P1; 44 | P1 = TableA[i]; 45 | P1 = P1&temp; 46 | delay(1); 47 | } 48 | 49 | 50 | PH2 = 0; //PH2为0 则B线圈为反向电流 51 | I02 = 1; 52 | I12 = 1; //输出0 53 | 54 | delay(speed); 55 | //0 56 | PH1 = 0; //PH1为0 则A线圈为反向电流 57 | I01 = 1; //输出0 58 | I11 = 1; 59 | 60 | 61 | PH2 = 1; //PH2为1 则B线圈为正电流 62 | for(i = 0; i<3; i++) 63 | { temp = P1; 64 | P1 = TableB[i]; 65 | P1 = P1&temp; 66 | delay(1); 67 | } 68 | 69 | delay(speed); 70 | //B 71 | PH1 = 1; //PH1为1 则A线圈为正向电流 72 | for(i = 0; i<3; i++) 73 | { temp = P1; 74 | P1 = TableA[i]; 75 | P1 = P1&temp; 76 | delay(1); 77 | } 78 | 79 | PH2 = 1; //PH2为1 则B线圈为正向电流 80 | I02 = 1; //输出0 81 | I12 = 1; 82 | //// 83 | delay(speed); 84 | //0 85 | PH1 = 1; //PH1为1 则A线圈为正向电流 86 | I01 = 1; 87 | I11 = 1; 88 | 89 | 90 | PH2 = 0; //PH2为0 则B线圈为反向电流 91 | for(i = 0; i<3; i++) 92 | { temp = P1; 93 | P1 = TableB[i]; 94 | P1 = P1&temp; 95 | delay(1); 96 | } 97 | delay(speed); 98 | 99 | 100 | 101 | } 102 | /*******************延时函数****************************/ 103 | void delay(int time) 104 | { 105 | int i,j; 106 | 107 | for(j=0; j <= time; j++) 108 | for(i =0 ; i <= 120; i++); 109 | } 110 | 111 | 112 | 113 | --------------------------------------------------------------------------------