当前位置:文档之家› 单片机

单片机

单片机
单片机

单片机实验报告授课老师:陈万忠

姓名:李晓

班级:21

学号:52112113

第一次实验IO口和中断使用

【IO口】

1.实验原理:

MC9S12XS单片机有11个并行的IO口,包括A、B、E、K等。其中A、B、K作为通用的IO口,其他IO口除了作为通用IO 口外,还具有复用功能。每个IO口都有方向寄存器、数据寄存器、低功耗使能寄存器和上拉或下拉寄存器,通过设置寄存器来选择端口是输入还是输出,使能低功耗以及上拉或者下拉。

2.实验工具:

MC9S12XS128单片机学习板、导线若干。

3.实验内容及步骤:

根据所想要实现的IO口功能,在Codewarrior环境中编写程序,根据程序中的内容来连接相应的端口,最后将程序编译下载到单片机中。本次实验主要是编写复位和流水灯程序。

4.实验程序:

(1)复位:

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */ unsigned char k; //用于计数

/*************************************************************/ /* 延时函数 */

/*************************************************************/ void delay(void)

{

unsigned int i,j;

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

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

}

/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) {

DisableInterrupts;

DDRB =0xff; //PB口输出

PORTB =0x0f; //你可以改变PB口数据,显示不同形式的闪烁,如,0x0F,0xAA,0x55等

EnableInterrupts;

for(k=0;k<5;k++) //5次闪烁

{

delay();

PORTB=~PORTB;

delay();

PORTB=~PORTB;

}

for(;;); //死循环。

//将来应用时,以上可作为你设备的自检程序

(2)流水灯

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */ unsigned char data=0x01;

/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(void)

{

unsigned int i,j;

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

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

;

}

/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) {

DisableInterrupts;

DDRB=0xff; //设置为输出

PORTB=~data; //点亮LED1。如果不取反,有什么现象?

EnableInterrupts;

for(;;)

{

delay();

data=data<<1; //左移一位,补零

if(data==0)

data=0x01;

PORTB=data;

}

}

5、实验现象;

(1)复位:运行后,PB口指示灯连续闪烁五次后灭,按复位键后,再闪烁五次。

流水灯:板上的D1、D2、D3、D4、D5、D6、D7、D8中有一个点亮,并且循环移动。

【中断的使用】

1.实验原理:

中断系统是为了使CPU具有对单片机外部或者内部随机发生的

事件做实时处理的功能而设置的。中断系统的应用大大提高了CPU的工作效率。当CPU正在执行程序时,单片机外部或者内部发生的某一事件请求CPU迅速去处理,CPU就暂停当前的工作,转到中断子程序里面去处理那个事件,CPU处理完之后再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。

中断分为两种:可屏蔽中断和非可屏蔽中断。本次实验使用的是IRQ外部中断,属于可屏蔽中断,通过控制其控制寄存器中的IRQE和IRQEN位来实现中断控制。

2.实验工具:

MC9S12XS128单片机学习板、导线若干。

3.实验内容及步骤:

本次实验是将单片机上的IRQ引脚接到主板上的IRQA或者IRQB 上面,来实现单片机外部中断的两种触发方式,即一种为低电平另一种为下降沿。然后编写相应的程序,来实现当外部触发中断时,流水灯就向前走一步,触发一次走一次。

4.实验程序:

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */ unsigned char data=0x01;

/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(void)

{

unsigned int i,j;

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

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

;

}

/******************PE1口中断设置****************************/ void IRQ_Init(void) { //IRQ中断允许寄存器IRQCR

IRQCR_IRQE=1; //下降沿触发

//IRQCR_IRQEN=1; //中断使能。复位默认为1,可将此句去掉}

/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) {

DisableInterrupts; //中断禁止

DDRB=0xff; //设置为输出

PORTB=~data; //点亮LED1

asm ANDCC #$eF //XIRQ中断允许,是低电平触发,无寄存器设置

IRQ_Init();

EnableInterrupts; //中断允许

for(;;); //死循环,等中断

}

/***********************中断处理***************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED //中断

void interrupt 6 IRQ_interrupt(void) // IRQ中断号规定为6,见MC9S12XS128.h文件

{ //XIRQ中断号规定为5,见MC9S12XS128.h文件

data=data<<1; //左移一位

if(data==0)

data=0x01;

PORTB= ~data;

delay();

}

#pragma CODE_SEG DEFAULT

5.实验现象:

如果连接的是IRQ-A,则按键松开流水灯灯移动一位;如果连接的是IRQ-B,则按键按下流水灯灯移动一位。(用下降沿触发中断)。

6.第一次试验总结:

通过本次实验,我基本了解到了MC9S12单片机的IO口及外部中断IRQ和XIRQ的使用方法,也初步体会到单片机功能的强大,可以在上面运行很多的功能,进一步增强了我对单片机这门科目的热爱,以后会进一步地去深入学习单片机相关理论知识,来满足我对单片机的兴趣。

第二次实验PIT和SPI模块的使用

【PIT模块】

1.实验原理:

PIT是周期中断定时器(Periodic Interrupt Timer)的名称,实际上PIT模块就是一个24位递减计数器,用作精确计时。首先给计数器设定一个初值,每过一个总线周期,计数器进行减1操作,当计数器减为0之后,触发中断,并再次自动载入初值。

2.实验工具:MC9S12XS128单片机,导线若干。

3.实验内容及步骤:

本次实验主要是利用PIT模块来实现一秒定时来控制PB口的灯的亮灭;另外还利用该模块结合数码管显示来实现数字秒表以及数字时钟的功能。具体操作如下:先用导线将需要用到的端口连起来,比如数码管显示端口等。再编写相应的程序来实现控制。打开电源,观察现象。

4.实验程序:

(1)一秒灯亮灭

#include

#include "derivative.h"

//***********************变量定义*********************

unsigned int test_pulse=0;

//************************函数申明********************

void SetBusCLK_64M(void);

void PIT_Init(void); //10ms定时设置

//***********************主函数***********************

void main(void)

{ test_pulse=0;

SetBusCLK_64M();

PIT_Init();

DDRB=0xff;

PORTB=0xff;

EnableInterrupts;

for(;;) {

} //等待中断的到来

}

//***********************锁相环初始化***********************

void SetBusCLK_64M(void)

{

CLKSEL=0X00; //解除锁相环时钟disengage PLL to system PLLCTL_PLLON=1; //打开锁相环(turn on PLL)

SYNR =0xc0 | 0x07;

REFDV=0x80 | 0x01;

POSTDIV=0x00;

//pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;

while(!(CRGFLG_LOCK==1)); //当锁相环稳定时使用(when pll is steady ,then use it);

CLKSEL_PLLSEL =1; //启用锁相环时钟(engage PLL to system);

}

//******************速度捕捉定时中断*************************************

void PIT_Init(void) //100ms定时设置 //必须全是通道0,才能保证是66号中断

{

PITCFLMT_PITE=0; //关闭PIT

PITCE_PCE0=1; //使能通道0

PITMTLD0= 160-1; //8位定时器初值设定。160分频,在64MHzBusClock下,为0.4MHz,即2.5us

PITLD0 = 40000 - 1 ;

PITMUX_PMUX0=0;

PITINTE_PINTE0=1; //开通PIT0定时器的溢出中断

PITCFLMT_PITE=1; //使能PIT

}

//***********************速度捕捉中断入口*********************** #pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区//interrupt void PIT_INTER(void) //中断号必须写

void interrupt 66 PIT_INTER(void)

{

PITTF=0x1;

test_pulse++;

if(test_pulse==10) {

PORTB=~PORTB;

test_pulse=0;

}

}

#pragma CODE_SEG DEFAULT

(2)数字秒表

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */

#define LEDCPU PORTB

#define LEDCPU_dir DDRB

#define BUS_CLOCK 32000000 //总线频率

#define OSC_CLOCK 16000000 //晶振频率

//***********************常量定义*********************

const unsigned char DisplayDecode[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7 f,~0x6f,//0-9

~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};//

带小数点的0-9

const unsigned char WeiMa[]={0xf7,0xfb,0xfd,0xfe};

int ms,s,flag;

int status;//状态位 0表示启动秒表,1停止,2清零

int data1,data2,data3,data4;

//************函数声明************************

void display(unsigned char wei,int data);

void delay_ms(int m);

void dis(int time ,int a, int b, int c,int d) ;

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

/* 初始化锁相环 */

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

void INIT_PLL(void)

{

CLKSEL &= 0x7f; //set OSCCLK as sysclk

PLLCTL &= 0x8F; //Disable PLL circuit

CRGINT &= 0xDF;

#if(BUS_CLOCK == 40000000)

SYNR = 0x44;

#elif(BUS_CLOCK == 32000000)

SYNR = 0x43;

#elif(BUS_CLOCK == 24000000)

SYNR = 0x42;

#endif

REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M

PLLCTL =PLLCTL|0x70; //Enable PLL circuit

asm NOP;

asm NOP;

while(!(CRGFLG&0x08)); //PLLCLK is Locked already

CLKSEL |= 0x80; //set PLLCLK as sysclk

}

/*************************************************************/ /* PIT模块初始化函数 */ /*************************************************************/ void init_PIT(){

PITMTLD0=249; //为0通道8位计数器赋值

PITLD0=639; //为0通道16位计数器赋值

//(249+1)*(639+1)=16000个总线周期

PITMUX_PMUX0=0; //第0通道使用微计数器0

PITCE_PCE0=1; //第0通道计数器工作

PITCFLMT=0X80; //使能周期中断定时器

PITINTE_PINTE0=1; //0通道定时器定时中断被使能

}

/******************PE1口中断设置****************************/ void IRQ_Init(void) {

IRQCR_IRQE=1; //下降沿触发

IRQCR_IRQEN=1; //场同步中断IRQ中断,初始化开启

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt void PIT_INTER(void)

{

PITTF_PTF0=1;

flag++;

if(flag==2) {

flag=0;

ms+=1;

if(ms==99) {

ms=0;

s+=1;

if(s==60) {

s=0;

ms=0;

}

}

}

data1=s/10;

data2=s%10+10;

data3=ms/10;

data4=ms%10;

}

void interrupt 6 IRQ_interrupt(void)

{

switch(status){

case 0:

PITINTE_PINTE0=1; //0通道定时器定时中断被使能 status=1;

break;

case 1:

PITINTE_PINTE0=0; //关0通道定时器定时中断? status=2;

break;

case 2:

status=0;

data1=0;

data2=10;data3=0;

data4=0;

s=0;ms=0;

break;

}

}

#pragma CODE_SEG DEFAULT

/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) {

ms=0;

s=0;

flag=0;

status=0;

data1=0,data2=10,data3=0,data4=0;

DDRT=0xff;

DDRP=0xff;

INIT_PLL();

LEDCPU_dir=0xff;

init_PIT();

IRQ_Init();

PITINTE_PINTE0=0; //关0通道定时器定时中断被使能

EnableInterrupts;

for(;;) {

dis(1,data1,data2,data3,data4);

}

}

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

显示函数,第一个参数是显示维持的时间,比如1持续显示1秒,第二个到

第四个参数分别是第一位到第四位显示的数字

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

void dis(int time ,int a, int b, int c,int d)

{int i;

for(i=1;i

display(1,a);

display(2,b);

display(3,c);

display(4,d);

}

}

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

显示函数包含位选和段选

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

void display(unsigned char wei,int data)

{

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

/*-----------------ms 级延时---------------------*/

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

void delay_ms(int m)

{int i,j;

for(j=0;j

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

}

PTT=WeiMa[wei-1];

PTP=DisplayDecode[data];

delay_ms(1);

}

(3)数字时钟

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */ #include

#pragma LINK_INFO DERIVATIVE "MC9S12XS128"

const unsigned char DisplayDecode[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d, ~0x07,~0x7f,~0x6f}; //数字0~9的字形码

unsigned char showdata[4]; //设定显示缓冲区

unsigned char vTmpPIT,second,minute;

#define PITTIME 10000 //设定为50ms定时

/*************************************************************/ /* 初始化IO函数(B/P/T口) */ /*************************************************************/ void initIOoutput(void)

{

DDRB=0XFF;

PORTB=0XFF;

DDRP=0XFF;

DDRT=0XFF;

}

/*************************************************************/ /* 初始化PIT函数 */ /*************************************************************/ void initPIT(void) //定时中断初始化函数50ms

{

PITCFLMT_PITE=0; //关闭PIT模块

PITCE_PCE0=1; //定时器通道0使能

PITMUX_PMUX0=0; //定时器通道0使用微计数器0

PITMTLD0=200-1; //8位定时器初值设定。在40MHzBusClock下为5us.

PITLD0=PITTIME-1; //16位定时器初值设定。PITTIME*0.005ms=50ms PITINTE_PINTE0=1; //定时器中断通道0中断使能

PITCFLMT_PITE=1; //定时器通道0使能

}

/*************************************************************/ /* PIT中断函数 */ /*************************************************************/ void interrupt 66 PIT0(void)

{

PITTF_PTF0=1; //清中断标志位

vTmpPIT++;

if(vTmpPIT==20) //秒数处理

{

second++;

if(second==60) //分钟数处理

{

second=0;

minute++;

if(minute==60) minute=0;

}

vTmpPIT=0;

}

}

/*************************************************************/ /* 初始化锁相环函数 */ /*************************************************************/ void pllclk(void) //外部时钟16MHz,锁相环时钟80MHz,总线时钟为40MHz

{

SYNR=0x53; //PLLCLK =2*fosc*(SYNDIV + 1)/(REFDIV + 1)

REFDV=0x07;

while(CRGFLG_LOCK==0); //时钟校正同步

CLKSEL_PLLSEL=1;

}

/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(unsigned int countert)

{

unsigned int i,j;

for(i=0;i

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

}

/*************************************************************/ /* 数码管显示函数 */ /*************************************************************/ void Show()

{

unsigned char DisplayNumber;

PTT=0x0f;

for(DisplayNumber=0;DisplayNumber<4;DisplayNumber++)

{

PTP=DisplayDecode[showdata[DisplayNumber]];

if(DisplayNumber==2) PTP&=0x7f;

switch(DisplayNumber)

{

case 0:

PTT=0xfe;

break;

case 1:

PTT=0xfd;

break;

case 2:

PTT=0xfb;

break;

default:

PTT=0xf7;

break;

单片机制作

自己动手做单片机实验板 孔子说:“工欲善其事,必先利其器”,学习单片机所用的工具、元器件和数模电路是有一些区别的,我们在学习之前最好先备齐它们,至少让外人看出我们是搞过单片机的。有几样东东很重要,在上场之前不得不提及。 刀枪剑戟 一台电脑:这在日后写程序或是下载程序都是必需之物。现在的新款电脑越来越不适合单片机学习了或者说单片机的设备也应该更新换代了,一般常用的 9针串口和 25针并口多数被方方正正的 USB接口所取代。更新推出的操作系统对开发软件支持并不很好,建议大家使用 WIN XP或 WIN 2000系统。不用考虑 CPU速度和存储空间,同时电脑要有 9针的串口和 25针的并口(打印机接口),如果没有可以用 USB转换器扩展,不过其效果不如原配夫妻。 ISP下载线:从电脑向手机下载图片或音乐一般都有一条连接线,再配上手机专用的软件就可以让手机丰富多彩了。单片机也可以用这样的方法,虽然这不是唯一的方法,但这较适合一般的单片机学习,好而不贵。ISP下载线就是一个设计有简单电路的单片机程序下载工具,它就像塑造生命的天使,配上小巧的 ISP下载软件就可以施与单片机灵魂。虽然我们不是上帝,但在后文我们先要亲手塑造它,先做好心理准备。 实验板:这是一年半载也玩不腻的家伙,因为这是在学习中不断扩展的。它是将一块单片机焊在一片电路板中间,板上还焊有电源和单片机的最小系统电路,见图 1。如果继续往下说许多读者朋友会骂我太粗心了,所以我不得不解释一下“最小系统”是啥东东。随便抓一个数模电路的芯片,它要是想正常工作必须有一个先天条件,就是符合要求的电源。单片机也是一样,不过它太讲究了,要的东西更多。除了一个稳定的电源供电之外,它还需要一个复位电路,就是给单片机一个信号让它归回到开始工作的状态。同时晶振部分电路也是必不可少的,这相当于给单片机带了一块手表,让它有时间观念,知道自己什么时候该干什么事情。总之最小系统就是保证单片机正常工作的最基本电路部分。OK,再说回到单片机实验板。我是买元器件自己制作实验板的,我感觉没有必要多花钱去买一个成品,虽然这样说卖实验板的人可能会扁我。自己动手可以学到单片机硬件电路的知识和掌握制作的细节,这是不可多得的实践机会。你决定实验板 DIY了吗?我们一起做吧!

8051单片机的内部结构

8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。 8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: 中央处理器(CPU)是整个单片机的核心 部件,是8位数据宽度的处理器,能处理 8位二进制数据或代码,CPU负责控制、 指挥和调度整个单元系统协调的工作,完 成运算和控制输入输出功能等操作。 ·数据存储器(RAM): 8051内部有128个8位用户数据存储 单元和128个专用寄存器单元,它们是统 一编址的,专用寄存器只能用于存放控制 指令数据,用户只能访问,而不能用于存 放用户数据,所以,用户能使用的的RAM 只有128个,可存放读写的数据,运算的 中间结果或用户定义的字型表。 ·程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 ·定时/计数器(ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 ·并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。 ·全双工串行口: 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以 用作异步通信收发器,也可以当同步移位器使用。 ·中断系统: 8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可 满足不同的控制要求,并具有2级的优先级别选择。 ·时钟电路: 8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051 单片机需外置振荡电容。

单片机35个实例1(汇编)

1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此, 我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太 大,所以我们在执行某一指令时,插入延时程序,来达到我们 的要求,但这样的延时程序是如何设计呢?下面具体介绍其原 理: 如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒 机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248 =498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002

因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7 =248时,延时10ms,以此为基本的计时单位。如本实验要求 0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如 下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据 发光二极管的单向导电性可知,这时发光二极管L1熄灭;当 P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我 们可以使用SETB P1.0指令使P1.0端口输出高电平,使用 CLR P1.0指令使P1.0端口输出低电平。 5.程序框图

单片机十八般兵制作

单片机入门制作专辑--2.十八般兵器 [ 来源:本站原创 | 作者: | 时间:2008年02月11日 | 浏览: 1417 十八般兵器 快使用单片机,哼哼哈兮! 孔子说:“工欲善其事,必先利其器”,学习单片机所用的工具、元器件和数模电路是有一些区别的,我们在学习之前最好先备齐它们,至少让外人看出我们是搞过单片机的。有几样东东很重要,在上场之前不得不提及。 刀枪剑戟 一台电脑:这在日后写程序或是下载程序都是必需之物。现在的新款电脑越来越不适合单片机学习了或者说单片机的设备也应该更新 换代了,一般常用的 9针串口和 25针并口多数被方方正正的 USB接口所取代。更新推出的操作系统对开发软件支持并不很好,建议大家使用 WIN XP或 WIN 2000系统。不用考虑CPU速度和存储空间,同时电脑要有 9针的串口和 25针的并口(打印机接口),如果没有可以用 USB转换器扩展,不过其效果不如原配夫妻。 ISP下载线:从电脑向手机下载图片或音乐一般都有一条连接线,再配上手机专用的软件就可以让手机丰富多彩了。单片机也可以用这样的方法,虽然这不是唯一的方法,但这较适合一般的单片机学习,好而不贵。ISP下载线就是一个设计有简单电路的单片机程序下

载工具,它就像塑造生命的天使,配上小巧的 ISP下载软件就可以施与单片机灵魂。虽然我们不是上帝,但在后文我们先要亲手塑造它,先做好心理准备。 实验板:这是一年半载也玩不腻的家伙,因为这是在学习中不断扩展的。它是将一块单片机焊在一片电路板中间,板上还焊有电源和单片机的最小系统电路,见图 1。如果继续往下说许多读者朋友会骂我太粗心了,所以我不得不解释一下“最小系统”是啥东东。随便抓一个数模电路的芯片,它要是想正常工作必须有一个先天条件,就是符合要求的电源。单片机也是一样,不过它太讲究了,要的东西更多。除了一个稳定的电源供电之外,它还需要一个复位电路,就是给单片机一个信号让它归回到开始工作的状态。同时晶振部分电路也是必不可少的,这相当于给单片机带了一块手表,让它有时间观念,知道自己什么时候该干什么事情。总之最小系统就是保证单片机正常工作的最基本电路部分。OK,再说回到单片机实验板。我是买元器件自己制作实验板的,我感觉没有必要多花钱去买一个成品,虽然这样说卖实验板的人可能会扁我。自己动手可以学到单片机硬件电路的知识和掌握制作的细节,这是不可多得的实践机会。你决定实验板 DIY了吗?我们一起做吧! 图 1 忘了是哪一部抗日题材的电影里有一句经典台词:“别看你今天闹的欢,小心将来拉清单”。当时我还真不知道这话的意思,但我写到这里的时候我终于明白了,闹了这么长时间单片机,今天终于到我拉清单了。附表所示这个清单列出了学习单片机所需要的兵器,这是在成家立业之前必要的条件,里面我列出了大概的市场价格以防被黑。各元器件的外形如图 2所示。其实满打满算学习单片机也要不了几个钱,一般的元器件也就几块钱。几块钱能买什么?买不了房子买不了田,买几个元器件能用好几年。必要的时候可以和卖元器件的老板砍砍价,你砍得多省得多,回去能买辆自行车。 附表实验板 DIY元器件采购清单

自制单片机烧写器

像我们这样搞电子的人,要的就是动手的乐趣。下面我们来介绍近期在网络上非常流行的USBasp下载线,因为现在的笔记本包括台式机都渐渐地舍弃了并口、串口;所以之前的并口或串口下载线已经不能再使用了,应该说是做个USBasp下载线是势在必行的,下面我们来介绍其制作的全过程。 图(1) 图1为原作者设计的原理图,为了便于制作我修改过某部分电路如图2,其功能一样。

图(2) 在制作之前首先要搞清楚几点: 第一、这个USB下载线本身就是一块AVR单片机,在制作过程中也必需对其进行程序下载才能运行。 第二、先得大概了解一下这个AVR单机机ATmega8的基本资料。这样才能对电路有个了解,从而便于调试。第三COM1是PC机与USB相接的端口,我们在焊接时一定要区分GND、VCC、D+、D-,下面图(3)是对应本次制作的USB端口的引脚功能。在焊接的之前务必搞清楚,否则会造成PC机端口的USB或下载给的ATmega8烧毁。

图(3)USB端口引脚功能 第四﹑最后我们来了解一下电路的结构。对应图2,其中JP1是选择下载时的速度是快速或慢速,当JP1接地时选择低速,否则为高速。对于选择快速还是慢是相对于被下载的单片机晶振时钟而言的。一般来讲,目标单片机与USBasp的ATmega8的时钟不能相差太远。而JP2是电源的选择,当短接时被下载的单片机选择USBasp供电,则否选择独立供电。切记:两者只能任选其一。LED2为ATmega8程序运行的指示灯,当其点亮时就证明USBasp运行正常。LED1为下载程序时的工作指示灯,当接收到上位机信号

时,此灯就会闪动。 图(4)制作的全部元器件 图(5_a)与图2对应的PCB板顶层

51单片机最小系统制作 全过程

51单片机最小系统制作 第一章概述 1.1 缘起 1. 给51初学者提供一个简单的DIY的教材。 第二章跑马灯和串口 2.1 第一步:准备 准备一下器件: 1、烙铁(质量好点) 2、焊锡(细) 3、烙铁架(带一个专用海绵) 4、松香块 5、万用表(要有带响的,听听红黑表笔短接时的声音出来快不快) 6、PCB面万用板1块 7、40pin 插座1个 8、11.0592M晶振1个 9、30P瓷片电容2个 10、11个LED 11、电阻排1K 1个到VCC,做跑马灯LED的限流电阻 12、max232或者兼容的芯片 13、16pin的插座上去 14、STC89C51 15、其它杂物 以上的投资加起来,不会超出100元。

价格数量和封装如下: STC的单片机可以串口下载。 解释一下: LED:8个挂在P1口,排电阻是上拉限流的;2个作为串口收发的指示灯;1个LED作为电源指示灯; 独石电容6个:5个是使用在max232上的;一个是使用在单片机上,作为电源去耦的; 10K电阻1个,接在EA上,上拉到5V; 电解电容和电阻构成上电复位电路;(STC单片机不需要)

自己买2个DB9的母头,焊接一根串口电缆; 准备一个3PIN的插座,焊接在PCB的面包板上; 还有电源,Dc5V的电源很多,电源电压差一点问题不大;很多单片机现在电源范围都宽; STC单片机应该可以工作在4V以上,具体查资料。 准备好以上物品,可以准备焊接好了。 来一张全家福: 2.2 第二步:焊接单片机最小系统

2.3 第三步:焊接串口指示灯 2.4 第四步:在P1口上焊接跑马灯

2.5 第五步:焊接Dc5V电源指示灯 2.6 第六步:焊接max232的5个0.1u电容

单片机内部主要部件

1.2 单片机内部主要部件 单片机内部电路比较复杂,MCS-51系列的8051型号单片机的内部电路根据功能可以分为CPU、RAM、ROM/EPROM、并行口、串行口、定时/计数器、中断系统及特殊功能寄存器(SFR)等8个主要部件,如图1-2-1所示。这些部件通过片内的单一总线相连,采用CPU加外围芯片的结构模式,各个功能单元都采用特殊功能寄存器集中控制的方式。其他公司的51系列单片机与8051结构类似,只是根据用户需要增加了特殊的部件,如A/D转换器等。在设计程序过程中,寄存器的使用非常频繁。本节内容在了解单片机内部的组成机构基础上,重点介绍单片机内部常用的寄存器的作用。 图1-2-1 MCS-51架构 1.2.1中央处理器(CPU) 中央处理器是单片机的核心,主要功能是产生各种控制信号,根据程序中每一条指令的具体功能,控制寄存器和输入/输出端口的数据传送,进行数据的算术运算、逻辑运算以及位操作等处理。MCS-51系列单片机的CPU字长是8位,能处理8位二进制数或代码,也可处理一位二进制数据。单片机的CPU从功能上一般可以分为运算器和控制器两部分。 一、控制器 控制器由程序计数器PC、指令寄存器、指令译码器、定时控制与条件转移逻辑电路等组成。其功能是对来自存储器中的指令进行译码,通过定时电路,在规定的时刻发出各种操作所需的全部内部和外部的控制信号,使各部分协调工作,完成指令所规定的功能。各部分功能部件简述如下。 1.程序计数器PC(Program Counter) 程序计数器是一个16位的专用寄存器,用来存放下一条指令的地址,具有自动加1的功能。当CPU要取指令时,PC的内容送地址总线上,从存储器中去取出一个指令码后,PC 内容自动加1,指向下一个指令码,以保证程序按顺序执行。 PC是用来指示程序的执行位置,在顺序执行程序时,单片机每执行一条指令,PC就自动加1,以指示出下一条要取的指令的存储单元的16位地址。也就是说,CPU总是把PC 的内容作为地址,根据该地址从存储器中取出指令码或包含在指令中的操作数。因此,每当取完一个字节后,PC的内容自动加1,为取下一个字节做好准备。由于51系列单片机的寻址范围为64K,所以,PC中数据的编码范围为0000H~FFFFH,共64K。单片机上电或复位时,PC自动清0,即装入地址0000H,这就保证了单片机上电或复位后,程序从0000H 地址开始执行。

单片机最小系统制作方案(适合初学者)

教学】单片机最小系统制作方案(适合初学者) 在写本单片机教程前,先自我介绍一下,我今年刚28岁,从事单片机教学二年。教学经验不足,写的不好,还请谅解,但是,我一定会尽力的。同时也希望大家能把我当朋友,共同进退。 本人喜欢上网,不喜欢运动,所以比较胖。我很喜欢在房间里做自己想做的事,如做网站,并建有自己的网站:〖教师吧〗:https://www.doczj.com/doc/ba15205198.html,保证长期有效。QQ是569 43772,E-MAIL:99xsw@https://www.doczj.com/doc/ba15205198.html, 单片机最小系统制作 一、确定任务 开发单片机最小系统 二、任务分析: 该系统具有的功能: (1)具有2位LED数码管显示功能。 (2)具有八路发光二极管显示各种流水灯。 (3)可以完成各种奏乐,报警等发声音类实验。 (4)具有复位功能。 三、功能分析 (1)两位LED数码管显示功能,我们可以利用单片机的P0口接两个数码管来现这个功能;(2)八路发光二极管显示可以利用P1口接八个发光二极管实现这个功能; (3)各种奏乐、报警等发声功能可以采用P2.0这个引脚接一蜂鸣器来实现。 (4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部振荡方式设计的。 四、设计框图

五、硬件电路设计 根据本系统的功能,和单片机的工作条件,我们设计出下面的电路图。

六、元件清单的确定: 数码管:共阴极2只(分立) 电解电容:10UF的一只 30PF的电容2只 220欧的电阻9只 4.7K的电阻一只 1.2K的电阻一只 4.7K的排阻一只, 12MHZ的晶振一只 有源5V蜂名器一只 AT89S51单片机一片 常开按钮开关1只 紧锁座一只(方便芯取下来的,绿色的) 发光二极管(5MM红色)8只 万能板电路版15*17CM S8550三极管一只 4.5V电池盒一只,导线若干。 七、硬件电路的焊接 按照原理图把上面的元件焊接好,详细步骤省略。 八、相关程序编写 针对上面的电路原理图,设计出本系统的详细功能: (1)、第一个发光二极管点亮,同时数码管显示“1”。 (2)、第二个发光二极管点亮,同时数码管显示“2”。 (3)、依次类推到第八个发光二极管点亮,同时数码管显示“8”。以上出现的是流水灯的效果

基于protuse的单片机模拟的实例

本人对单片机的一些了解,在这里和大家分享。 (1)基于AT89C52的同步串口通信 ①单片机1程序 (程序在Kile C51上运行通过。) /******************************************************************** * 文件名:液晶1602显示.c * 描述: 该程序实现了对液晶1602的控制。 * 创建人:东流,2009年4月10日 * 版本号:2.0 ***********************************************************************/ #include #define uchar unsigned char #define uint unsigned int //这三个引脚参考资料 sbit E=P3^5; //1602使能引脚 sbit RW=P3^6; //1602读写引脚 sbit RS=P3^7; //1602数据/命令选择引脚 sbit aaa=P1^0; sbit bbb=P1^1; sbit aa=P3^0; sbit bb=P3^1; /******************************************************************** * 名称: delay() * 功能: 延时,延时时间大概为140US。 * 输入: 无 * 输出: 无

***********************************************************************/ void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++) ; } /******************************************************************** * 名称: enable(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void enable(uchar del) { P2 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** * 名称: write(uchar del) * 功能: 1602写数据函数 * 输入: 需要写入1602的数据 * 输出: 无 ***********************************************************************/ void write(uchar del) { P2 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay();

单片机电子琴制作16按键

《单片机原理》课程设计 说明书 专业名称:电气工程及其自动化 班级:11-2 学号: 姓名: 指导教师: 日期:2013.6.21

《单片机原理课程设计》评阅书

摘要 本文设计了一种基于STC12C5A32S2单片机的电子琴电路。该方案利用单片机定时器产生固定频率的方波信号以驱动蜂鸣器发出一定的旋律,通过矩阵键盘中的相应的按键来输入使蜂鸣器发出相对音阶的单音。同时设计还有自动存储所输入的单音,之后再一起自动演奏出来的功能。 本设计通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经三极管放大信号后驱动蜂鸣器发出不同音节的声音。要实现7个音符的各自的高、中、低音,需要建立三个表,分别存储高音、中音和低音的频率值;默认为中音输出,当二个按键开关中某一个按下,通过软件选择相应的音频。按下弹奏键就可弹奏出不同的声音。 另外用软件延时来控制发音时间的长短,来控制节拍。通过把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间,这样就可以实现乐曲的演奏。 本设计为实物电路板设计开发,报告中详细的阐述了电子琴设计的方法和过程。并经过软硬件的调试,该音乐发生器不但能通过键盘弹奏出很好的音调,而且还可以通过键盘选择播放不同的音乐。 本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。 关键词:STC12C5A32S2 单片机定时器电子琴

目录 摘要 ....................................... 错误!未定义书签。第一章引言 . (2) 第二章电子琴电路硬件电路设计 .............. 错误!未定义书签。 2.1单片机的介绍与组成 (4) 2.2单片机主控电路 (4) 2.3 4×4矩阵键盘电路 (5) 2.4 蜂鸣器电路 (5) 第三章电子琴电路软件设计 .................. 错误!未定义书签。 3.1 程序设计流程图...................... 错误!未定义书签。 3.2音乐播放部分 (5) 3.3电子琴弹奏部分 (5) 3.4发音原理 (5) 第四章程序 ................................ 错误!未定义书签。心得体会 ................................... 错误!未定义书签。参考文献 (11) 附件错误!未定义书签。

单片机自己制作

自己动手做单片机实验板 一台电脑:这在日后写程序或是下载程序都是必需之物。现在的新款电脑越来越不适合单片机学习了或者说单片机的设备也应该更新换代了,一般常用的 9针串口和 25针并口多数被方方正正的 USB接口所取代。更新推出的操作系统对开发软件支持并不很好,建议大家使用 WIN XP或 WIN 2000系统。不用考虑 CPU速度和存储空间,同时电脑要有 9针的串口和 25针的并口(打印机接口),如果没有可以用 USB转换器扩展,不过其效果不如原配夫妻。 ISP下载线:从电脑向手机下载图片或音乐一般都有一条连接线,再配上手机专用的软件就可以让手机丰富多彩了。单片机也可以用这样的方法,虽然这不是唯一的方法,但这较适合一般的单片机学习,好而不贵。ISP下载线就是一个设计有简单电路的单片机程序下载工具,它就像塑造生命的天使,配上小巧的 ISP下载软件就可以施与单片机灵魂。虽然我们不是上帝,但在后文我们先要亲手塑造它,先做好心理准备。 实验板:这是一年半载也玩不腻的家伙,因为这是在学习中不断扩展的。它是将一块单片机焊在一片电路板中间,板上还焊有电源和单片机的最小系统电路,见图 1。如果继续往下说许多读者朋友会骂我太粗心了,所以我不得不解释一下“最小系统”是啥东东。随便抓一个数模电路的芯片,它要是想正常工作必须有一个先天条件,就是符合要求的电源。单片机也是一样,不过它太讲究了,要的东西更多。除了一个稳定的电源供电之外,它还需要一个复位电路,就是给单片机一个信号让它归回到开始工作的状态。同时晶振部分电路也是必不可少的,这相当于给单片机带了一块手表,让它有时间观念,知道自己什么时候该干什么事情。总之最小系统就是保证单片机正常工作的最基本电路部分。OK,再说回到单片机实验板。我是买元器件自己制作实验板的,我感觉没有必要多花钱去买一个成品,虽然这样说卖实验板的人可能会扁我。自己动手可以学到单片机硬件电路的知识和掌握制作的细节,这是不可多得的实践机会。你决定实验板 DIY了吗?我们一起做吧!

单片机的内部结构

单片机的主要组成 ①一个8位的微处理器CPU。 ②片内数据存储器RAM(128B/256B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等。 ③片内程序存储器ROM/EPROM(4KB/8KB),用以存放程序、一些原始数据和表格。但也有一些单片机内部不带ROM/EPBOM,如8031、8032、80C31等。 ④四个8位并行I/O(输入/输出)接口P0—P3,每个口可以用作输入,也可以用作输出。 ⑤两个或三个定时/计数器,每个定时/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。 ⑥五个中断源的中断控制系统。 ⑦一个全双工UART(通用异步接收发送器)的串行I/O口,可实现单片机与单片机或其它微机之间串行通信。 ⑧片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接,最高允许振荡频率为12MHz。 /* BYTE Registers */ 1sfr P0 = 0x80;

2sfr P1 = 0x90; 3sfr P2 = 0xA0; 4sfr P3 = 0xB0; 5sfr PSW = 0xD0;程序状态字 6sfr ACC = 0xE0;累加器 7sfr B = 0xF0;B寄存器 8sfr SP = 0x81; 堆栈指针 9sfr DPL = 0x82;DPTR数据指针 10sfr DPH = 0x83; 11sfr PCON = 0x87;电源控制寄存器 12sfr TCON = 0x88;定时/计数控制寄存器 13sfr TMOD = 0x89; 定时/计数工作方式状态寄存器 14sfr TL0 = 0x8A; 15sfr TL1 = 0x8B; 16sfr TH0 = 0x8C; 17sfr TH1 = 0x8D; 18sfr IE = 0xA8;中断允许控制寄存器 18sfr IP = 0xB8;中断优先级控制寄存器 20sfr SCON = 0x98;串行口控制寄存器 21sfr SBUF = 0x99;串行口数据缓冲器

51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/ba15205198.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值1,对外输出高电平 LED=0; //将P1.0口赋值0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/ba15205198.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.doczj.com/doc/ba15205198.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

51单片机的制作

51单片机的制作 学院:物电学院班级:1305 学号:2013112030526 姓名:曹杉 一:原理图的设计和PCB板的排版连线 这个PCB板的原理图分为好几块,元器件多只要细心就没问题,元件的封装像数码管单片机都是自己画的,最难的是连线排版,太多太复杂最后还是按老师的排版来画的,板子画好检查没问题发出去做的时候很有成就感也很忐忑

二:PCB板的原始成品 拿到的原始的板子 三:PCB板的焊接 从最小的元器件开始焊,贴片的电阻还有二极管很小,第一部分焊的这个,不熟练焊了好久,还要注意正负极,电阻电容等都是插件很好焊 贴片电阻和贴片二极管电阻 每焊完一部分元器件就要用万用表检查是否短路或能否正常发光,万用表的使用也很重要

开关和电容单片机和数码管 焊排针的时候有好多问题,方法不对针自己都掉了,最后在同学的帮助下,焊失败的排针也弄好了,也学会了怎么处理堵住的焊盘 完整的PCB板正面反面 花了很多时间焊板子,第一次没经验,电烙铁也不是很会用,所以板子很丑,不过成功焊完还是成就感爆棚

四:PCB板的调试 焊完就要尝试运行了,利用电脑下载线还有软件把程序烧进单片机,按照自己编的程序看二极管或者数码管是否按程序运行 二极管全亮数码管显示 总结 1.连线的时候要注意线宽和安全距离,电源线要加粗,焊盘也要注意大小 2.元器件的封装一定要按照实物,排版连线之后要打印出来用实物比量 3.单片机等焊盘多的元件插进板子的时候要小心,不要弄断脚 4.利用电烙铁的高温,焊锡贴近焊盘一点就能焊上去,不要太多 5.电容二极管等有极性的一定要注意正负极 感想:从开始画图到完成一整块板子,前后花了几十个小时,感触挺多收获也很多,仿真软件上最初的设计要思考怎么设计才最合理最省钱同时也最好用,焊板子考验的是认真细心和耐心,不熟练焊了一会就能慢慢体会到精髓,一次没有成功也不灰心,跑实验室问同学把板子调通,第一次拿到自己做的可以用的实物,第一次用电烙铁,觉得比平时在教室上课学的东西更有用自己也更有兴趣,这只是个开始,希望以后随着我们书本知识的增加动手能力的加强能做出更实用的作品

单片机实例下载大全

单片机资料下载,省去找资料的麻烦 ,只供学习参考用,下载24内删掉,祝大家学习进步 单片机点阵学习资料 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1703&extra=page%3D1 手把手教你学单片机--教程视频 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1688&extra=page%3D1 力天把手教你学单片机视频教程 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=forumdisplay&fid=110&page=1 谱中单片机开发板例程 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1683&extra=page%3D1 初学单片机的30多个小实验,硬件简单,对初学者有帮助 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1962&extra=page%3D1 用单片机制作的MP3 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1701&extra=page%3D1 51单片机应用开发大全所含100个范例代码及电路图 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1820 学林电子最新图文教程【含28个单片机实例流程图】 https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1959&extra=page%3D1 谱中单片机程序烧录工具STC https://www.doczj.com/doc/ba15205198.html,/forum.php?mod=viewthread&tid=1682&extra=page%3D1 吉林大学《单片机技术》32讲

单片机简单应用系统制作

个人:单片机简单应用系统制作 1功能:单片机硬件和软件设计、制作和调试,实现单片机简单输出输入。 2电路原理图:

3源程序: #include //包含89S52单片机的头文件 #define uchar unsigned char //定义宏uchar为unsigned char

类型 #define uint unsigned int //定义宏uint为unsigned int类型sbit P1_0=P1^0; //位定义,定义变量P1_1为P1.0位uchar k; //利用宏uchar定义变量k为unsigned char 类型 uchar n=1; //利用宏uchar定义变量n,且赋值为1 void DelayMS(uint ms) //延时函数 { uchar i; while(ms--) for(i=0;i<120;i++); } //键扫描函数,利用宏uchar定义而不用void,表示该函数有返回值uchar Key_Scan( ) { P0=0xFF; //使用P0作为输入口检测按键状态,需先送高电平k=P0; //读入P0口的按键状态,送入变量k中 if(k!= 0xFF) //如果k不等于0xFF,表示有按键按下 { DelayMS(10); //延时10ms,作用是按键去抖动 if (k!=P0) k=0xFF; while(P0!=0xFF); //如果k不等于P0,则k=0xFF }

return(k); //函数返回值为k值,调用本函数,则会返回k 值 } void main( ) //主函数 { P1=0x00; //初始化P1口,输出0x00,所有继电器断开while(1) { Key_Scan(); //调用Key_Scan函数,扫描键盘 PD: switch(k) //开关语句,判断k值,此处设置标号PD { case 0xFE: P1=P1&0x01; P1_0=~P1_0; P3=0x06; break; case 0xFD: P1=n; //若k=0xFD,表示按下S2 n<<=1; if(n==0) n=1; P3=0x5B; break; case 0xFB: while(1) //若k=0xFB,表示按下S3

单片机应用小制作

《单片机原理及应用》设计与应用 项目名称设计与制作 二、电路设计

C1C16 C2C3C4C5C6C7C8C9C10C11C12C13C14C15R16 R9R10R11R12R13R14R15R1R8 R2R3R4R5R6R7c16c9 c8c1r1r8r1r8c8c1c16c9r9r16r9r16r2r3r4r5r6r7c7c6c5c4c3c2c15c14c13c12c11c10c7c6c5c4c3c2c15c14c13c12c11c10r10r11r14r10r11r12r13r14r15r12r13r15r2r3r4r5r6r7X1 CRYSTAL C1 30pF C2 30pF R3 10k C3 22uF XTAL2 18 XTAL1 19ALE 30EA 31 PSEN 29RST 9 P0.0/AD0 39P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78 P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD 17 P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1 AT89C51 A 23 B 22 C 21 D 20E118E2 19 011223344556677889910101111131214131514161517 U3 74HC154 23456789 1 RP1 8x10k A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B7 11 CE 19AB/BA 1 U4 74HC245 A02B018A13B117A24B216A35B315A46B414A57B513A68B612A79B7 11 CE 19AB/BA 1 U2 74HC245

单片机内部AD的用法

STC系列单片机内部AD的应用 作者:郭天祥来源:原创更新时间:2008-11-27 22:16:38 浏览次数:11438 STC89LE52AD、54AD、58AD、516AD这几款89系列的STC单片机内部自带有8路8位的AD转换器,分布在P1口的8位上,当时钟在40MHz以下时,每17个机器周期可完成一次AD转换。 与AD相关的几个寄存器如表1所示。 表1 STC89系列单片机AD相关寄存器 P1_ADC_EN:P1.X口的AD使能寄存器。 相应位设置为“1”时,对应的P1. X口作为AD转换使用,内部上拉电阻自动断开。 ADC_CONTR:AD 转换控制寄存器。 ADC_START:AD转换启动控制位,设置为“1”时,AD开始转换。 ADC_FLAG:AD转换结束标志位,当AD转换完成后,ADC_FLAG=1。 CHS2、CHS1、CHS0:为模拟输入通道选择,如表2所示。 表2 STC89系列单片机AD模拟通道选择设置

ADC_DATA:AD 转换结果寄存器。模拟/数字转换结果计算公式如下: 结果=256×Vin / Vcc Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。 下面一个例程演示STC89LE516AD/X2系列单片机的A/D转换功能。时钟11.0592MHz,转换结果以16进制形式输出到串行口,可以用串行口调试程序观察输出结果。(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。 新建文件part3.4.5.c,程序代码如下: #include #include // 定义与ADC 有关的特殊功能寄存器 sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器 sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器 sfr ADC_DATA = 0xC6; //A/D转换结果寄存器 typedef unsigned char INT8U; typedef unsigned int INT16U; void delay(INT8U delay_time) // 延时函数 { INT8U n; INT16U m; for (n=0;n

单片机内部资源分配

2.3 单片机内部资源分配 2.3.1 MCS-51存储器空间 MCS-51单片机在物理结构上有四个存储空间: 片内程序存储器(ROM) 片外程序存储器(外扩) 片内数据存储器(RAM) 片外数据存储器(外扩) 但在逻辑上,即从用户的角度上(地址分配),8051单片机有三个存储编址空间,即:片内程序存储器、片外程序存储器统一编址的64KB(26*210=65536个单元)的程序存储器地址空间(C:)、256B(8位地址)的片内数据存储器的地址空间(D:)以及64KB(216)片外数据存储器的地址空间(X:)。在访问三个不同的逻辑空间时,应采用不同形式的指令(具体我们在后面的指令系统学习时将会讲解),以产生不同的存储器空间的选通信号。 在MCS-51单片机的芯片内部,主要有RAM和ROM两类存储器,即所谓的片内RAM和片内ROM。 1、片内数据存储器区(RAM) 8051的内部RAM共有256个单元,通常把这256(28)个单元按其功能划分为两部分:低128(0~127)单元(单元地址为00H~7FH)和高128(128~255)单元(单元地址为80H~FFH)。表2.2所示为低128字节单元的配置情况。 低128单元是单片机的真正RAM存储器,按用途划分为工作寄存器区、位寻址区和用户RAM区三个区域。

表2.2 低128字节单元的配置 30~7FH 数据缓冲区 20~2FH 位寻址区(00~7FH) 18~1FH 工作寄存器组3(R0~R7) 10~17H 工作寄存器组2(R0~R7) 08~0FH 工作寄存器组1(R0~R7) 00~07H 工作寄存器组0(R0~R7) (1)工作寄存器区 8051共有4组工作寄存器,每组8个寄存单元,各组都以R0~R7作寄存单元名称。工作寄存器常用于存放操作数中间结果等。由于它们的功能及使用不作预先规定,因此称之为工作寄存器,有时也叫通用寄存器。4组工作寄存器占据内部RAM的00H~1FH共32个单元地址。 在任何时刻,CPU只能使用其中的一组工作寄存器,并且把正在使用的那组寄存器称之为当前寄存器组。到底是哪一组,由程序状态字寄存器PSW中RS1(D4)、RS0(D3)位的状态组合来决定。 (2)位寻址区(只有位寻址区的位可单独访问,其余的单元均只能按字节为单位访问) 内部RAM的20H~2FH单元,既可作为一般RAM字节单元使用,也可以对单元中每一位进行位操作,因此把该区称之为位寻址区。位寻址区共有16个RAM单元,计128位,每一位都有独立的位地址,其范围为00H~7FH。MCS-51具有布尔处理机功能,这个位寻址区可以构成布尔处理机的存储空间。这种位寻址能力是MCS-51的一个重要特点。表2.3为位寻址区的位地址。

相关主题
文本预览
相关文档 最新文档