模拟灌溉系统
1.題目
2.代碼
main.c
****************************************************************************** * 文件名:模擬灌溉系統(tǒng) * 描 述: * 作 者:思索與貓 * 日 期: 19/3/12 * 備 注: * ****************************************************************************** #include<stc15f2k60s2.h> #include<ds1302.h> #include<iic.h> typedef unsigned char uchar; typedef unsigned int uint;sbit buzz = P0^6; sbit relay = P0^4;uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x040};//10black,11- uchar dispbuff[8]; uchar shi,fen,humid,valve = 50; //時,分 ,濕度,閾值 uchar trg,cont; //KEY bit mode = 0, view = 0, buzz_flag = 0 , relay_flag = 0, warn_flag = 1; //function void CloseFucker(); void Timer0Init(); void Display(); void Show_Led_Number(); void Read(); void KeyScan(); void KeyAction(); void Fucker();void main() {Timer0Init();CloseFucker();init_pcf859();SetTime(8,30,00);valve = read_eeprom(0x55); //讀取eeprom里的閾值while(1){Read(); KeyScan();KeyAction();Show_Led_Number();Fucker();} }void T0_time() interrupt 1 {Display(); //顯示if(mode == 0) //LED{P2 = P2&0x1f|0x80;P0 = 0xfe; //L1亮P2 = P2&0x1f;}else if(mode == 1){P2 = P2&0x1f|0x80;P0 = 0xfd; //L1亮P2 = P2&0x1f;} }void Fucker() //繼電器,蜂鳴器 {if(buzz_flag){if(relay_flag){P2 = P2&0x1f|0xa0;buzz = 1;relay = 1;P2 = P2&0x1f;}else{P2 = P2&0x1f|0xa0;buzz = 1;relay = 0;P2 = P2&0x1f;}}else {if(relay_flag){P2 = P2&0x1f|0xa0;buzz = 0;relay = 1;P2 = P2&0x1f;}else{P2 = P2&0x1f|0xa0;buzz = 0;relay = 0;P2 = P2&0x1f;}} }void KeyAction() {if(trg == 0x01) //按下S7,切換模式{mode = ~mode;CloseFucker();view = 0;}else if(mode == 0&&trg == 0x02) //按下S6,切換界面{view = ~view;}else if(mode == 0&&view == 1&&trg == 0x04) //閾值+1{if(++valve == 99) valve = 99; write_eeprom(valve,0x55);}else if(mode == 0&&view == 1&&trg == 0x08) //閾值-1{if(--valve == 0) valve = 0; write_eeprom(valve,0x55);}else if(mode == 1&&trg == 0x02) //警告開關(guān){warn_flag = ~warn_flag;}else if(mode == 1&&trg == 0x04) //繼電器亮{relay_flag = 1;}else if(mode == 1&&trg == 0x08) //繼電器滅{relay_flag = 0;}}void KeyScan() //三行獨立按鍵 {uchar ReadData = P3^0xff;trg = ReadData&(ReadData^cont);cont = ReadData; }void Read() {shi = Ds1302_Single_Byte_Read(0x85); //讀時間Ds1302_Single_Byte_Write(0x00,0x00);fen = Ds1302_Single_Byte_Read(0x83);Ds1302_Single_Byte_Write(0x00,0x00); humid = read_pcf859(); //讀濕度,轉(zhuǎn)換humid = humid*99/255.0f;if(warn_flag == 1 && mode == 1&&humid < valve){buzz_flag = 1; //蜂鳴器}else{buzz_flag = 0;}if(mode == 0&&humid < valve){relay_flag = 1; //繼電器}else if(mode == 0&&humid >= valve){relay_flag = 0;} }void Show_Led_Number() {if(view == 0){ dispbuff[0] = shi/16;dispbuff[1] = shi%16;dispbuff[2] = 11;dispbuff[3] = fen/16;dispbuff[4] = fen%16;dispbuff[5] = 10;dispbuff[6] = humid/10;dispbuff[7] = humid%10;}else if(mode == 0&&view == 1){dispbuff[0] = 10;dispbuff[1] = 10;dispbuff[2] = 10;dispbuff[3] = 10;dispbuff[4] = 10;dispbuff[5] = 11;dispbuff[6] = valve/10;dispbuff[7] = valve%10;} }void Display() {static uchar index = 0;P2 = P2&0x1f|0xe0;P0 = 0xff;P2 = P2&0x1f;P2 = P2&0x1f|0xc0;P0 = 1<<index;P2 = P2&0x1f;P2 = P2&0x1f|0xe0;P0 = ~duan[dispbuff[index]];P2 = P2&0x1f;index++;index &= 0x07; }void Timer0Init() //2ms@12.000MHz {AUXR |= 0x80; TMOD &= 0xF0; TL0 = 0x40; TH0 = 0xA2; TF0 = 0; TR0 = 1; ET0 = 1;EA = 1; }void CloseFucker() {P2 = P2&0x1f|0xa0;P0 = 0xaf;P2 = P2&0x1f; }iic.h
#ifndef _IIC_H #define _IIC_H#include "stc15f2k60s2.h" #include "intrins.h"#define somenop Delay5us() #define SlaveAddrW 0xA0 #define SlaveAddrR 0xA1sbit SDA = P2^1; sbit SCL = P2^0; void IIC_Start(void); void IIC_Stop(void); void IIC_Ack(unsigned char ackbit); void IIC_SendByte(unsigned char byt); bit IIC_WaitAck(void); unsigned char IIC_RecByte(void); void Delay5us(); void write_eeprom(unsigned char dat,unsigned char add); unsigned char read_eeprom(unsigned char add); void init_pcf859(); unsigned char read_pcf859(); #endifiic.c
#include "iic.h" void Delay5us() //@12.000MHz {unsigned char i;_nop_();_nop_();i = 12;while (--i); }void IIC_Start(void) {SDA = 1;SCL = 1;somenop;SDA = 0;somenop;SCL = 0; }void IIC_Stop(void) {SDA = 0;SCL = 1;somenop;SDA = 1; }void IIC_Ack(unsigned char ackbit) {if(ackbit) { SDA = 0;}else {SDA = 1;}somenop;SCL = 1;somenop;SCL = 0;SDA = 1; somenop; }bit IIC_WaitAck(void) {SDA = 1;somenop;SCL = 1;somenop;if(SDA) { SCL = 0;IIC_Stop();return 0;}else { SCL = 0;return 1;} }void IIC_SendByte(unsigned char byt) {unsigned char i;for(i=0;i<8;i++){ if(byt&0x80) { SDA = 1;}else {SDA = 0;}somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;} }unsigned char IIC_RecByte(void) {unsigned char da;unsigned char i;for(i=0;i<8;i++){ SCL = 1;somenop;da <<= 1;if(SDA) da |= 0x01;SCL = 0;somenop;}return da; } void write_eeprom(unsigned char dat,unsigned char add) //寫eeprom {IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop(); } unsigned char read_eeprom(unsigned char add) //讀eeprom {unsigned char dat;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();dat = IIC_RecByte();IIC_Ack(0);IIC_Stop();return dat; } void init_pcf859() //pcf859初始化 {IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x03);IIC_WaitAck();IIC_Stop(); } unsigned char read_pcf859() //讀取AD值 {unsigned char dat;IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();dat = IIC_RecByte();IIC_Ack(0);IIC_Stop();return dat; }ds1302.h
#ifndef __DS1302_H__ #define __DS1302_H__#include<stc15f2k60s2.h> #include<intrins.h> /********************************************************************/ sbit SCK=P1^7; sbit SD=P2^3; sbit RST=P1^3; /********************************************************************/ #define RST_CLR RST=0 #define RST_SET RST=1 #define SDA_CLR SD=0 #define SDA_SET SD=1 #define SDA_R SD #define SCK_CLR SCK=0 #define SCK_SET SCK=1 /********************************************************************/ #define ds1302_sec_addr 0x80 #define ds1302_min_addr 0x82 #define ds1302_hr_addr 0x84 #define ds1302_date_addr 0x86 #define ds1302_month_addr 0x88 #define ds1302_day_addr 0x8A #define ds1302_year_addr 0x8C #define ds1302_control_addr 0x8E #define ds1302_charger_addr 0x90 #define ds1302_clkburst_addr 0xBE extern void Write_Ds1302_Byte(unsigned char dat); extern unsigned char Read_Ds1302_Byte(void);extern void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat);extern unsigned char Ds1302_Single_Byte_Read(unsigned char addr); void SetTime(unsigned char shi,unsigned char fen,unsigned char miao); #endifds1302.c
#include "ds1302.h" /********************************************************************/ void Write_Ds1302_Byte(unsigned char dat) {unsigned char i;SCK = 0;for (i=0;i<8;i++) { if (dat & 0x01) {SDA_SET; }else {SDA_CLR; } SCK_SET;SCK_CLR; dat = dat >> 1; } } /********************************************************************/ unsigned char Read_Ds1302_Byte(void) {unsigned char i, dat=0; for (i=0;i<8;i++){ dat = dat >> 1;if (SDA_R) {dat |= 0x80;}else {dat &= 0x7F;}SCK_SET;SCK_CLR;}return dat; }void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat) { RST_CLR; SCK_CLR; RST_SET; addr = addr & 0xFE; Write_Ds1302_Byte(addr);Write_Ds1302_Byte(dat); RST_CLR; }/********************************************************************/ unsigned char Ds1302_Single_Byte_Read(unsigned char addr) { unsigned char temp;RST_CLR; SCK_CLR; RST_SET; addr = addr | 0x01; Write_Ds1302_Byte(addr);temp=Read_Ds1302_Byte(); return temp; } void SetTime(unsigned char shi,unsigned char fen,unsigned char miao) //設(shè)置時分秒 {Ds1302_Single_Byte_Write(0x8e,0x00);Ds1302_Single_Byte_Write(0x80,(miao/10)*16+miao%10);Ds1302_Single_Byte_Write(0x82,(fen/10)*16+fen%10);Ds1302_Single_Byte_Write(0x84,(shi/10)*16+shi%10);Ds1302_Single_Byte_Write(0x8e,0x80); }總結(jié)
- 上一篇: java old区域_JVM内存区域详解
- 下一篇: 北斗三号系统精密单点定位服务解析与应用-