首先是最通用的外设串口
1.串口通信
基本配置
void Serport_Init()
{
CKCON=0x18;
RCAP2L=0XEC;//这个就是TH2 TL2的重装值
RCAP2H=0XFF;
TL2=0XEC;//波特率19200
TH2=0XFF;
RCLK=1;//TIM2作为接收发送溢出时钟
TCLK=1;
CT2=0;
TR2=1;
SCON=0x70;
ES=1;
EA=1;
}
这里设置的波特率为19200且允许接收,开接收中断
打印函数
/**************串口打印函数*******/
//两个参数 一个uchar数组 一个数据长度
//
/********************************/
void RS_SendString(uchar* m,uchar lenth)
{
uchar i;
for(i=0;i<lenth;i++)
{
SBUF=m[i];
while(!TI);//等待发送结束
TI=0;
}
}
中断服务函数
/*************数据接收程序****************/
//没有参数
//结束符设置为OX0A 0X0D即换行符(可以进行修改)
//当recover=1即代表串口接收完成
/****************************************/
void RS_Recive() interrupt 4//串口中断是4号位
{
uchar date;
static uchar dic=0;
static uchar num=0;
if(RI==1)
{
RI=0;
date=SBUF;//获取数据
RecBuf[num]=date;
num++;
lenth++;
if(dic==1)//改进之后确认换行符才会将recover置1
{
if(date==0x0d)
{
dic=0;
recover=1;
num=0;
}
else dic=0;
}
if(date==0x0a)
{
dic=1;
}
}
}
2.Flash读写
读:
当锁定Flash xdata将指向片外XRAM所以这里需要用code访问内部程序存储器
/*************Flash读取函数*********/
//参数addr 数据地址
//返回uchar类型数据
/**********************************/
uchar Flash_Read(unsigned int addr)
{
unsigned char code*ptr;
EA=0;
ptr=addr;
EA=1;
return *ptr;
}
写:
解除锁定,xdata将指向Flash存储区
/***********Flash写入函数***********/
//含两个参数(uint)addr (uchar)date
//一次性需要写入所有需要的数据
//没有返回值
/*********************************/
void Flash_Write(uint addr,uchar lenth,uchar*arry)
{
uchar xdata*ptr;
uchar i;
EA=0;
FLSCL=0X88;//允许对Flash进行写操作
PSCTL=0X03;//允许写/擦除操作
ptr=addr;
for(i=0;i<lenth;i++)
{
*(ptr+i)=0xf;
}
PSCTL=0X01;//不允许擦除
for(i=0;i<lenth;i++)
{
*(ptr+i)=*(arry+i);
}
PSCTL=0X00;
EA=1;
}
3.计数器配置
void counter_init()
{
TMOD=0x99;//只用一个定时器
CKCON=0x18;//使用系统时钟 厉害了1/12M
TH0=0;//TR开并且端口有低电平开始计数
TL0=0;
TH1=0;
TL1=0;
}
只需要打开TR0,TR1即开始计数