单片机常用芯片的头文件.docx
《单片机常用芯片的头文件.docx》由会员分享,可在线阅读,更多相关《单片机常用芯片的头文件.docx(24页珍藏版)》请在冰豆网上搜索。
![单片机常用芯片的头文件.docx](https://file1.bdocx.com/fileroot1/2023-1/10/6b4345bf-4af7-4d78-b8fa-e53d6dce44cc/6b4345bf-4af7-4d78-b8fa-e53d6dce44cc1.gif)
单片机常用芯片的头文件
//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);
}
/****************************************************************************************************