C51单片机模块驱动程序参考.docx
《C51单片机模块驱动程序参考.docx》由会员分享,可在线阅读,更多相关《C51单片机模块驱动程序参考.docx(26页珍藏版)》请在冰豆网上搜索。
C51单片机模块驱动程序参考
一、引用外部头文件:
#include"SST89x5x4.H"
该头文件定义了SST89x5x4系列芯片所用到的关键变量,包括端口、各个寄存器等。
#include
该头文件定义了C51单片机的几个关键操作。
这两个头文件可在“……\Keil\C51\INC”文件夹中找到。
二、按键模块:
voidKey_Init(void);
unsignedcharGetScanKey(void);
unsignedcharGetKey(void);
函数功能描述:
键盘初始化,将标志位置1;
voidKey_Init(void)
{
bKeyUp_Flag=1;//标志(全局变量)位置1
}
函数功能描述:
键盘扫描函数,得到键的行列位置;
unsignedcharGetScanKey(void)
{
unsignedcharkey,i,temp;
unsignedcharxdata*ptr;
key=0xff;
for(i=1;i<0x10;i<<=1)//i的低4位为行数位,行依次检测循环4次
{
ptr=0x8fff;
*ptr=i;
temp=*ptr;//取键盘IO口的值
temp&=0x0f;//屏蔽高四位
if(temp!
=0x00)//是否有有效键值
{
key=i<<4;//取行数位的值并将其放入返回值高4位
key|=temp;//列数位的值放入返回值低4位
break;
}
}
returnkey;//返回行位(高四)和列位(低四)
}
函数功能描述:
取键值,长按无效;
unsignedcharcodeKey_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
说明:
计算因子,定义在函数外部。
此数组在计算键值的中间过程起作用。
比如右下方键按下(行列值为0x88),通过查找数组得到行对应的中间值0x03,列对应的中间值0x03。
unsignedcharGetKey(void)
{
unsignedcharkey,temp;
if(!
bKeyUp_Flag)//判断标志,是0执行
/*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值,直至按键无效返回无效按键值,置"1"标志位。
按键输入恢复有效。
屏蔽这部分则长按键有效*/
{
key=GetScanKey();
if(key==0xff)//没有按键,置标志位
bKeyUp_Flag=1;
else//保持按键
return0xff;//因为0xff大于15,故为无效键值,实现长按键无效
}
key=GetScanKey();
if(key==0xff)//没有按键
returnkey;
else//有按键有效
temp=key;//取键值
Delay_ms(20);//延时20ms消抖
key=GetScanKey();//键盘扫描
if(key!
=temp)//判断两次键值是否相同,排除干扰信号影响确认有效信号
{
key=0xff;
returnkey;
}
else//取键值
{
/*这部分主要作用是软件抗干扰*/
temp=Key_Value_Table[key>>4];//见说明
/*行值有效位(键盘的4个行SEL返回的值含有的有效位"1")有且只有一位键值才有效否则返回无效键值*/
if(temp==0xff)
{
key=0xff;
returnkey;
}
temp=Key_Value_Table[key&0x0f];
/*列值有效位(键盘的4个列RL返回的值含有的有效位"1")有且只有一位键值才有效否则返回无效键值*/
if(temp==0xff)
{
key=0xff;
returnkey;
}
key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];//行对应的中间值的四倍与列对应的中间值之和即为按键编号0~15
/*行列组合后的值大于15无效*/
if(key>15)
{
key=0xff;
returnkey;
}
bKeyUp_Flag=0;
returnkey;
}
}
三、LCD模块:
详细资料请字符点阵说明书.pdf
器件资料请参考“字符点阵说明书.pdf”中有关EDM1602部分;
voidLCD_Init(void);
voidLCD_Init2(void);
voidWriteW(uinta);
voidCheckBF(void);
unsignedcharKey_ASC2(unsignedchar);
voidWritD(unsignedchar);
函数功能描述:
检查忙标志位BF;
voidCheckBF(void)
{
uinti;
while
(1)
{
ptr=0xAFF1;//RS=0,R/W=1
i=*ptr;
i&=0x80;
if(i==0)
break;
}
}
函数功能描述:
向1602指令寄存器写指令;
voidWriteW(uinta)
{
ptr=0xAFF0;//RS=0,R/W=0
*ptr=a;
}
函数功能描述:
LCD初始化;
voidLCD_Init(void)
{
CheckBF();
WriteW(0x38);
CheckBF();
WriteW(0x01);
CheckBF();
WriteW(0x06);
CheckBF();
WriteW(0x0F);
CheckBF();
WriteW(0x80);
}
函数功能描述:
十六进制码转换为ascii码;
说明:
unsignedcharcodeASC2_Value_Table[16]=
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46
};定义在函数外部
unsignedcharKey_ASC2(unsignedcharkey)
{
unsignedcharkey_asc2;
key_asc2=ASC2_Value_Table[key];
returnkey_asc2;
}
函数功能描述:
换行后的初始化;
voidLCD_Init2(void)
{
CheckBF();
WriteW(0x0F);
CheckBF();
WriteW(0xC0);
}
函数功能描述:
显示字符;
voidWritD(unsignedcharkey_asc2)
{
CheckBF();
ptr=0xAF02;
*ptr=key_asc2;
}
四、LED模块:
voidLed_Init(unsignedchar*show);
voiddisplay(ucharn);
函数功能描述:
给显示数组赋初始值;
voidLed_Init(uchar*show)
{
unsignedchari;
for(i=0;i<8;i++)
{
//在此处给显示数组赋值
show++;
}
}
函数功能描述:
在LED上显示;
voiddisplay(void)
{
unsignedchari=1,j;
unsignedcharxdata*ptr;
for(j=0;j<8;j++)//八个数码管全部显示
{
ptr=0x8fff;//段选地址
*ptr=i;
ptr=0x9fff;//位选地址
//在此给*ptr赋值送字形码
Delay_us(50);
*ptr=0x00;
i<<=1;//下一位
}
}
五、I2C模块:
详细资料请参考I2C_bus.pdf文件
voidWriteI2C(uchar*Wdata,ucharRomAddress,ucharnumber);
voidReadI2C(uchar*RamAddress,ucharRomAddress,ucharbytes);
voidStartI2C(void);
voidStopI2C(void);
bitWrite8Bit(uchar);
ucharRead8Bit(void);
voidAck(void);
bitChackAck(void);
voidNoAck(void);
函数功能描述:
启动I2C总线;
voidStartI2C(void)
{
SDA=1;
Delay_ns
(1);
SCL=1;
Delay_ns
(1);
SDA=0;
Delay_ns
(1);
SCL=0;
Delay_ns
(1);
}
函数功能描述:
应答动作;
voidAck()
{
SDA=0;
Delay_ns
(1);
SCL=1;
Delay_ns
(1);
SCL=0;
Delay_ns
(1);
SDA=1;
Delay_ns
(1);
}
函数功能描述:
无应答动作;
voidNoAck(void)
{
SDA=1;
Delay_ns
(1);
SCL=1;
Delay_ns
(1);
SCL=0;
Delay_ns
(1);
}
函数功能描述:
停止i2c总线;
voidStopI2C(void)
{
SCL=0;
Delay_ns
(1);
SDA=0;
Delay_ns
(1);
SCL=1;
Delay_ns
(1);
SDA=1;
Delay_ns
(1);
}
函数功能描述:
向器件发送8位数据;
bitWrite8Bit(ucharinput)
{
uchartemp;
for(temp=8;temp!
=0;temp--)
{
SDA=(bit)(input&0x80);
Delay_ns
(1);
SCL=1;
Delay_ns
(1);
SCL=0;
Delay_ns
(1);
input=input<<1;
}
return1;
Delay_ns
(1);
}
函数功能描述:
读取8位数据;
ucharRead8Bit(void)
{
uchartemp,rbyte=0;
for(temp=8;temp!
=0;temp--)
{
SCL=1;
Delay_ns
(1);
rbyte=rbyte<<1;
Delay_ns
(1);
rbyte=rbyte|((uchar)(SDA));
SCL=0;
Delay_ns
(1);
}
returnrbyte;
}
函数功能描述:
向器件发送多字节数据;
voidWriteI2C(uchar*Wdata,ucharRomAddress,ucharnumber)
{
StartI2C();
Write8Bit(0xA2);
ChackAck();
Write8Bit(RomAddress);
ChackAck();
for(;number!
=0;number--)
{
Write8Bit(*Wdata);
ChackAck();
Wdata++;
}
StopI2C();
Delay_ns
(1);
}
函数功能描述:
读取多字节数据;
voidReadI2C(uchar*RamAddress,ucharRomAddress,ucharbytes)
{
StartI2C();
Write8Bit(0xA2);
ChackAck();
Write8Bit(RomAddress);
ChackAck();
StartI2C();
Write8Bit(0xA3);
ChackAck();
for(;bytes!
=1;bytes--)
{
*RamAddress=Read8Bit();
Ack();
RamAddress++;
}
*RamAddress=Read8Bit();
NoAck();
StopI2C();
Delay_ns
(1);
}
六、AD模块:
详细资料请参考tlc1549.pdf文件
voidBefore_Once_AD(void);//预采集
uintadc_1549(void);//读取AD输出的10bit数据
voidsort(uint*VolArray1);//排序函数
voidad_FilterAverage(void);//平均值滤波
voidad_FilterMedia(void);//中值滤波
voidad_FilterSlide(void);//滑动滤波
函数功能描述;预先采集;
voidBefore_Once_AD(void)
{
uchari;
ADCLK=ADOUT=0;
ADCS=0;//开启控制电路,使能DATAOUT和I/OCLOCK
for(i=1;i<=10;i++)
{
ADCLK=1;
_nop_();
ADCLK=0;
_nop_();
}
ADCS=1;
Delay_us(25);//两次转换间隔大于21us
}
函数功能描述:
转换并读取;
uintadc_1549(void)
{
uintdata_out=0;
uchari;
ADCLK=ADOUT=0;
ADCS=1;
_nop_();
ADCS=0;//开启控制电路,使能DATAOUT和I/OCLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
data_out<<=1;
if(ADOUT)data_out|=0x01;
ADCLK=0;
}
ADCS=1;
Delay_us(21);//两次转换间隔大于21us
return(data_out);
}
七、DA模块:
详细资料请参考tlc5615.pdf文件
函数功能描述:
驱动TLC5615开始DA转换;
dat为被转换的数字量
voidtlc5615(uintdat)
{
ucharx;
CS=1;
SCLK=0;
delay(100);
DIO=0;
CS=0;//片选DA芯片
dat=dat<<6;//虽然说输入是16位数据,但只有10为有效,DAC寄存器是10位
for(x=0;x<12;x++)
{//串行发送
DIO=dat&0x8000;
SCLK=1;//模拟时钟信号
dat=dat<<1;
SCLK=0;
}
CS=1;//CS的上升沿和下降沿只有在clk为低的时候才有效
}
八、语音模块:
详细资料请参考isd1760.pdf文件
预定义
#definelow_duanmaXBYTE[0xB000]
#defineread_duanmaXBYTE[0x9FFF]
//XBYTE[0x0000]^4=MISO
#definePU0x01
#defineSTOP0x02
#defineRESET0x03
#defineCLI_INT0x04
#defineRD_STATUS0x05
#defineRD_PLAY_PTR0x06
#definePD0x07
#defineRD_REC_PTR0x08
#defineRD_DEVID0x09
#defineG_ERASE0x43
#defineRD_APC0x44
#defineWR_APC10x45
#defineWR_APC20x65
#defineWR_NVCFG0x46
#defineCHK_MEM0x49
#defineSET_PLAY0x80
#defineSET_REC0x81
#defineSET_ERASE0x82
externucharspi_buf;
voidI_delay(void);
ucharISD_SendData(ucharBUF_ISD);//发数据
voidISD_PU(void);//上电
voidISD_Reset(void);//复位
voidRdStatus(void);//读状态
voidISD_WR_APC2(ucharvoiceValue);
voidISD_WR_NVCFG(void);//永久写入寄存器
voidISD_Init(void);//器件初始化
voidplay_close(void);//停止播放
voidplay_open(unsignedintduanma,unsignedintduanma1);//定点播放
函数功能描述:
发送数据;
ucharISD_SendData(ucharBUF_ISD){
uchari,dat=BUF_ISD;
spi_buf&=0xfe;
low_duanma=spi_buf;
spi_buf|=0x02;
low_duanma=spi_buf;
for(i=0;i<8;i++){
spi_buf&=0xfd;
low_duanma=spi_buf;
I_delay();
if(dat&0x01){
spi_buf|=0x04;
}
else{
spi_buf&=0xfb;
}
low_duanma=spi_buf;
dat>>=1;
if(read_duanma&0x10){
dat|=0x80;
}
spi_buf|=0x02;
low_duanma=spi_buf;
I_delay();
}
spi_buf&=0xfb;
low_duanma=spi_buf;
return(dat);
}
函数功能描述:
上电;
voidISD_PU(void){
ISD_SendData(PU);
ISD_SendData(0x00);
spi_buf|=0x01;
low_duanma=spi_buf;
Delay_us
(2);
}
函数功能描述:
复位;
voidISD_Reset(void){
ISD_SendData(RESET);
ISD_SendData(0x00);
spi_buf|=0x01;
low_duanma=spi_buf;
Delay_us
(2);
}
函数功能描述:
读取状态;
ucharSR0_L;
ucharSR0_H;
ucharSR1;
voidRdStatus(void){
do{
ISD_SendData(RD_STATUS);
ISD_SendData(0x00);
ISD_SendData(0x00);
spi_buf|=0x01;
low_duanma=spi_buf;
SR0_L=ISD_SendData(RD_STATUS);
SR0_H=ISD_SendData(0x00);
SR1=ISD_SendData(0x00);
spi_buf|=0x01;
low_duanma=spi_buf;
}while(!
(SR1&0x01));//if(SR0_L^0==1){systemErr}
}
函数功能描述:
永久写入寄存器;
voidISD_WR_NVCFG(void){
ISD_SendData(WR_NVCFG);
ISD_SendData(0x00);
spi_buf|=0x01;
low_duanma=spi_buf;
Delay_us
(2);
}
函数功能描述:
设置APC2;
voidISD_WR_APC2(ucharvoiceValue){
ISD_SendData(WR_APC2);
ISD_SendData(voiceValue);//0xa8声音最大,0xaf声音最小
ISD_SendData(0x0c);//D11=1,在SETPLAY模式下,执行到EOM自动结束。
或者在连续两个SET_PLAY命令后,执行到第一个EOM自动跳到第二段开始
spi_buf|=0x01;
low_duanma=spi_buf;
Delay_us
(2);
}
函数功能描述:
初始化;
voidISD_Init(void){
ISD_Reset();
Delay_us
(2);
RdStatus();
ISD_PU();
RdStatus();
ISD_WR_APC2(0xa8);
RdStatus();
ISD_WR_NVCFG();//永久写入寄存器
RdStatus();
}
函数功能描述:
停止播放;
voidplay_close(void){
ISD_SendData(STOP);
ISD_SendData(0x00);
spi_buf|=0x01;
low_duanma=spi_buf;
Delay_ms
(2);//因为停止动作比较慢,停止后多一个延时,保证语音芯片接收到下一条指令
}
函数功能描述:
定点播放;
参数说明:
AddST为段首地址,AddEN为段末地址
voidplay_open(unsignedintAddST,unsignedintAddEN){
AddST=AddST&0x3fff;
AddEN=AddEN&0x3fff;
if(AddST>0){
RdStatus();
ISD_SendData(SET_PLAY);
ISD_SendData(0x00);
ISD_SendData((uchar)(AddST&0x00