单片机学习资料.docx
《单片机学习资料.docx》由会员分享,可在线阅读,更多相关《单片机学习资料.docx(116页珍藏版)》请在冰点文库上搜索。
单片机学习资料
三极管选型
9011,9012,9013,9014,8050,8559011,9012,9013,9014,8050,8550三极管的区别
9011NPN30V30mA400mW150MHz放大倍数20-80
9012PNP50V500mA600mW低频管放大倍数30-90
9013NPN20V625mA500mW低频管放大倍数40-110
9014NPN45V100mA450mW150MHz放大倍数20-90
8050NPN25V700mA200mW150MHz放大倍数30-100
8550PNP40V1500mA1000mW200MHz放大倍数40-140
详情如下:
90系列三极管参数
90系列三极管大多是以90字为开头的,但也有以ST90、C或A90、S90、SS90、UTC90开头的,它们的特性及管脚排
列都是一样的。
9011结构:
NPN
集电极-发射极电压30V
集电极-基电压50V
射极-基极电压5V
集电极电流0.03A
耗散功率0.4W
结温150℃
特怔频率平均370MHZ
放大倍数:
D28-45E39-60F54-80G72-108H97-146I132-198
9012结构:
PNP
集电极-发射极电压-30V
集电极-基电压-40V
射极-基极电压-5V
集电极电流0.5A
耗散功率0.625W
结温150℃
特怔频率最小150MHZ
放大倍数:
D64-91E78-112F96-135G122-166H144-220I190-300
9013结构:
NPN
集电极-发射极电压25V
集电极-基电压45V
射极-基极电压5V
集电极电流0.5A
耗散功率0.625W
结温150℃
特怔频率最小150MHZ
放大倍数:
D64-91E78-112F96-135G122-166H144-220I190-300
9014结构:
NPN
集电极-发射极电压45V
集电极-基电压50V
“LED_asm”程序的详细步骤
功能:
实现8个LED同时闪烁(汇编语言)
步骤:
1.建立工程框架
1.新建工程的顶层文件夹:
“LED_asm”,也可根据需要自己命名。
2.在顶层文件夹“LED_asm”下新建文件夹“V0.0.0”,表示软件版本号。
3.运行“KeiluVision4”,点击主菜单“Project”è“NewuVisionProject”,选择上面建立的“V0.0.0”文件夹下,将新建的工程命名为“njut_stc”(也可根据需要自己命名)。
4.接下来出现“selectaCPUDataBaseFile”窗口,选择“STCMCUDatabase”,,点击“OK”。
5.接下来出现CPU选择窗口,选择CPU为“STC15F2K60S2”,点击“OK”。
6.接下来出现Copy’Startup.A51’toProjectFolderandADDFiletoProject?
’提示时,选择“否”,这样一个空的工程框架就建好了!
2.给工程添加文件
1.点击“
”图标,新建一个文件,点击“
”将新建的文件保存为“main.asm”(*.asm代表汇编语言文件)。
此时,新建的文件并没有包括到工程项目中。
2.右键点击左边Project栏中的“SourceGroup1”选择“AddFilesto‘SourceGroup1’…”,在打开的窗口中,将文件类型改为“AllFiles(*.*)”,选中“main.asm”,点击“add”,再点击“close”。
这样,新建文件“main.asm”就添加到工程中了。
3.程序修改
1.在“main.asm”中添加如下代码:
/**
*@filemain.asm
*@brief实现8个LED同时闪烁(汇编语言)
*@parCopyright(c):
*/
/**
*主程序
*/
LOOP:
MOV0x80,#0x00/**<8个LED同时亮*/
LCALLDELAY/**<子程序调用*/
MOV0x80,#0xff/**<8个LED同时灭*/
LCALLDELAY
LJMPLOOP/**<直接跳转到LOOP*/
/**
*延时子程序
*/
DELAY:
MOV0x07,#0x64/**<给0x07单元赋值*/
DELAY3:
MOV0x06,#0x64/**<给0x06单元赋值*/
DELAY2:
MOV0x05,#0x64/**<给0x05单元赋值*/
DELAY1:
NOP/**<空指令*/
DJNZ0x05,DELAY1/**<0x05单元的内容减1,如果不等于0,则跳转到DELAY1*/
DJNZ0x06,DELAY2
DJNZ0x07,DELAY3
RET/**<子程序结束,返回*/
END/**<表示汇编程序结束*/
2.大功告成!
点击工具栏中“
”图标,编译程序,查看是否有错。
如出现:
则,大功告成!
4.生成“*.hex”文件
1.点击工具栏中“
”图标,选择“output”标签栏,勾上“createHEXFile”左边的选择框,点击“OK”。
2.点击工具栏中“
”图标,编译程序,“*.hex”文件就自动生成在项目文件夹中了。
5.将生成的“*.hex”文件烧录到学习板中,观察运行结果
例题“LED_lib”的详细步骤
功能:
利用库函数,实现8个LED同时闪烁。
步骤:
1.建立工程框架
1.新建工程的顶层文件夹:
“LED_lib”,也可根据需要自己命名。
2.在顶层文件夹“LED”下新建文件夹“V0.0.0”,表示软件版本号。
3.在“V0.0.0”文件夹下新建“Output”、“SRC”文件夹。
4.将“库函数与例程”中的“库函数”文件夹整个拷贝到“V0.0.0”文件夹下,并重命名为:
“lib_stc”。
5.运行“KeiluVision4”,点击主菜单“Project”è“NewuVisionProject”,选择上面建立的“V0.0.0”文件夹下,将新建的工程命名为“stc”(也可根据需要自己命名)。
6.接下来出现“selectaCPUDataBaseFile”窗口,选择“STCMCUDatabase”,,点击“OK”。
7.接下来出现CPU选择窗口,选择CPU为“STC15F2K60S2”,点击“OK”。
8.接下来出现Copy’Startup.A51’toProjectFolderandADDFiletoProject?
’提示时,选择“否”,这样一个空的工程框架就建好了!
2.给工程添加文件
1.点击“
”图标,新建一个文件,点击“
”将新建的文件保存到“SRC”文件夹下,命名为“main.c”。
2.再新建2个文件,分别命名为“led.c”、“led.h”,保存到“SRC”文件夹下。
3.点击
,打开“Components,EnvironmentandBooks”窗口,双击“ProjectTargets”栏中的“Target1”将“Target1”改为“stc”。
4.将中间“Groups”栏中的“SourceGroup1”改为:
“USER”,在“USER”条目下的最右边“Files”栏中添加新建的“main.c”文件。
5.在中间的“Groups”栏中添加“DRIVERS”、“LIB_STC”2个条目,在“DRIVERS”条目下,添加新建的文件“led.c”文件;在“LIB_STC”条目下,添加文件“GPIO.c”、“delay.c”文件。
3.工程设置
1.打开“KeiluVision4”开发环境,点击
,打开“OptionsforTarget窗口。
2.点击“Output”栏,点击“SelectFolderforObjects…”按钮,选择目录“V0.0.0\output”为目录;选中“createhexfiles”前的复选框。
3.点击“Listing”栏,点击“SelectFolderforListings…”按钮,选择目录“V0.0.0\output”为目录。
4.点击“C/C++”栏,“IncludePaths”旁边的文本框后有一个按钮,点击调出“FolderSetup”窗口。
这里要添加2个目录:
“.\lib_stc”;“.\SRC”。
4.程序修改
1.
参考例题,修改文件:
“main.c”、“led.c”、“led.h”。
/**main.c文件
*@filemain.c
*@brief利用库函数,实现8个LED同时闪烁
*/
#include"config.h"
#include"delay.h"
#include"led.h"
/**
*主程序
*@paramNone
*@returnNone
*/
main(void)
{
led_config();
while
(1)
{
led_on(LED_ALL);
delay_ms(250);
led_on(LED_NULL);
delay_ms(250);
}
}
///////////////////////////////////////////////////////////////////////////////////////
Config.h文件
#ifndef__CONFIG_H
#define__CONFIG_H
/*********************************************************/
//#defineMAIN_Fosc22118400L//定义主时钟
//#defineMAIN_Fosc12000000L//定义主时钟
#defineMAIN_Fosc11059200L//定义主时钟
//#defineMAIN_Fosc5529600L//定义主时钟
//#defineMAIN_Fosc24000000L//定义主时钟
/*********************************************************/
#include"STC15Fxxxx.H"
/**************************************************************************/
#defineMain_Fosc_KHZ(MAIN_Fosc/1000)
/***********************************************************/
#endif
/*--------------------------------------------------------------------------
I
NTRINS.H
//51基本运算(包括_nop_空函数)
IntrinsicfunctionsforC51.
Copyright(c)1988-2004KeilElektronikGmbHandKeilSoftware,Inc.
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__INTRINS_H__
#define__INTRINS_H__
externvoid_nop_(void);
externbit_testbit_(bit);
externunsignedchar_cror_(unsignedchar,unsignedchar);
externunsignedint_iror_(unsignedint,unsignedchar);
externunsignedlong_lror_(unsignedlong,unsignedchar);
externunsignedchar_crol_(unsignedchar,unsignedchar);
externunsignedint_irol_(unsignedint,unsignedchar);
externunsignedlong_lrol_(unsignedlong,unsignedchar);
externunsignedchar_chkfloat_(float);
externvoid_push_(unsignedchar_sfr);
externvoid_pop_(unsignedchar_sfr);
#endif
//////////////////////////////////////////////////////////////////////////////////
DELAY.H
#ifndef__DELAY_H
#define__DELAY_H
#include"config.h"
voiddelay_ms(unsignedcharms);
#endif
///////////////////////////////////////////////////////////////////
LED.H
#ifndef_LED_H
#define_LED_H
#include"config.h"
#include"GPIO.h"
#defineGPIO_P_LEDGPIO_P0/**#definePORT_LEDP0
voidled_config(void);
voidled_on(unsignedcharleds);
#endif
////////////////////////////////////////////////////////////////////////////
GPIO.H
#ifndef__GPIO_H
#define__GPIO_H
#include"config.h"
#defineGPIO_PullUp0//上拉准双向口
#defineGPIO_HighZ1//浮空输入
#defineGPIO_OUT_OD2//开漏输出
#defineGPIO_OUT_PP3//推挽输出
#defineGPIO_Pin_00x01//IO引脚Px.0
#defineGPIO_Pin_10x02//IO引脚Px.1
#defineGPIO_Pin_20x04//IO引脚Px.2
#defineGPIO_Pin_30x08//IO引脚Px.3
#defineGPIO_Pin_40x10//IO引脚Px.4
#defineGPIO_Pin_50x20//IO引脚Px.5
#defineGPIO_Pin_60x40//IO引脚Px.6
#defineGPIO_Pin_70x80//IO引脚Px.7
#defineGPIO_Pin_All0xFF//IO所有引脚
#defineGPIO_P00//
#defineGPIO_P11
#defineGPIO_P22
#defineGPIO_P33
#defineGPIO_P44
#defineGPIO_P55
typedefstruct
{
u8Mode;//IO模式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
u8Pin;//要设置的端口
}GPIO_InitTypeDef;
u8GPIO_Inilize(u8GPIO,GPIO_InitTypeDef*GPIOx);
#endif
//////////////////////////////////////////////////////////////
/**
*@fileled.c
#include"config.h"
#include"GPIO.h"
#include"delay.h"
#include"led.h"
/**
*LED配置函数
*@paramNone
*@returnNone
*/
voidled_config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.Pin=GPIO_Pin_All;
GPIO_InitStructure.Mode=GPIO_OUT_PP;
GPIO_Inilize(GPIO_P_LED,&GPIO_InitStructure);
}
/**
*点亮led
*@param[in]leds选择打开的LED
*@returnNone
*/
voidled_on(unsignedcharleds)
{
PORT_LED=~leds;
}
/////////////////////////////////////////////////////////////////
GPIO.c
/*************功能说明**************
本文件为STC15xxx系列的端口初始化程序,用户几乎可以不修改这个程序.
******************************************
#include"GPIO.h"
//========================================================================
//函数:
u8GPIO_Inilize(u8GPIO,GPIO_InitTypeDef*GPIOx)
//描述:
初始化IO口.
//参数:
GPIOx:
结构参数,请参考timer.h里的定义.
//返回:
成功返回0,空操作返回1,错误返回2.
//版本:
V1.0,2012-10-22
//========================================================================
u8GPIO_Inilize(u8GPIO,GPIO_InitTypeDef*GPIOx)
{
if(GPIO>GPIO_P5)return1;//空操作
if(GPIOx->Mode>GPIO_OUT_PP)return2;//错误
if(GPIO==GPIO_P0)
{
if(GPIOx->Mode==GPIO_PullUp)P0M1&=~GPIOx->Pin,P0M0&=~GPIOx->Pin;//上拉准双向口
if(GPIOx->Mode==GPIO_HighZ)P0M1|=GPIOx->Pin,P0M0&=~GPIOx->Pin;//浮空输入
if(GPIOx->Mode==GPIO_OUT_OD)P0M1|=GPIOx->Pin,P0M0|=GPIOx->Pin;//开漏输出
if(GPIOx->Mode==GPIO_OUT_PP)P0M1&=~GPIOx->Pin,P0M0|=GPIOx->Pin;//推挽输出
}
if(GPIO==GPIO_P1)
{
if(GPIOx->Mode==GPIO_PullUp)P1M1&=~GPIOx->Pin,P1M0&=~GPIOx->Pin;//上拉准双向口
if(GPIOx->Mode==GPIO_HighZ)P1M1|=GPIOx->Pin,P1M0&=~GPIOx->Pin;//浮空输入
if(GPIOx->Mode==GPIO_OUT_OD)P1M1|=GPIOx->Pin,P1M0|=GPIOx->Pin;//开漏输出
if(GPIOx->Mode==GPIO_OUT_PP)P1M1&=~GPIOx->Pin,P1M0|=GPIOx->Pin;//推挽输出
}
if(GPIO==GPIO_P2)
{
if(GPIOx->Mode==GPIO_PullUp)P2M1&=~GPIOx->Pin,P2M0&=~GPIOx->Pin;//上拉准双向口
if(GPIOx->Mode==GPIO_HighZ)P2M1|=GPIOx->Pin,P2M0&=~GPIOx->Pin;//浮空输入
if(GPIOx->Mode==GPIO_OUT_OD)P2M1|=GPIOx->Pin,P2M0|=GPIOx->Pin;//开漏输出
if(GPIOx->Mode==GPIO_OUT_PP)P2M1&=~GPIOx->Pin,P2M0|=GPIOx->Pin;//推挽输出
}
if(GPIO==GPIO_P3)
{
if(GPIOx->Mode==GPIO_PullUp)P3M1&=~GPIOx->Pin,P3M0&=~GPIOx->Pin;//上拉准双向口
if(GPIOx->Mode==GPIO_HighZ)P3M1|=GPIOx->Pin,P3M0&=~GPIOx->Pin;//浮空输入
if(GPIOx->Mode==GPIO_OUT_OD)P3M1|=GPIOx->Pin,P3M0|=GPIOx->Pin;//开漏输出
if(GPIOx->Mode==GPIO_OUT_PP)P3M1&=~GPIOx->Pin,P3M0|=GPIOx->Pin;//推挽输出
}
if(GPIO==GPIO_P4)
{
if(GPIOx->Mode==GPIO_PullUp)P4M1&=~GPIOx->Pin,P4M0&=~GPIOx->Pin;//上拉准双向口
if(GPIOx->Mode==GPIO_H