智能家居系统 单片机部分的源代码
反正这个东西也是玩玩的 放在我这里 还不如大家一起用
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P3^5;
sbit LCD_RW = P3^6;
sbit LCD_EN = P3^7;
sbit K0 = P1^0;
sbit K1 = P1^1;
sbit K2 = P1^2;
sbit K3 = P1^3;
sbit K4 = P1^4;
sbit K5 = P1^5;
sbit K6 = P1^6;
sbit K7 = P1^7;
uchar data RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 }; //
uchar temp,buf,m,count,playflag,KK;
uchar code cdis1[ ] = {"JHome System----"};
uchar code cdis2[ ] = {" "};sbit k1=P3^2;// 用sbit 关键字 定义 LED到P0.0端口,
sbit k2=P3^3; //LED是自己任意定义且容易记忆的符号/**********************************************************
延时子程序
**********************************************************/
void delay1(uint ms)
{
uchar k;
while(ms--)
{
for(k=0;k<10;k++);
}
}void Delay(unsigned int t)
{
while(--t);
}
/******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delay1(1);
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
delay1(1);
LCD_EN = 1;
delay1(1);
LCD_EN = 0;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delay1(2);
LCD_EN = 1;
delay1(2);
LCD_EN = 0;
}
/*******************************************************************/
/* LCD初始化设定 */
/*******************************************************************/
void lcd_init()
{
delay1(15);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0f); //开显示,显示光标,光标闪烁
delay1(5);
lcd_wcmd(0x06); //光标设置
delay1(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay1(5);
}
/*******************************************************************/
/* 设定显示位置 */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos+0x80); //数据指针=80+地址变量
}
/*********************************************************
发送数据函数
*********************************************************/
//void senddata(uchar dat)
//{
// SBUF =dat;
// while(!TI);
// TI=0;
//}
/*********************************************************
串行中断服务函数
*********************************************************/
void serial() interrupt 4
{
// uchar i;
ES=0; //关闭串行中断
RI=0; //清除串行接受标志位
buf=SBUF; //从串口缓冲区取得数据
playflag=1;
if(buf!=0x0D)
{
if(buf!=0x0A)
{
temp=buf;
if(count<32)
{
RXDdata[count]=temp;
count++;
}}
}
ES = 1; //允许串口中断
}
/*********************************************************
数据显示函数
*********************************************************/
void play()
{if(playflag==1)
{
lcd_pos(0x00); //设置位置为第二行
for(m=0;m<16;m++)
lcd_wdat(RXDdata[m]); //清LCD1602第二行
for(m=0;m<16;m++)
{
lcd_pos(0x40+m); //设置显示位置为第二行
// RXDdata[m]=cdis2[m];
lcd_wdat(RXDdata[m+16]); //显示字符
}
//在显示数据之后 执行指令
// 指令格式 J-CMD-OFF-K0
// J-CMD-ON--K0
// J-CMD-LEFT
// J-CMD-RIGHT
//
// //收到 J-CMD-
if (RXDdata[0]=='J' && RXDdata[1]=='-' && RXDdata[2]=='C' && RXDdata[3]=='M' && RXDdata[4]=='D' && RXDdata[5]=='-' )
{
//RXDdata[17]=0x40;// 是否收到LEFT
if (RXDdata[6]=='L' && RXDdata[7]=='E' && RXDdata[8]=='F' && RXDdata[9]=='T' )
{
k1=1;
k2=0;
Delay(5000);
k1=0;
k2=0;
}
// 是否收到RIGHT
if (RXDdata[6]=='R' && RXDdata[7]=='I' && RXDdata[8]=='G' && RXDdata[9]=='H' && RXDdata[10]=='T' )
{
k1=0;
k2=1;
Delay(5000);
k1=0;
k2=0;
}
if (RXDdata[6]=='O' && RXDdata[7]=='N' && RXDdata[8]=='-' && RXDdata[9]=='-' )
{
KK=0;
}
if (RXDdata[6]=='O' && RXDdata[7]=='F' && RXDdata[8]=='F' && RXDdata[9]=='-' )
{
KK=1;
}
if (RXDdata[9]=='-' )
{
if (RXDdata[10]=='K' && RXDdata[11]=='0' )
{
K0=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='1' )
{
K1=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='2' )
{
K2=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='3' )
{
K3=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='4' )
{
K4=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='5' )
{
K5=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='6' )
{
K6=KK;
}if (RXDdata[10]=='K' && RXDdata[11]=='7' )
{
K7=KK;
}}
}//清除数据接收标记等
playflag=0;
count=0x00;
for(m=0;m<32;m++)
RXDdata[m]=0x20; //清显存单元
}
}
/*********************************************************
主函数
*********************************************************/
void main(void)
{
P0 = 0xff;
P1 = 0xff;
k1=0; //将P0.0口赋值 0,对外输出低电平
k2=0;
KK=0;
// SCON=0x50; //设定串口工作方式
// PCON=0x00; //波特率不倍增
// TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES = 1; //允许串口中断
// TL1=0xfd;
// TH1=0xfd; //波特率9600
// TR1=1;
SCON=0x50; //串口工作方式1,8位UART,波特率可变
TH2=0xFF;
TL2=0xFD; //波特率:115200 晶振=11.0592MHz
RCAP2H=0xFF;
RCAP2L=0xFD; //16位自动再装入值/*****************/
TCLK=1;
RCLK=1;
C_T2=0;
EXEN2=0; //波特率发生器工作方式/*****************/
TR2=1 ; //定时器2开始
lcd_init();
lcd_pos(0x00); //设置显示位置为第一行
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]); //显示字符
while(1)
{
play();
}
}
这几天在学习用无线路由器组建WIFI遥控开关