资讯详情

单片机智能家居之-窗帘控制器(上电自动识别位置)

这是一单片机程序 下面是电路图

//------------------------------------------------------------------------------------ // Copyright (C) 2011 Shenyang 818. // by WEN K // Tool chain: Full 'c' //

//#pragma CD OE SB// Compilation directives

#include "C8051F310.h" #define uint unsigned int #define uchar unsigned char sbit LED = P3^3 ;//led 端口 sbit ZQ = P1^0 ;//正转继电器端口 sbit FJDQ = P1^1 ;//反转继电器端口 sbit HEL = P2^0 ;//左侧霍尔检测端口 暂定左侧为窗帘拉开 sbit HER = P2^1 ;//右侧霍尔检测端口 暂定右侧为窗帘拉上 extern void Init_(void); uchar code CST_c[8] _at_ 0x1fff; //存储参数地址 uchar xdata CST_x[8] _at_ 0x1fff; uchar Flage; uchar xdata Between[8]; void Flash_Erase_C() //flash擦除原来参数 { EA =0; //V0CN = 0x80; //RSTSRC = 0x02; //FLSCL=0X80; PSCTL |= 0x03; //允许擦,允许写 FLKEY = 0xA5; // 写入关键字 FLKEY = 0xF1; // 写入关键字 CST_x[0] = 0;//写入任意数 PSCTL&=~0x03; //禁止写,禁止擦 //EA = 1; } void Flash_Program_CSP() //flash写入充电时间时间和功率 { uchar j; EA =0; //VDM0CN = 0x80; //RSTSRC = 0x02; //FLSCL = 0x80; PSCTL |= 0x01; //允许写 for(j =0;j<7;j++) { FLKEY = 0xa5; FLKEY = 0xf1; CST_x[j] = Between[j];//写数据到FL } PSCTL&=~0x01; //禁止写 EA = 1; } void main () { uchar m = 0; uchar n = 0; uchar k = 0; //uchar i; Init_Device();//初始化 Flage = CST_c[0];//读取FLASH内参数 TMR3CN = 0x04; while(1) { switch(Flage) { case 0xff: { if(HER) { ZJDQ = 0;//最初上电默认开始把窗帘拉上 } if(!HER) { ZJDQ = 1;//检测到右侧霍尔信号,停止 if(!m)//只有m=0时,存储一次标志到FLASH;保证FLASH寿命 { m = 1; Between[0] = 0x3d;//存储当前状态标志到FLASH,以备下次调用 Flash_Erase_CSP(); Flash_Program_CSP(); m = 1;//写完一次后置1,靠重上电清零 } } } break; case 0x3d: { if(HEL) { FJDQ = 0;//开始把窗帘拉开 } else { FJDQ = 1;//检测到左侧霍尔信号,停止电机 if(!n)//只有n=0时,存储一次标志到FLASH;保证FLASH寿命 { Between[0] = 0xd3; Flash_Erase_CSP(); Flash_Program_CSP(); n = 1;//写完一次后置1,靠重上电清零 } } } break; case 0xd3: { if(HER) { ZJDQ = 0;//开始把窗帘拉上 } else { ZJDQ = 1;//检测到右侧霍尔信号,停止电机 if(!k)//只有k=0时,存储一次标志到FLASH;保证FLASH寿命 { Between[0] = 0x3d;//存储当前状态标志到FLASH,以备下次调用 Flash_Erase_CSP(); Flash_Program_CSP(); k = 1; //存储一次后置1,靠重上电清零 } } } break; default:break; } } } //----------------------------------------------------------------------------- //TIMER3中断 //----------------------------------------------------------------------------- void Timer3_ISR(void) interrupt 14 { static uchar count; TMR3CN &=~(0x80); //清标志位 count++; if(count == 20) //500ms { count = 0; LED = ~LED;//LED闪烁 } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台