*******************************/
#include <reg52.h>
#define Buzzer_time 350 //蜂鳴器鳴叫持續時間
#define uchar unsigned char
unsigned int Buzzer_count=0; //蜂鳴器鳴叫持續時間計數器
sbit led=P2^0;
sbit led1=P2^1;
sbit KEY=P3^ 0;
sbit Buzzer=P1^5; //定義獨立按鍵
bit KEYSTA = 1; //按鍵的初始狀態
void Timer0Init(); //定時器初始化函數
void KeyProcess(); //按鍵處理函數
/*********************************************************************
* 函 數 名 : SendData
* 函數功能 : 通過串口發送1字節數據給外部設備
* 參數列表 : c - 待發送的1字節數據
* 函數輸出 : 無
*********************************************************************/
void SendByte(unsigned char dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
/***************************************************
函數:串口初始化程序
如果只需要串口發送不需要串口接收就不必開串口接收中斷
**************************************************/
void InitUART(void)
{
SCON=0X50;
TMOD|=0X20;
PCON=0x80; //波特率4800//
TH1=0XF3;
TL1=0XF3;
TR1=1;
EA=1;
//ES=1; //打開串口中斷
}
void main()
{
Timer0Init();
InitUART();
KeyProcess();
}
void Timer0Init()
{
TMOD |= 0x01;
TH0 = (65536-200)/256; //定時2MS
TL0 = (65536-200)%256;
EA =1;
ET0 = 1;
TR0 = 1;
}
void KeyProcess()
{
bit lasttime = 1; //定義前一次按鍵值,初始化為1;
bit a=0;
KEY = 0x01; //按鍵初始化;
while(1)
{
if (KEYSTA != lasttime) //如果“當前按鍵狀態”與“前一次按鍵狀態”不同,說明按鍵有動作;
{
if (lasttime == 1) //如果按鍵有動作了,那么前一次按鍵狀態為“彈起”(lasttime == 1),說明按鍵按下時,會響應動作;
{
led=~led;
Buzzer_count=Buzzer_time;
SendByte(0xaa);}
lasttime = KEYSTA; //如果按鍵有動作,就更新前一次按鍵的值;
}
if ( KEYSTA!=lasttime ) //如果“當前按鍵狀態”與“前一次按鍵狀態”不同,說明按鍵有動作;
{
if (lasttime ==1 ) //如果按鍵有動作了,那么前一次按鍵狀態為“彈起”(lasttime == 1),說明按鍵按下時,會響應動作;
{
led=~led;
Buzzer_count=Buzzer_time;
SendByte(0xbb);}
lasttime = KEYSTA; //如果按鍵有動作,就更新前一次按鍵的值;
}
}
}
void Timer0() interrupt 1 //2MS中斷一次
{
static keybuf = 0xFF; //定義一個靜態按鍵緩存變量,且值為FF;主要是暫存按鍵狀態;
TH0 = (65536-200)/256; //定時2MS
TL0 = (65536-200)%256;
if(Buzzer_count!=0)
{
Buzzer_count--; //每次進入中斷自減,減到0為止,才停止鳴叫//
Buzzer=~Buzzer; //蜂鳴器響//
}
keybuf = (keybuf << 1) | KEY; //左移一位,使當前的按鍵狀態移到按鍵緩存中;
if (keybuf == 0) //如果移8次,按鍵狀態都為0,說明按鍵真正按下;
{
KEYSTA = 0; //確定按鍵狀態為按鍵;
}
else if (keybuf == 0xFF) //如果移8次,按鍵狀態都為1,說明按鍵未按下
{
KEYSTA = 1;
}
}
|