单片机常用芯片的头文件.docx

上传人:b****6 文档编号:6832740 上传时间:2023-01-11 格式:DOCX 页数:24 大小:20.39KB
下载 相关 举报
单片机常用芯片的头文件.docx_第1页
第1页 / 共24页
单片机常用芯片的头文件.docx_第2页
第2页 / 共24页
单片机常用芯片的头文件.docx_第3页
第3页 / 共24页
单片机常用芯片的头文件.docx_第4页
第4页 / 共24页
单片机常用芯片的头文件.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

单片机常用芯片的头文件.docx

《单片机常用芯片的头文件.docx》由会员分享,可在线阅读,更多相关《单片机常用芯片的头文件.docx(24页珍藏版)》请在冰豆网上搜索。

单片机常用芯片的头文件.docx

单片机常用芯片的头文件

//STC单片机内部ADC转换程序

//可选择查询和中断方式

//H文件

#ifndef__ADC_H__

#define__ADC_H__

#defineADC_POWER0x80//ADC电源控制位

#defineADC_FLAG0x10//ADC完成标志

#defineADC_START0x08//ADC启动控制位

//ADC转换速度选择

#defineADC_SPEEDLL0x00//420clocks

#defineADC_SPEEDL0x20//280clocks

#defineADC_SPEEDH0x40//140clocks

#defineADC_SPEEDHH0x60//70clocks

unsignedintAD_Result_Temp;

unsignedintGetADCResult(unsignedcharchan);//ADC转换处理,查询方式

#endif

//C文件

#ifndef__ADC_C__

#define__ADC_C__

#include

//#include

/*----------------------------

初始化ADC寄存器中断方式

----------------------------

voidInitADC()

{

unsignedunsignedcharchan=0;

P1ASF=0xff;//设置P1口全部为ADC通道

ADC_RES=0;//清除高8位缓冲数据

ADC_RESL=0;//清除低2位缓冲数据

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|chan;

_nop_();

_nop_();//打开ADC

}

*/

//----------------------------

//ADC中断处理

//----------------------------

/*voidadc_isr()interrupt5using1

{

unsignedunsignedintAD_Result_Temp

ADC_CONTR&=!

ADC_FLAG;//清除ADC中断标志位

return(((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL);//返回10位ADC转换结果

if(++ch>7)ch=0;//却换到下一个通道

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|chan;

}

*/

unsignedintGetADCResult(unsignedcharchan)

{

AD_Result_Temp=0;

ADC_RES=0;

ADC_RESL=0;

ADC_CONTR=ADC_POWER|ADC_SPEEDHH|chan|ADC_START;

_nop_();//Mustwaitbeforeinquiry

_nop_();

_nop_();

_nop_();

while(!

(ADC_CONTR&ADC_FLAG));//等待完成

ADC_CONTR&=~ADC_FLAG;//关闭ADC转换

AD_Result_Temp=(((AD_Result_Temp|ADC_RES)<<2)+ADC_RESL);

returnAD_Result_Temp;

}

#endif

//74HC595

//发送完一个8位数据,就锁存一次

//8个数码管,可以这样做

//for(i=0;i<8;i++)

//{

//Send_HC595(....//要发送的8为数据);

//Show_595();

//}

 

/********************************************************/

/**/

/*将显示数据送入74HC595内部移位寄存器*/

/**/

/********************************************************/

voidSend_HC595(INT16ULED_DATA)

{

INT8Ui;

for(i=0;i<8;i++)

{

HC595_DS=LED_DATA&0x80;

HC595_SHCP=1;//上升沿发生移位

_nop_();

_nop_();

HC595_SHCP=0;

LED_DATA=LED_DATA<<1;

}

}

 

/********************************************************/

/**/

/*将移位寄存器内的数据锁存到输出寄存器并显示*/

/**/

/********************************************************/

voidShow_595(void)

{

HC595_STCP=0;

_nop_();

_nop_();

HC595_STCP=1;//上升沿将数据送到输出锁存器

_nop_();

_nop_();

HC595_STCP=0;

}

 

//74HC164

#ifndef__74LS164_H__

#define__74LS164_H__

externvoidWrite_Bit8(unsignedcharbit_8)

{

unsignedchari;

for(i=8;i>0;i--)//数码管段8位数据

{

Data=bit_8&0x80;//传送一位数据

CLK=0;

CLK=1;

bit_8=bit_8<<1;

}

}

#endif

 

20位串口A/D转换器CS5513

20位串口A/D转换器CS5513接口程序2010-03-2214:

56//cs5513接口的C51官方程序

//cs5513返回长整型数据

//CS=0时表示片选有效,当然可以直接接地,这样可以节省一个I/O口

sbitADCS=P2^0;

sbitADCLK=P2^1;

sbitADDO=P2^2;

unsignedlongintADConv(void)

{

uchari;

unsignedlongintResult=0;

ADCLK=0;

ADCS=0;

_nop_();

_nop_();

_nop_();

ADCLK=0;

while(ADDO);

ADCLK=1;

_nop_();

for(i=0;i<3;i++){

ADCLK=0;

_nop_();

ADCLK=1;

}

for(i=0;i<20;i++){

ADCLK=0;

Result=Result<<1;

if(ADDO)

Result=Result+1;

ADCLK=1;

}

ADCS=1;

returnResult;

}

 

//LCDSMC12864-05

#ifndef_CRYFUCNS_H_

#define_CRYFUCNS_H_

voidSend(unsignedchartype,unsignedchartransdata);

voidInit_LCD(void);

voidClear_GDRAM(void);

voidDisp_HZ(unsignedcharaddr,constunsignedchar*pt,unsignedcharnum);

voidDraw_PM(constunsignedchar*ptr);

voidDraw_TX(unsignedcharYaddr,unsignedcharXaddr,constunsignedchar*dp);

voidDisp_SZ(unsignedcharaddr,unsignedcharshuzi);

#endif

 

#include

#include

#include

#include

externconstINT8Ushuzi_table[];

voidSend(INT8Utype,INT8Utransdata);

/**********液晶控制IO的宏定义*************/

sbitRS_CS=P0^0;

sbitRW_SDI=P0^1;

sbitE_CLK=P0^2;

/*******************************************

函数名称:

delay_Nus

功能:

延时N个us的时间

参数:

n--延时长度

返回值:

********************************************/

voiddelay_Nus(INT16Un)

{

INT8Ui;

for(i=n;i>0;i--)

_nop_();

}

/*******************************************

函数名称:

delay_1ms

功能:

延时约1ms的时间

参数:

返回值:

********************************************/

voiddelay_1ms(void)

{

INT8Ui;

for(i=150;i>0;i--)_nop_();

}

/*******************************************

函数名称:

delay_Nms

功能:

延时N个ms的时间

参数:

返回值:

********************************************/

voiddelay_Nms(INT16Un)

{

INT16Ui=0;

for(i=n;i>0;i--)

delay_1ms();

}

/*******************************************

函数名称:

Ini_Lcd

功能:

初始化液晶模块

参数:

返回值:

********************************************/

voidInit_LCD(void)

{

delay_Nms(100);//延时等待液晶完成复位

Send(0,0x30);/*功能设置:

一次送8位数据,基本指令集*/

delay_Nus(72);

Send(0,0x02);/*DDRAM地址归位*/

delay_Nus(72);

Send(0,0x0c);/*显示设定:

开显示,不显示光标,不做当前显示位反白闪动*/

delay_Nus(72);

Send(0,0x01);/*清屏,将DDRAM的位址计数器调整为“00H”*/

delay_Nus(72);

Send(0,0x06);/*功能设置,点设定:

显示字符/光标从左到右移位,DDRAM地址加1*/

delay_Nus(72);

}

/*******************************************

函数名称:

Send

功能:

MCU向液晶模块发送1一个字节的数据

参数:

type--数据类型,0--控制命令,1--显示数据

transdata--发送的数据

返回值:

********************************************/

voidSend(INT8Utype,INT8Utransdata)

{

INT8Ufirstbyte=0xf8;

INT8Utemp;

INT8Ui,j=3;

if(type)firstbyte|=0x02;

RS_CS=1;

E_CLK=0;

while(j>0)

{

if(j==3)temp=firstbyte;

elseif(j==2)temp=transdata&0xf0;

elsetemp=(transdata<<4)&0xf0;

for(i=8;i>0;i--)

{

if(temp&0x80)RW_SDI=1;

elseRW_SDI=0;

E_CLK=1;

temp<<=1;

E_CLK=0;

}

//三个字节之间一定要有足够的延时,否则易出现时序问题

if(j==3)delay_Nus(600);

elsedelay_Nus(200);

j--;

}

RW_SDI=0;

RS_CS=0;

}

/*******************************************

函数名称:

Clear_GDRAM

功能:

清除液晶GDRAM内部的随机数据

参数:

返回值:

********************************************/

voidClear_GDRAM(void)

{

INT8Ui,j,k;

Send(0,0x34);//打开扩展指令集

i=0x80;

for(j=0;j<32;j++)

{

Send(0,i++);

Send(0,0x80);

for(k=0;k<16;k++)

{

Send(1,0x00);

}

}

i=0x80;

for(j=0;j<32;j++)

{

Send(0,i++);

Send(0,0x88);

for(k=0;k<16;k++)

{

Send(1,0x00);

}

}

Send(0,0x30);//回到基本指令集

}

/*******************************************

函数名称:

Disp_HZ

功能:

显示汉字程序

参数:

addr--显示位置的首地址

pt--指向显示数据的指针

num--显示数据的个数

返回值:

********************************************/

voidDisp_HZ(INT8Uaddr,constINT8U*pt,INT8Unum)

{

INT8Ui;

Send(0,addr);

for(i=0;i<(num*2);i++)

Send(1,*(pt++));

}

/*******************************************

函数名称:

Draw_PM

功能:

在整个屏幕上画一个图片

参数:

ptr--指向保存图片位置的指针

返回值:

********************************************/

voidDraw_PM(constINT8U*ptr)

{

INT8Ui,j,k;

Send(0,0x34);//打开扩展指令集

i=0x80;

for(j=0;j<32;j++)

{

Send(0,i++);

Send(0,0x80);

for(k=0;k<16;k++)

{

Send(1,*ptr++);

}

}

i=0x80;

for(j=0;j<32;j++)

{

Send(0,i++);

Send(0,0x88);

for(k=0;k<16;k++)

{

Send(1,*ptr++);

}

}

Send(0,0x36);//打开绘图显示

Send(0,0x30);//回到基本指令集

}

/*******************************************

函数名称:

Draw_TX

功能:

在液晶上描绘一个16*16的图形

参数:

Yaddr--Y地址,

Xaddr--X地址

dp--指向保存图形数据的指针

返回值:

********************************************/

voidDraw_TX(INT8UYaddr,INT8UXaddr,constINT8U*dp)

{

INT8Uj;

INT8Uk=0;

Send(0,0x34);//使用扩展指令集,关闭绘图显示

for(j=0;j<16;j++)

{

Send(0,Yaddr++);//Y地址

Send(0,Xaddr);//X地址

Send(1,dp[k++]);//送两个字节的显示数据

Send(1,dp[k++]);

}

Send(0,0x36);//打开绘图显示

Send(0,0x30);//回到基本指令集模式

}

/*******************************************

函数名称:

Disp_SZ

功能:

显示一个两位数字

参数:

addr--显示地址

数字--显示的数字

返回值:

********************************************/

voidDisp_SZ(INT8Uaddr,INT8Ushuzi)

{

INT8Utmp0,tmp1;

tmp0=shuzi/10;

tmp1=shuzi%10;

Send(0,addr);

Send(1,shuzi_table[tmp0]);

Send(1,shuzi_table[tmp1]);

}

 

//STC内部EEPROM操作程序

#ifndef_EEPROM_H_

#define_EEPROM_H_

 

//定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数

//#defineENABLE_ISP0x80//系统工作时钟<30MHz时,对IAP_CONTR寄存器设置此值

//#defineENABLE_ISP0x81//系统工作时钟<24MHz时,对IAP_CONTR寄存器设置此值

//#defineENABLE_ISP0x82//系统工作时钟<20MHz时,对IAP_CONTR寄存器设置此值

#defineENABLE_ISP0x83//系统工作时钟<12MHz时,对IAP_CONTR寄存器设置此值

//#defineENABLE_ISP0x84//系统工作时钟<6MHz时,对IAP_CONTR寄存器设置此值

//#defineENABLE_ISP0x85//系统工作时钟<3MHz时,对IAP_CONTR寄存器设置此值

//#defineENABLE_ISP0x86//系统工作时钟<2MHz时,对IAP_CONTR寄存器设置此值

//#defineENABLE_ISP0x87//系统工作时钟<1MHz时,对IAP_CONTR寄存器设置此值

#defineFIRST0x0000

#defineSECOND0x200

#defineTHIRD0x400

#defineSTART_FLAG0xE1

 

unioneeprom_addr

{

unsignedinttemp16;

unsignedchartemp8[2];

}addr16;

voidIAP_Disable(void);//关闭IAP功能

voidSector_Erase(unsignedintadd);//擦除扇区

voidByte_Program(unsignedintadd,unsignedcharch);//字节编程,调用前需打开IAP功能

externunsignedcharByte_Read(unsignedintadd);//读一字节,调用前需打开IAP功能

#endif

 

#include

/***********************************************************************************************

读一字节,调用前需打开IAP功能,入口:

DPTR=字节地址,返回:

A=读出字节

************************************************************************************************/

unsignedcharByte_Read(unsignedintadd)

{

EA=0;

IAP_DATA=0x00;

IAP_CONTR=ENABLE_ISP;//打开IAP功能,设置Flash操作等待时间

IAP_CMD=0x01;//IAP/ISP/EEPROM字节读命令

addr16.temp16=add;

IAP_ADDRH=addr16.temp8[0];//设置目标单元地址的高8位地址

IAP_ADDRL=addr16.temp8[1];//设置目标单元地址的低8位地址

 

IAP_TRIG=0x5A;//先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此

IAP_TRIG=0xA5;//送完A5h后,ISP/IAP命令立即被触发起动

_nop_();

IAP_Disable();//关闭IAP功能,清相关的特殊功能寄存器,使CPU处于安全状态,

//一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关

EA=1;

return(IAP_DATA);

}

/****************************************************************************************************

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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