项目需要用到该系列单片机,根据用户手册,对其外设驱动进行编写。
1.串口配置
这里我使用的波特率是19200,使用内部晶振,波特率调节方法可参照用手册
配置代码如下
void uart_init()
{
SCON0=0x10;//8位可编程波特率 允许接收
TMOD=0x21;//配置定时器1八位自动重装
CKCON=0x01;//定时器0,1为系统时钟的4分频 确定时钟频率为5M
TH1=0x81;//
TL1=0x81;
TR1=1;
ES0=1;//允许串口中断
EA=1;
}
为方便使用,提供一个打印函数
/***************串口打印函数************/
void sendstring(uchar *date,uchar lenth)
{
uchar i;
for(i=0;i参数为一个uchar指针指向一个数据数组以及数组长度值
接收数据,使用帧尾校验方式,连续的0x0a,0x0d作为结束标志,实现方法如下
void RS_int() interrupt 4//串口中断
{
uchar date;
static uchar dic=0;
static uchar num=0;
if(RI0==1)
{
RI0=0;
date=SBUF0;//获取数据
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;
}
}
}
当数据接收完成recover会被置1,数据长度保存在lenth变量中
2.外部中断
外部中断0,1可以通过IT01CF寄存器配置触发方式以及监视的IO口,在交叉开关中跳过使用到的IO口
void NVIC_init()
{
EX0=1;//允许外部中
EX1=1;
IT01CF=0x98;//高电平触发且分配IO口
IT0=1;//选择为边沿触发
IT1=1;
}
3.Flash读写操作
这里重点在于对FLKEY 的写入,一旦写入错误就会锁死Flash。
Flash读取操作代码:
uchar Flash_Read(unsigned int addr)
{
uchar code*ptr;
EA=0;
ptr=addr;
EA=1;
return *ptr;
}
因为当Flash修改关闭xdata将指向xram所以这里要用code访问code区
Flash修改操作:官方手册给出的操作步骤
对应的修改代码如下:
void Flash_Write(uint addr,uchar lenth,uchar*arry)//值得注意 FLKEY写入顺序一定要正确 否则会锁死Flash
{
uchar xdata*ptr;
uchar i;
EA=0;
FLSCL=0x10;
PSCTL=0X03;//允许写/擦除操作
FLKEY=0xA5;
FLKEY=0xF1;
ptr=addr;
for(i=0;i
4.定时器的配置与操作
这里示范的是生成105HZ的方波
配置程序为:
void timerset()//产生方波
{
/*********105HZ配置********/
//TH0=(65535-22250)/256;
//TL0=(65535-22250)%256;
/*********210HZ配置********/
TH0=(65535-11125)/256;
TL0=(65535-11125)%256;
ET0=1;//打开定时器0中断
TR0=1;
}
采用16位计数器,根据之前的配置这里计时器使用的是5M时钟频率
中断程序为:
void timer0() interrupt 1//产生方波的中断
{ PLUS=!PLUS;
TH0=(65535-11125)/256;
TL0=(65535-11125)%256;
}