C51单片机模块驱动程序参考.docx

上传人:b****1 文档编号:23274365 上传时间:2023-05-15 格式:DOCX 页数:26 大小:484.77KB
下载 相关 举报
C51单片机模块驱动程序参考.docx_第1页
第1页 / 共26页
C51单片机模块驱动程序参考.docx_第2页
第2页 / 共26页
C51单片机模块驱动程序参考.docx_第3页
第3页 / 共26页
C51单片机模块驱动程序参考.docx_第4页
第4页 / 共26页
C51单片机模块驱动程序参考.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

C51单片机模块驱动程序参考.docx

《C51单片机模块驱动程序参考.docx》由会员分享,可在线阅读,更多相关《C51单片机模块驱动程序参考.docx(26页珍藏版)》请在冰豆网上搜索。

C51单片机模块驱动程序参考.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1