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