//----------------------------------------------------------------------------------------------------------------------------------
//程序名: main.c 2017/8/16
//程序功能:安卓手機藍牙控制繼電器程序并用1602顯示*
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar buf[10]=0; //接收緩存數組
uchar r_x=0;//接收計數
uchar r_flag=0;//接收成功標志
sbit SPK=P0^5;
sbit DA = P1^7;//繼電器1
sbit DB = P1^6;//繼電器2
sbit DC = P1^5;//繼電器3
sbit DD = P1^4;//繼電器4
sbit RS=P2^6; // 引腳定義
sbit RW=P2^5;
sbit EN=P2^7;
sbit busy=P0^7; // "忙"標志位
void fs_d () ;
#define LCD P0 //命令或數據線
unsigned char code TAB1[]={"Welcome to use"}; //歡迎用語
unsigned char code TAB2[]={"Light up"}; //點亮字符
unsigned char code TAB3[]={"open"}; //定義字符打開
unsigned char code TAB4[]={"Shut down"}; //定義字符關閉
unsigned char code digit[10]={"0123456789"}; //定義字符數組顯示數字
//------------------------------------ 延時函數 -------------------------------------------
void delay(unsigned int t) //延時若干微秒
{
while(t--);
}
//----------------------------------------- 發聲函數 ----------------------------------------------
void fs_d ()
{
unsigned int j,y; // 聲明無符號整型變量j, y
{
for(y=0;y<1000;y++) //循環1000次,嘀響0.5s
{
SPK=~SPK; //反相輸出
for(j=0;j<50;j++); //延時約500μs
}
delay(200);
}
}
//---------------------------------- 判斷液晶顯示器是否忙函數 ----------------------------------
void CHECK_BF() //判斷是否忙碌
{
do
{
LCD=0xff;
RS=0; // RS=0,選擇指令寄存器
RW=1; // RW=1,選擇讀模式
EN=0; // 執行顯示命令
EN=1; // 允許讀/寫
}
while(busy); //busy為高電平表示忙,循環等待
}
//-------------------------------------- 寫命令函數 -----------------------------------
void WR_COMM() //寫命令
{
RS=0; // RS=0,選擇指令寄存器
RW=0; // RW=0,選擇寫模式
EN=0; // 執行顯示命令
CHECK_BF(); // 等待
EN=1; // E=1,允許讀/寫LCD
}
//-------------------------------------- 寫數據函數 -------------------------------------
void WR_DATA() //寫數據
{
RS=1; // RS=1,選擇數據寄存器
RW=0; //準備寫入數據
EN=0; //執行顯示命令
CHECK_BF(); //判斷液晶模塊是否忙
EN=1; // E=1,允許讀/寫LCD
}
//--------------------------------------- 初始化函數 ----------------------------------
void INIT_LCD() //初始化
{
unsigned char i=200;
{
while(--i);
LCD=0x01; //清屏并光標復位
WR_COMM(); //寫入命令
LCD=0x38; //設置顯示模式:8位2行5x7點陣
WR_COMM();
LCD=0x0c; //開顯示屏
WR_COMM();
LCD=0x06; //文字不動,光標自動右移
WR_COMM(); //寫入命令
}
}
//------------------------------------------ 顯示歡迎用語字符菜單函數 ------------------------------------------------
void DISP_EXP (void)
{
unsigned char i;
LCD=0x80; //寫入顯示起始地址
WR_COMM(); //寫入命令
for(i=0;i<15;i++)
{
LCD=TAB1[i]; //提取字符
WR_DATA(); //送出
}
}
//------------------------------------------- 顯示點亮菜單函數 --------------------------------------------
void DISP1_EXP( )
{
unsigned char i;
LCD=0xc0; //寫入顯示起始地址
WR_COMM(); //寫入命令
for(i=0;i<9;i++)
{
LCD= TAB2[i]; //提取字符
WR_DATA(); //送出
}
}
//--------------------------------------------顯示打開函數--------------------------------------------
void dakai ()
{
unsigned char i;
LCD=0xCE; //寫入顯示起始地址
WR_COMM(); //寫入命令
for(i=0;i<5;i++)
{
LCD=TAB3[i]; //提取字符
WR_DATA(); //送出
}
}
//--------------------------------------------顯示關閉函數--------------------------------------------
void Shut_down ()
{
unsigned char i;
LCD=0xCE; //寫入顯示起始地址
WR_COMM(); //寫入命令
for(i=0;i<10;i++)
{
LCD=TAB4[i]; //提取字符
WR_DATA(); //送出
}
}
uchar read_data(void)//讀取接收數據
{
// uchar i=0;
uchar tep = 0;
if(r_flag == 1)
{
r_flag = 0;
tep = buf[2];
fs_d (); //鳴響
}
return tep;
}
void uart_init()
{
TMOD=0x20;
TH1=0xfd; //波特率9600
TL1=0xfA;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/********************************************************************
函數功能:主函數
********************************************************************/
void main()
{
INIT_LCD(); //LCD初始化函數
delay(100);
DISP_EXP(); //歡迎用語字符菜單函數
DISP1_EXP();
delay(100);
{
uchar key=0;
uart_init(); //串口初始化
SPK=1;//蜂鳴器關
DA=1;
DB=1;
DC=1;
DD=1;
while(1)
{
key = read_data();//讀取接收數據
if(key == 'A');
{
DA =0;//打開A
delay(100);
fs_d();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[1]; //提取字符,數組中的1,
WR_DATA(); //送出
dakai ();
break;
}
if(key == 'B');
{
DA =1;//關閉A
delay(100);
fs_d();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[1]; //提取字符,數組中的1,
WR_DATA(); //送出
Shut_down (); //顯示關閉
break;
}
if(key == 'C');
{
DB =0;//打開B
delay(100);
fs_d();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[2]; //提取字符,數組中的2,
WR_DATA(); //送出
dakai(); //顯示打開
break;
}
if(key == 'D');
{
DB =1;//關閉B
delay(100);
fs_d ();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[2]; //提取字符,數組中的2,
WR_DATA(); //送出
Shut_down (); //顯示關閉
break;
}
if(key == 'E');
{
DC =0;//打開C
fs_d();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[3]; //提取字符,數組中的3,
WR_DATA(); //送出
dakai(); //顯示打開
break;
}
if(key == 'F');
{
DC =1;//關閉C
delay(100);
fs_d ();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[3]; //提取字符,數組中的3,
WR_DATA(); //送出
Shut_down (); //顯示關閉
break;
}
if(key == 'G');
{
DD =0;//打開D
delay(100);
fs_d();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[4]; //提取字符,數組中的4,
WR_DATA(); //送出
dakai(); //顯示打開
break;
}
if(key == 'H');
{
DD =1;//關閉D
delay(100);
fs_d();
LCD=0Xcc; //寫入顯示起始地址
WR_COMM(); //寫入命令
LCD=digit[4]; //提取字符,數組中的4,
WR_DATA(); //送出
Shut_down (); //顯示關閉
break;
}
}
}
}
void ser()interrupt 4 //接收中斷
{
RI=0; //清除接收標志
buf[r_x] = SBUF;//接收數據至緩存區
r_x++;
if(buf[0]!='O'){r_x=0;}
if(r_x == 3) //接收完成
{
r_x=0;
r_flag=1;
}
}
|