单片机的结构原理解析 一、单片机的外部结构拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为 89C51 的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是 5V 电源,其中正极接40 引脚,负极(地)接20 引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19 脚。只要买来晶振,电容,连上就可以了,按图1 接上即可。3、复位引脚:按图 1 中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA 引脚:(2051 没有 )EA 引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。我们的第一个任务是要用单片机点亮一只发光二极管 LED,按照这个图的接法,当1 脚是高电平时,LED 不亮,只有1 脚是低电平时,LED 才发亮。因此要1 脚我们要能够控制,也就是说,我们要能够让1 引脚按要求变为高或低电平。即然我们要控制1 脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51 芯片的INTEL 公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。在 2051 中叫P1_0,取决于包含的*.h 文件,可以到at892051.h 或 reg51.h 中看一看。
上传时间: 2013-10-29
上传用户:段璇琮*
这一颗,我们学习如何让跑马灯自动按照我们预定的顺序进行。这种控制在工控场合经常用到。这个程序里,我们预先定义了一个变化的顺序speedcode,每跑一圈灯就根据预定设置的表格数据来决定下一圈的跑马速度。这样我们就实现了按照预定的顺序自动变化运行。请看代码:-----------------------------------#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件sbit P10 = P1^0; //头文件中没有定义的IO 就要自己来定义了sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;bit ldelay=0; //长定时溢出标记,预置是0uchar speed=10; //设置一个变量保存跑马灯的移动速度uchar code speedcode[10]={3,1,5,12,3,20,2,10,1,4}; //10 个预定义的速度char code dx516[3] _at_ 0x003b;//这是为了仿真设置的//可编程自动控制跑马灯void main(void) // 主程序{uchar code ledp[4]={0xfe,0xfd,0xfb,0xf7};//预定的写入P1 的值uchar ledi; //用来指示显示顺序uchar i;RCAP2H =0x10; //赋T2 的预置值0x1000,溢出30 次就是1 秒钟RCAP2L =0x00;TR2=1; //启动定时器ET2=1; //打开定时器2 中断EA=1; //打开总中断
上传时间: 2013-11-20
上传用户:ming529
基于单片机的红外门进控制系统设计与制作:我们所做的创新实验项目“基于单片机的红外门控系统”已基本完成,现将其工作原理简要说明。该系统主要分为两大部分:一是红外传感器部分。二是单片机计数显示控制部分。基本电路图如下:其中红外传感器部分我们采用红外对管实现,红外对管平行放置,平常处于接收状态,经比较器输出低电平,当有人经过时,红外线被挡住,接收管接收不到红外线,经比较器输出高电平。这样,当有人经过时便会产生一个电平的跳变。单片机控制部分主要是通过外部两个中断判断是否有人经过,如果有人经过,由于电平跳变的产生,进入中断服务程序,这里我们采用了两对红外传感器接到两个外部中断口,中断0作为入口,实现加1操作,中断1作为出口,实现减1操作。另外,我们通过P0口控制室内灯的亮暗,当寄存器计数值为0时,熄灯,不为0时,灯亮。显示部分,采用两位数码管动态显示,如有必要,可以很方便的扩展为四位计数。精益求精!在实验过程中,我们走了非常多的弯路,做出来的东西根本不是自己想要的,我们本想做成室内只有一个门的进出计数,原理已清楚,即在门的两边放置两对红外对管,进出时,挡住两对对管的顺序不同,因此,可判断是进入还是出去,从而实现加减计数,编程时,可分别在两个中断服务程序的入口置标志位,根据标志位判断进出,详细内容在程序部分。理论如此,但在实际过程中,还是发现实现不了上述功能,我们初步判定认为是程序掌握得不够好,相信随着自己对单片机了解的深入,应该会做出更好的 (因为我们是临时学的单片机),程序的具体内容如下: $MOD52 ORG 0000H LJMP MAIN ORG 0003H LJMP 0100H ORG 0013H LJMP 0150H ORG 0050HMAIN: CLR A MOV 30H , A ;初始化缓存区 MOV 31H , A MOV 32H , A MOV 33H , A MOV R6 , A MOV R7 , A SETB EA SETB EX0 SETB EX1 SETB IT0 SETB IT1 SETB PX1NEXT1: ACALL HEXTOBCDD ;调用数制转换子程序 ACALL DISPLAY ;调用显示子程序 LJMP NEXT1 ORG 0100H ;中断0服务程序 LCALL DELY mov 70h,#2 djnz 70h,next JBC F0,NEXT SETB F0 CLR P0.0 LCALL DELY0 SETB P0.0 MOV A , R7 ADD A , #1 MOV R7, A MOV A , R6 ADDC A , #0 MOV R6 , A CJNE R6 , #07H , NEXT CLR A MOV R6 , A MOV R7 , ANEXT: RETI ORG 0150H ;中断1服务程序 LCALL DELY mov 70h,#2 djnz 70h,next2 JBC F0,NEXT2 SETB F0 CLR P0.0 LCALL DELY0 SETB P0.0 CLR C MOV A , R7 SUBB A , #1 MOV R7, A MOV A , R6 SUBB A , #0 MOV R6 , A CJNE R6 , #07H , NEXT2 CLR A MOV R6 , A MOV R7 , ANEXT2: RETI ORG 0200HHEXTOBCDD:MOV A , R6 ;由十六进制转化为十进制 PUSH ACC MOV A , R7 PUSH ACC MOV A , R2 PUSH ACC CLR A MOV R3 , A MOV R4 , A MOV R5 , A MOV R2 , #10HHB3: MOV A , R7 ;将十六进制中最高位移入进位位中 RLC A MOV R7 , A MOV A , R6 RLC A MOV R6 , A MOV A , R5 ;每位数加上本身相当于将这个数乘以2 ADDC A , R5 DA A MOV R5 , A MOV A , R4 ADDC A , R4 DA A ;十进制调整 MOV R4 , A MOV A , R3 ADDC A , R3 DJNZ R2 , HB3 POP ACC MOV R2 , A POP ACC MOV R7 , A POP ACC MOV R6 , A RET ORG 0250HDISPLAY: MOV R0 , #30H MOV A , R5 ANL A , #0FH MOV @R0 , A MOV A , R5 SWAP A ANL A , #0FH INC R0 MOV @R0 , A MOV A , R4 ANL A , #0FH INC R0 MOV @R0 , A MOV A , R4 SWAP A ANL A , #0FH INC R0 MOV @R0 , A MOV R0 , #30H MOV R2 , #11111110BAGAIN: MOV A , R2 MOV P2 , A MOV A , @R0 MOV DPTR , #TAB MOVC A , @A+DPTR MOV P1 , A ACALL DELAY INC R0 MOV A , R2 RL A MOV R2 , A JB ACC.4 , AGAIN RETTAB: DB 03FH , 06H , 5BH , 4FH , 66H , 6DH , 7DH , 07H , 7FH , 6FH ;七段码表DELY: MOV R1,#80D1: MOV R2,#100 DJNZ R2,$ DJNZ R1,D1 RET DELAY: MOV TMOD , #01H ;延时子程序 MOV TL0 , #0FEH MOV TH0 , #0FEH SETB TR0WAIT: JNB TF0 , WAIT CLR TF0 CLR TR0 RETDELY0: MOV R1, #200D3: MOV R2,#250 DJNZ R2,$ DJNZ R1,D3 RET END 该系统实际应用广泛。可用在生产线上产品数量统计、公交车智能计数问候(需添加语音芯片)、超市内人数统计等公共场合。另外,添加串口通信部分便可实现与PC数据交换的功能。 由于,实验简化了,剩下不少零件和资金,所以我们又做了两项其他的实验。
上传时间: 2013-12-22
上传用户:tangsiyun
T2作为波特率控制UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。UART_TXD 是任何其它IO即可。UART_SEND: PUSH IE PUSH DPH PUSH DPL PUSH PSW PUSH 00H PUSH ACC CLR EA SETB UART_TXD ;START BIT MOV R0,A CLR TR2 ;TR2置1,计数器2启动,时间计数启动。 MOV A,RCAP2L;计数器2重新装载值 MOV TL2,A ;置计数器2初值 ;T2需要重新装载 MOV A,DPH MOV A,RCAP2H MOV TH2,A MOV A,R0 SETB TR2 ;TR2置1,计数器 JNB TF2,$ CLR TF2 JNB TF2,$ CLR TF2
上传时间: 2014-01-12
上传用户:二十八号
单片机基础知识单片机的外部结构:1、 DIP40双列直插;2、 P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、 电源VCC(PIN40)和地线GND(PIN20);4、 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5、 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、 P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1、 四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、 一个串行通信接口;(SCON,SBUF)4、 一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。 C语言编程基础:1、 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。2、 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。3、 ++var表示对变量var先增一;var—表示对变量后减一。4、 x |= 0x0f;表示为 x = x | 0x0f;5、 TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。6、 While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}第一章 单片机最小应用系统:单片机最小系统的硬件原理接线图:1、 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF2、 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF3、 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理4、 接配置:EA(PIN31)。说明原因。第二章 基本I/O口的应用第三章 显示驱动第七章 串行接口应用
标签: 单片机
上传时间: 2013-10-30
上传用户:athjac
/* 4位8段数码管分别动态显示“1234”, */ #include "7LEDShow.h" void main() { DIGPORT = 0; // 关闭显示 TMOD = 0x01; // T0工作方式1 /* 2ms 定时设置 */ time0_tmp = 65536-time0*fosc/12; TH0 = (time0_tmp/256); TL0 = (time0_tmp%256); TR0 = 1; ET0 = 1; EA = 1; digbit = 0x01; // 从第一位数码管开始
上传时间: 2013-12-12
上传用户:kachleen
1 /**————————————————————2 〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)3 包括100Khz(T=10us)的标准模式(慢速模式)选择,4 和400Khz(T=2.5us)的快速模式选择,5 默认11.0592Mhz的晶振。6 〖文件〗PCF8563T.C ﹫2001/11/2 77 〖作者〗龙啸九天 c51@yeah.net http://www.c51bbs.co /8 〖修改〗修改建议请到论坛公布 http://www.c51bbs.co m9 〖版本〗V1.00A Build 080310 —————————————————————*/1112 #ifndef SDA13 #define SDA P0_014 #define SCL P0_115 #endif1617 extern uchar SystemError;1819 #define uchar unsigned char20 #define uint unsigned int21 #define Byte unsigned char22 #define Word unsigned int23 #define bool bit24 #define true 125 #define false 02627 #define SomeNOP(); _nop_();_nop_();_nop_();_nop_();2829 /**--------------------------------------------------------------------------------30 调用方式:void I2CStart(void) ﹫2001/07/0 431 函数说明:私有函数,I2C专用32 ---------------------------------------------------------------------------------*/33 void I2CStart(void)34 {35 EA=0;36 SDA=1; SCL=1; SomeNOP();//INI37 SDA=0; SomeNOP(); //START38 SCL=0;39 }4041 /**--------------------------------------------------------------------------------42 调用方式:void I2CStop(void) ﹫2001/07/0 443 函数说明:私有函数,I2C专用44 ---------------------------------------------------------------------------------*/45 void I2CStop(void)46 {47 SCL=0; SDA=0; SomeNOP(); //INI48 SCL=1; SomeNOP(); SDA=1; //STOP49 EA=1;50 }5152 /**--------------------------------------------------------------------------------53 调用方式:bit I2CAck(void) ﹫2001/07/0 454 函数说明:私有函数,I2C专用,等待从器件接收方的应答55 ---------------------------------------------------------------------------------*/56 bool WaitAck(void)57 {58 uchar errtime=255;//因故障接收方无ACK,超时值为255。59 SDA=1;SomeNOP();60 SCL=1;SomeNOP();61 while(SDA) {errtime--; if (!errtime) {I2CStop();SystemError=0x11;return false;}}62 SCL=0;63 return true;
上传时间: 2014-04-11
上传用户:xg262122
//------------------------------------------------------------------------------------//此程序为ADC转换程序,可以选择向ADC0BUSY写1或用定时器0,1,2,3作为ADC的启动信号。////------------------------------------------------------------------------------------//头文件定义//------------------------------------------------------------------------------------//#include <c8051f330.h> #include <stdio.h> //-----------------------------------------------------------------------------// 定义16位特殊功能寄存器//----------------------------------------------------------------------------- sfr16 ADC0 = 0xbd; sfr16 TMR0RL = 0xca; sfr16 TMR1RL = 0xca; sfr16 TMR2RL =0xca; sfr16 TMR3RL =0xca; sfr16 TMR0 = 0xCC; sfr16 TMR1 = 0xCC; sfr16 TMR2 = 0xcc; sfr16 TMR3 = 0xcc; //-----------------------------------------------------------------------------// 全局变量定义//-----------------------------------------------------------------------------char i;int result; //-----------------------------------------------------------------------------//定义常量//-----------------------------------------------------------------------------#define SYSCLK 49000000 #define SAMPLE_RATE 50000 //------------------------------------------------------------------------------------// 定义函数//------------------------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init (void);void Timer0_Init (int counts);void Timer1_Init (int counts);void Timer2_Init (int counts);void Timer3_Init (int counts);void ADC0_Init(void);void ADC0_ISR (void);void ADC0_CNVS_ADC0h(void);//------------------------------------------------------------------------------------// 主程序//------------------------------------------------------------------------------------ void main (void) { int ADCRESULT[50] ; int k; PCA0MD &= ~0x40; // 禁止看门狗 SYSCLK_Init (); PORT_Init (); Timer0_Init (SYSCLK/SAMPLE_RATE); //Timer1_Init (SYSCLK/SAMPLE_RATE); //选择相应的启动方式 //Timer2_Init (SYSCLK/SAMPLE_RATE); //Timer3_Init (SYSCLK/SAMPLE_RATE); ADC0_Init(); EA=1; while(1) { //ADC0_CNVS_ADC0h(); k=ADC0; ADCRESULT[i]=result; //此处设断点,观察ADCRESULT的结果 } }
上传时间: 2013-10-13
上传用户:SimonQQ
创新、效能、卓越是ADI公司的文化支柱。作为业界公认的全球领先数据转换和信号调理技术领先者,我们除了提供成千上万种产品以外,还开发了全面的设计工具,以便客户在整个设计阶段都能轻松快捷地评估电路。
上传时间: 2013-11-25
上传用户:kachleen
温湿度传感器 sht11 仿真程序 sbit out =P3^0; //加热口 //sbit input =P1^1;//检测口 //sbit speek =P2^0;//报警 sbit clo =P3^7;//时钟 sbit ST =P3^5;//开始 sbit EOC =P3^6;//成功信号 sbit gwei =P3^4;//个位 sbit swei =P3^3;//十位 sbit bwei =P3^2;//百位 sbit qwei =P3^1;//千位 sbit speak =P0^0;//报警音 sbit bjled =P0^1;//报警灯 sbit zcled =P0^2;//正常LED int count; uchar xianzhi;//取转换结果 uchar seth;//高时间 uchar setl;//低时间 uchar seth_mi;//高时间 uchar setl_mi;//低时间 bit hlbz;//高低标志 bit clbz; bit spbz; ///定时中断程序/// void t0 (void) interrupt 1 using 0 { TH0=(65536-200)/256;//5ms*200=1000ms=1s TL0=(65536-200)%256; clo=!clo;//产生时钟 if(count>5000) { if(hlbz) { if(seth_mi==0){seth_mi=seth;hlbz=0;out=0;} else seth_mi--; } if(!hlbz) { if(setl_mi==0){setl_mi=setl;hlbz=1;out=1;} else setl_mi--; } count=0; } else count++; } ///////////// ///////延时/////// delay(int i) { while(--i); } ///////显示处理/////// xianshi() { int abcd=0; int i; for (i=0;i<5;i++) { abcd=xianzhi; gwei=1; swei=1; bwei=1; qwei=1; P1=dispcode[abcd/1000]; qwei=0; delay(70); qwei=1; abcd=abcd%1000; P1=dispcode[abcd/100]; bwei=0; delay(70); bwei=1; abcd=abcd%100; P1=dispcode[abcd/10]; swei=0; delay(70); swei=1; abcd=abcd%10; P1=dispcode[abcd]; gwei=0; delay(70); gwei=1; } } doing() { if(xianzhi>100) {bjled=0;speak=1;zcled=1;} else {bjled=1;speak=0;zcled=0;} } void main(void) { seth=60;//h60秒 setl=90;//l90秒 seth_mi=60;//h60秒 setl_mi=90;//l90秒 TMOD=0X01;//定时0 16位工作模式 TH0=(65536-200)/256; TL0=(65536-200)%256; TR0=1; //开始计时 ET0=1; //开定时0中断 EA=1; //开全中断 while(1) { ST=0; _nop_(); ST=1; _nop_(); ST=0; // EOC=0; xianshi(); while(!EOC) { xianshi(); } xianzhi=P2; xianshi(); doing(); } }
上传时间: 2013-11-07
上传用户:我们的船长