#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;
/*------------------------------------------------
函数声明
------------------------------------------------*/
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; //定时器开关打开
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void TIM2Inital(void)
{
RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
ET2=1; //打开定时器中断
EA=1; //打开总中断
TR2=1; //打开定时器开关
}
void Send_data()
{ u8 l;
for(l=0;l<10;l++)
{
SBUF=buf[l];
while(!TI);
TI = 0;
}
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char *s)
{
SBUF = *s;
while(!TI);TI = 0;
}
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
{
SendByte(s);
s++;
}
}
void timer0(void) interrupt 1
{
static u16 count;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
// TR0 = 0; //关闭T0
j = i; //暂存接收到的数据帧长度
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; //关闭T0
j = i; //暂存接收到的数据帧长度
i = 0x00; //长度清零
ready = 1; //置位接收完成标志
//
if(count>5)
{
count=0;
//
k1=!k1;
}
count++;
}
/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
//定义临时变量
if(RI) //判断是接收中断产生
{
RI = 0; //清零接收中断标志位
TH0 = 0xf8;
TL0 = 0x2f; //2ms定时
TR0 = 1; //开启T0
gotData[i++] = SBUF; //读取收到的字节
}
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;
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
u8 i;
InitUART();
//Init_Timer0();
TIM2Inital();
//SendStr("UART test,技术 请在发送区输入任意信息");
//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();
}
}
|