- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include "XPT2046.h"
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- u8 receiveData;
- sbit led=P2^4; //手動運行指示燈
- sbit xcg=P3^2; //左行程開關
- sbit xck=P3^3; //右行程開關
- u8 tab[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
- u8 a=0,b=1;//用于記憶行程開關狀態
- void delay(u16 i)//延時函數
- {
- while(i--);
- }
- void UsartConfiguration()
- {
- /* SCON=0X50; //設置為工作方式1
- TMOD=0X20; //設置定時器1工作方式2
- PCON = 0x00;
- TH1=0XFD; //定時器裝初值(波特率為9600)
- TL1=0XFD;
- ES=1; //開串行中斷
- EA=1; //開總中斷
- TR1=1; //啟動定時器1
- */
- /*
- PCON |= 0x80; //使能波特率倍速位SMOD 12M 9600
- SCON = 0x50; //8位數據,可變波特率
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xF9; //設定定時初值
- TH1 = 0xF9; //設定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- */
-
- PCON &= 0x7F; //波特率不倍速 12M 2400
- SCON = 0x50; //8位數據,可變波特率
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xF3; //設定定時初值
- TH1 = 0xF3; //設定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
-
-
- /* PCON &= 0x7F; //波特率不倍速 11.0592M 9600
- SCON = 0x50; //8位數據,可變波特率
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設定定時器1為8位自動重裝方式
- TL1 = 0xFD; //設定定時初值
- TH1 = 0xFD; //設定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1*/
- ES=1; //開串行中斷
- EA=1; //開總中斷
- }
- void motor1()//關窗簾
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- P1=tab[i];
- delay(180);
- }
- }
- void motor2()//開窗簾
- {
- char i;
- for(i=7;i>=0;i--)
- {
- P1=tab[i];
- delay(180);
- }
- }
- void xcg1()
- {
- if(xcg==0) //檢測按鍵是否按下
- {
- delay(600); //消除抖動 一般大約10ms
- if(xcg==0) //再次判斷按鍵是否按下
- {
- a=0;
- b=1;
- }
- }
- }
- void xck1()
- {
- if(xck==0) //檢測按鍵是否按下
- {
- delay(600); //消除抖動 一般大約10ms
- if(xck==0) //再次判斷按鍵是否按下
- {
- a=1;
- b=0;
- }
- }
- }
- u8 SS='s';
- u8 ZZ='z';
- u8 TT='t';
- u8 KK='k';
- u8 GG='g';
- void main()
- {
- u16 light,mode=1;//開機進入自動模式(mode=1)
- UsartConfiguration();
- while(1)
- {
- while(mode==1)//自動模式
- {
- led=1;
- light=Read_AD_Data(0xA4);//讀取光敏電阻值
- if(receiveData==SS){mode=0;break;}//手動模式
- while (a==1&&light<150)//關窗簾
- {
- if(receiveData==SS){mode=0;light=150;break;}
- while(receiveData==TT){P1=0xFF;}
- motor1();
- xcg1();
- b=1;
- }
- while (b==1&&light>200)//開窗簾
- {
- if(receiveData==SS){mode=0;light=200;break;}
- while(receiveData==TT){P1=0xFF;}
- motor2();
- xck1();
- a=1;
- }
- P1=0xFF;//電機斷電停止
- // delay(100);
- }
- while(mode==0)//手動模式
- {
- led=0;//手動控制指示燈
- if (receiveData==ZZ){mode=1;break;}
- while (a==1&&receiveData==GG)//關窗簾
- {
- motor1();
- b=1;
- xcg1();
- while(receiveData==TT){P1=0xFF;}
- }
- while (b==1&&receiveData==KK)//開窗簾
- {
- motor2();
- a=1;
- xck1();
- while(receiveData==TT){P1=0xFF;}
- }
- P1=0xFF;
- // delay(100);
- }
- }
- }
- void Usart() interrupt 4 //串行口中斷
- {
- if(RI)
- {
- receiveData=SBUF; //接收數據
- RI = 0; //清除接收中斷標志位
- }
- }
復制代碼
|