C8051F330基本外设调试

来源:互联网 发布:人工智能四大平台 编辑:程序博客网 时间:2024/05/16 10:01

项目需要用到该系列单片机,根据用户手册,对其外设驱动进行编写。

1.串口配置

这里我使用的波特率是19200,使用内部晶振,波特率调节方法可参照用手册

配置代码如下
void uart_init(){SCON0=0x10;//8位可编程波特率 允许接收TMOD=0x21;//配置定时器1八位自动重装CKCON=0x01;//定时器0,1为系统时钟的4分频  确定时钟频率为5MTH1=0x81;//TL1=0x81;TR1=1;ES0=1;//允许串口中断EA=1;}
为方便使用,提供一个打印函数
/***************串口打印函数************/void sendstring(uchar *date,uchar lenth){uchar i;for(i=0;i<lenth;i++){SBUF0=date[i];while(!TI0);//等待发送完成TI0=0;}}
参数为一个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<lenth;i++)//擦除数据{*(ptr+i)=0xf;FLKEY=0xA5;FLKEY=0xF1;}PSCTL=0x01;//不允许擦除for(i=0;i<lenth;i++){*(ptr+i)=*(arry+i);FLKEY=0xA5;FLKEY=0xF1;}PSCTL=0X00;EA=1;}


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;}



原创粉丝点击