#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u8 code buf[10]={1,2,3,4,5,6,7,8,9,0xA};
u8 xdata buf1[]="STC89RC,Demo";
sbit k1=P1^4;
sbit d1=P3^7;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
sbit LED=P3^7;
unsigned char Temp[];
u8 flag;
u8 i ;
bit ready=0;
j=0x00;
unsigned char gotData[9];
u8 jscos,jk;
/*------------------------------------------------
函數(shù)聲明
------------------------------------------------*/
void SendStr(unsigned char *s);
void Send_data();
void delaynms(unsigned int di) //延時
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
// // TMOD: timer 1, mode 2, 8-bit 重裝
TMOD |= 0x21; //T1方式2、T0方式1
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TL1 = 0xfd; //波特率
TR1 = 1; // TR1: timer 1 打開
IE |= 0x92; //開啟中斷
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
}
void Init_Timer1(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
EA=1; //總中斷打開
ET1=1; //定時器中斷打開
TR1=1; //定時器開關(guān)打開
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關(guān)打開
}
void TIM2Inital(void)
{
RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自動重載
RCAP2L = (65536-60000)%256;
ET2=1; //打開定時器中斷
EA=1; //打開總中斷
TR2=1; //打開定時器開關(guān)
}
void Send_data()
{ u8 l;
for(l=0;l<10;l++)
{
SBUF=buf[l];
while(!TI);
TI = 0;
}
}
/*------------------------------------------------
發(fā)送一個字節(jié)
------------------------------------------------*/
void SendByte(unsigned char *s)
{
SBUF = *s;
while(!TI);TI = 0;
}
/*------------------------------------------------
發(fā)送一個字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標志,通過檢測是否字符串末尾
{
SendByte(s);
s++;
}
}
void timer0(void) interrupt 1
{
static u16 count;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
// TR0 = 0; //關(guān)閉T0
j = i; //暫存接收到的數(shù)據(jù)幀長度
i = 0x00; //長度清零
ready = 1; //置位接收完成標志
if (count >500)
{
// LED = ~LED;
// P4_0=!P4_0;
count = 0;
// Send_data();
SendStr("1 2 3 4 5 6");
}
count ++;
}
void timer1(void) interrupt 3
{
static u16 count;
TH1=(65535-20000)/256;
TL1=(65535-20000)%256;
// TR0 = 0; //關(guān)閉T0
j = i; //暫存接收到的數(shù)據(jù)幀長度
i = 0x00; //長度清零
ready = 1; //置位接收完成標志
//
if(count>5)
{
count=0;
//
k1=!k1;
}
count++;
}
/*------------------------------------------------
串口中斷程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中斷服務程序
{
//定義臨時變量
if(RI) //判斷是接收中斷產(chǎn)生
{
RI = 0; //清零接收中斷標志位
TH0 = 0xf8;
TL0 = 0x2f; //2ms定時
TR0 = 1; //開啟T0
gotData[i++] = SBUF; //讀取收到的字節(jié)
}
if(i==9)
{
i=0;
flag=1;
}
}
void TIM2(void) interrupt 5 using 1//定時器2中斷
{
static u16 jks;
TF2=0;
jks++;
if(jks>20)
{
jks=0;
P4_0=!P4_0;
}
}
/*------------------------------------------------
主函數(shù)
------------------------------------------------*/
void main (void)
{
u8 i;
InitUART();
//Init_Timer0();
TIM2Inital();
//SendStr("UART test,技術(shù) 請在發(fā)送區(qū)輸入任意信息");
//Init_Timer1();
d1=0;
PS=0;
LED=1;
//打開串口中斷
while (1)
{
if( flag)
{
if(gotData[0]==0xFF)
{
LED=!LED;
jk=1;
}
flag=0;
}
if(jscos==1)
{
// Send_data();
jscos=0;
}
// Send_data();
}
}
|