学习c51单片机笔记本总结_第1页
学习c51单片机笔记本总结_第2页
学习c51单片机笔记本总结_第3页
学习c51单片机笔记本总结_第4页
学习c51单片机笔记本总结_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

标号引脚第二功能说明P3.010RXD P3.111TXD P3.212INT0 外部中断0P3.313 P3.414 P3.515 P3.616 外部数据器写脉冲(当外部扩展随机读写器RAMRAMWEP3.717 外部数据读脉冲(当外部扩展随机读写器RAMRAMOEXTAL1、XTAL2外接时钟引脚,XTAL1XTAL28051部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。外部RAM时,两个PSEN脉冲被跳过不会输出ROMROMOE脚相接所加的电平转换是MAX232(实验板左下角)。STC89C51RC40IPLCC型号为PLCC,制造工艺为RB8946.1D功能的Flash器,即具有ISP可编程功能 1-----表示内部程序空间的大小,1为4KB,2为8KB,3为12KB,即该数乘上4KB就是内部的程序空间大小。程序空间大小决定了一个所能装入执行代码的多少。一般来说,程序空间越大,价格也越高,所以我们在选择时要根据自己硬件设备实现功能所需代码的大小来选择价格合适的,只要程序能装得下,同类的不同M表示产品,温度范围为-55℃~+150℃。 STICLeadedChipCarrier)带引线的塑料封装QFP(QuadFlatPackage)塑料方型扁平式封装PFP(sticFlatPackage)塑料扁平组件式封装PGA(PinGridArrayPackage)ZIF(ZeroInsertionsocket)是指零插拔力的插座。BGA(BallGridArrayPackage)球栅阵列封装PBGA(sricBGA)多层板CBGA(CeramicBGA)陶瓷基板TBGA(TapeBGA)1-2PCB(CarityDownPBGA)基板。指封装有方型低陷的区0819 (一般在十六进制数的最后面加上后缀H,表示为十六进制数,如AH,DEH等。这里的字母不区分大小写,在C语言编程时要写成“0xa,0xde”,在数的最前面加上“0x”表示该数为十六进制数。0008811A33B44C55D66E77F 器中最小的单位。比位大的单位是字节(B)81B=8b“/”用在整数除法中时,10/3=3,求模运算也是在整数中,如10对3求模即10当中含有多少个整数的3,即3个。当进行“%”求余运算,也是在整数中,如10%3=1,即10当中含有整数倍的3取掉后剩下的数即为所求余数。 含 “︱ “》 “《 如果用C语言编写程序,则扩展名必须为.c;如果用汇编语言编写程序,则扩展名必须为 意义:把单片机内部地址0x80处的这个寄存器重新起名叫P0意义:C51中常用的头文件:reg51.h,reg52.h,math.h,stdio.h,ctype.h,stdlib.h,absacc.h,intrins.h,reg52.h头文件的作用:在使用〈〉包含头文件时,编译器先进入到软件安装文件夹处开始搜索这个头文件,也就是Keil\C51\INC#include sbit //单片机P1口的第一void { }件,英文全称为binary,这两种文件可以通过软件相互转换,其实际内容都是一样的。锁存器74HC573引脚DQLHHHLHLLLLXHXXZOE(OUT 1Q- LE(LATCH void {} 低电平;0,2,4,6,8对应的二进制是高电平1,二进制从右往左数 在C语言中我们一般把“0”认为是“假”,“非0”认为是“真”,也就是说,只要不是0就是真,所以1,2,3等没有,那么我们就可以直接将大括号也不写,再如“while(1while()会把跟在它后程序时,如果while()内部只有一条语句,我们就可以省去大括号,而直接将这条语句跟在它的后面。程序指针就要加1,程序指针就指向下一条要执行的指令。 voidmain() { }88-)-)unsigned) long 知识点:for语句unsignedchar 03i1,我们分析执行过程:不用写出来),因为for内部语句为空,即什么也不执行。unsignedchari, #defineuintunsigned sbit uint void { { }}格式:#define新名称原内容“unsignedinti,j;”,取而代之的是“uinti,j;”,方便以后在程序中直接写简短的新名称,而不必每次都写烦琐的由12个时钟周期(6个状态周期)组成。点,然后在下面“led1=1;”所在行以同样方式插入另一个断点,这两个断点之间的代码就是这个两级for嵌套语句。型不同,单片机运行时所需时间就不同),内层for语句中变量恒定值为110时,外层for中变量为多少,这个for嵌套前子函数,方法如下:将返回值特性、函数名及后面的小括号完全,若是无参数函数,则小括号内为空;若括号的后面必须加上分号“;”。当子函数写在主函数前面时,不需要,因为写函数体的同时就已经相当于了函数本身。通俗地讲,子函数的目的是为了编译器在编译主程序的时候,当它遇到一个子函数时知道有这样一个子函数 #defineuintunsigned sbit void void { { }}void {uinti, }延时以亮200ms灭800ms的方式闪动,完整程序代码如下:(带参数函数的写法) //52系列单片机头文件#defineuintunsignedint sbit void void { { }}void {uinti, }:中原来的数据丢弃,(在一行二进制里,如:,左边一端为最0,右边一端为最低位1)最低位补0,其他位循环左移:最(在一行二进制里,如:11101010,左边一端为最1,右边一端为最低位0)移入最低位,其他循环右移:最低位移入最(在一行二进制里,如:01011110,左边一端为最0,右边一端为最低位0),其他 #defineucharunsigned uchar void { { }} //52系列单片机头文件 #defineuintunsignedint #defineucharunsigned void uchar void { { 500 }}voiddelayms(uint{uinti,j; //指定i,j为无符号整型 }aaaaaa0xfe,二进制为,执行此函数时,它将循环左移一位后为0xfd,0xfdaawhile(1)中的最后一条语句执行完后,将返while(1aa0xfd 法),则该位为1,否则为0。 AC为1,否则为0。P-----ACCACC1(如B1),P1。unsignedcharcodetable[]={编码定义方法与C语言中的数组定义方法非常相似,不同的地方就是在数组类型后面多了一个code关键字,codeunsignedchartable引脚和公共端(位选)各需要1个74HC573锁存器,所以总共需要的元件有:6个数码管LED1-LED6,1个STC89C52单片机,274HC573锁存器U1、U2,110KΩ(P0口提供上拉电阻)P1。8(公共端)。在操1P00xFE111111108,那么只在h sbit sbit void { //打开U2 //关闭U2 //打开U1 //关闭U1 }60F0.5s,循环下去。程序代码如下:(uchar循环用;uint #defineucharunsignedchar #defineuintunsignedintsbit sbit ucharnum; ucarcodetable[]={ void { { { //打开U1 //关闭U1 }}}voiddelayms(uint {uint }6,0.5s,关闭它后再来显示第一个数码管,一直循环下去。程序代码: #defineucharunsignedchar #defineuintunsignedintsbi sbi ucharcode void void{ { //原来段选数据通过位选锁存器造成(U2锁存端) //送位选数据,二进制11111110 }}voiddelayms(uint{uinti,j;}处理(中断发生);CPU停止当前的工作(中断响应|),转去处理B(中断服务A,处理服务B);待CPU将B处理完毕后,再回到原来A被中断的地方继续处理A(中断返回),这一过程称为中断。526(CPU):INT0外部中断0,P3.2端口线引入,低电平或下降沿引起。INT11,由P3.3T11T1T22T2中断 012345知识点:中断允许寄存器中断允许寄存器用来设定各个中断源的打开和关闭,IEA8H,位地址(由低位到中断允许寄存器- 位地址AFH--ADHACHABHAAHA9H 优先级寄存器IP(InterruptPriority)中断优先级寄存器在特殊功能寄存器中,字节地址为B8H,位地址(由低位到)分别是B8H~BFH,机复位时IP全部被清0,各位定义见表:中断优先级寄存器-----_ 工作方式和功能;TCONT11/12)NTcyt。来确定定时器的工作方式及功能选择。单片机复位时TMOD全部被清0。其各位的定义如下表:位序号D7D6D5D4D3D2D1位符号GATEC/TM1M0GATEC/TM1 就需要用软件清0。0

TF00TF1。IE11请求标志。IT11IE00IE1void()interrupt中断号using工作组{}如:voidT1_time()interrupt { }工作寄存器中的哪一组,C51012345void #defineucharunsignedchar #defineuintunsignedint sbitled1=P1^0; //LED1对就的单片机P1口的第1位ucharnum; //一个num函数变量void{ //设置定时器0为工作方式1(M1M0为01,即M1M0--工作方式选择位) /*求余,装初值11.0529M晶振定时50ms数为45872*/ }voidT0_time()interrupt {TH0(65536- /*重装初值,求模(65536-45872)/256=76,装入 /*求余=76*256-(65536-45872)=208,装入TL0;TL0在机器周期的作用下开始加1计数, /*num每加1次判断一次是否到20次(20次*50ms=1000ms=1s) {}}

CPU申请中断。因此,溢出一次共需要65536us,约等于65.5ms.(也就是说,中断一次需要65536us)设置为定时器模式时,加1计数器是对内部周期计数(1个机器周期等于12个振荡周期,即计数器频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t。(由溢出时计数器的值减去计数初值才是加1计数器; //单片机52系列头文件#defineucharunsignedchar #defineuintunsignedint sbit sbit sbitled1=P1^0; //定义LED1在P1口的第1位ucharcodetable[]={ voiddelayms(uint); voiddisy(uchar,uchar); ucharnum,num1,num2,bai,shi,ge;void{ //设置01为工作1(00010001)TH0=(65536-45872)/256;*求模;50ms0(19664=4CD0H)*/TL0=(65536-45872)%256;/*求余;4CH=76装入TH0,D0H=208TL0*/TH1=(65536-45872)/256;/*求模;50ms1(19664=4CD0H)*/TL1=(65536-45872)%256;/*求余;4CH=76TH1,D0H=208TL1*/ {disy(bai,shi,ge);/*数码管的百位数、十位数、个位数循环}}voiddisy(ucharbai,ucharshi,uchar { //延时100ms //延时100ms }voiddelayms(uint {uint }voidT0_time()interrupt { { }}voidT1_time()interrupt { { //百位和十位,求余运算,求出num中除去整数倍100的后余数 }}单片机的输入控制用小弹性按键较好,单片机检测按键的原理是:单片机的I/O口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能;我们把按键的一端接地,另一端与单片机的某个I/O口相连,开始时I/O动每秒加1,再次按下key4键,数值停止自动加1,保持显示原数。 #defineucharunsignedchar #defineuintunsignedint sbit sbit sbit sbit sbit sbitwela=P2^7; //位选端在P2口的第7位ucharcodetabl[]={ voiddelayms(uint); ucharnumt0,num; voidisy(uchar {uchar }voiddelayms(uint {uinti,j; //延时xms}void { //设置0为工1(00000001)TH0=(65536-45872)/256;//求模,19664=4CD0H,76=4CH装入TH0TL0=(65536-45872)%256//求余,D0H=208装入TL0中 }void { { { }} { //去抖动延时20ms { //num自减1 }} { //去抖动延时20ms { }} { { }}}void { {}}voidT0_time()interrupt {{}} #defineucharunsignedchar #defineuintunsignedint sbit sbitwela=P2^7; ucharcodetabl[]={ voiddelayms(uint {uint //定义延时变量i }voiddisy(uchar { }void {uchartemp //P3口当前状态值赋给临时变量temp,用于后面计算 //与运算(11111110和11110000的与运算) { { {case case0xde: //11011110

case0xbe: //101111110case0x7e: //1111110} { //不断地P3口数 } }} {{case0xed: //11101101case0xdd: //11011101case0xbd: //10111101case0x7d: //1111101} {}}} {{{case0xeb: //11101011case0xdb: //11011011case0xbb: //10111011case0x7b: //1111011} {}}} {{{case0xe7: //11100111case0xd7: //11010111case //1011case //111}{}}}void { { }} { {

语句2;… 语句 }不需要break语句。

我们在设计产品时,若用到A/D和D/A,一般这些都提供独立的模拟地(AGND)和数字地(DGND)引脚,为了输出的模拟电压正比于输入的数字量Dn,从而实现了从数字量到模拟量的转换。n8用蜂鸣器分别警报一声,完成整个周期时间控制在5s左右,循环变化。 //52系列头文件#defineucharunsignedchar #defineuintunsignedint //宏定义延时变量sbitdula=P2^6; //U1锁存器的锁存端sbit sbit DAWRsbit sbitbeep=P2^3; voiddelayms(uintxms) {uint //延时xms}void {ucharval,flag; //设置P0的输入数据为0 { { { } } { { } }}} 这4个电容要尽量靠近MAX232,以提高搞干扰能力。实际应用中,1N2可直接连接TTL/CMOS电平的51单片机串行发送端TXD;R1OUT,R2OUT可直接连接PC机的RS-232口的接RXD;T1OUT,T2OUT可直接PCRS-232串口RX;R1I,R2IN可直接连接PCRS-232口的发送端TXD。如I(T2IN连接单片机的发送TXDPCRS-232接收RXD要对应接T1OUT(T2OUT),同时,R1OUT(R2OUT)连接单片机的RXD引脚,PC机的RS-232发送端TXD对应接R1IN2N)引脚。方式:SM0SM1=000的波特率=fosc/12;同步移位寄存器方式(通常用于扩展I/O)SM0SM1=011=(2SMOD/32)*(T110(8)SM0SM1=10,方式2的波特率=(2SMOD/64)*fosc;11位异步收发(9位数据)SM0SM1=113(2SMOD/32)*(T1溢出率)11(9)fosc为系统晶振频率,通常为12MHz或11.0592MHz;SMOD是PCON(PowerDown)电源管理寄存器的最(D7);T1溢出率T1溢出的频率(只要算出T1一次所需要的时间T,那么T倒数1/T。)IDL=0:单片机处于正常工作状态。(IDL=idle)C1.1输出一行信息: /*standardinput&output的缩写,意思是有关标准输入输出的信息*/void {printf(“ThisisaC //是换行符,实现换行;即在输出“ThisisaCprogram.”后回车行。 standardinput&output.headvoid {inta,b,sum; /*定义变量a和b,指定a和b为整型(int)变量*/ /*赋值语句,使a和b的值分别为123和456*/ /*使sum的值为a+b*/printf(“sumis 1.32 standardinput&output.headvoid {intmax(intx,int /*对被调用函数ma的int 是输入ab的值,&a,&b中的“&”的含义是“取地址”*/ }intmax(int,x,int {int if(x>y)z=x; elsez=y; }ifxispositivethen 若x为正 printx 输出x 置t的初值为1 置t的初值为print- 输出- while 当i≤5,执行下面操{t*1 print 输出t inta,b; (指定变量a、b为整型)unsignedshortc,d; longe,f; (指定变量e、f为长整型) void{inta,b,c,d; unsignedu; /*指定u为无符号整型变量*/ /*printf(”a+u=%d,b+u=%d”\n,c,d);*输出变量c,d(将“a+u=”原样输出,“%dcdn”执} void {floata,b; //浮点变量只能保证有效数字是7位 含 char a1=’c’;b1=’d’; //standardinput&output.head标准输入输出头文件voidmain() {char //字符c1的ASCII代码为十进制数97,即给c1赋值为97 //字符c2的ASCII代码为十进制数98,即给c2赋值为98 }#include<stdio.h>//standardinput&output.headvoid }

char 如:printf(“howdoyoudo.”); 不能 int float charc inta,b,c=5; /*表示a,b,c为整型变量,但只对c初始化,c的初值为5*/inta=3,b=3,c=3; /*表示a,b,c的初值都是3*/inta=3; inta; //指定a为整型变量 inta,b,c=5; inta,b,c; /*赋值语句,将3赋给a*/ standardinput&output.headvoid {unsigned //指定a为无符intb=-1; }等价于等价于 表达式1,表达式2 值,所以逗号表达式“3+5,6+8”的值为14。 例:if(x>y)z=x;elsez=y; puts(输出字符串)、gets(输出字符串) void {char //指定a,b,c为字符 a,b,cBOY换行。} 例 例如:printf(“%4d,%4d”,ab);若a=123,b=123456,则输出结果为└┘123,123456 例:long //定义a为长整型变量 x格式符:以十六进制数形式输出整数.例:printf(”%8o”,a); u格式符:用来输出unsigned型数据,即无符号数,以十进制整数形式输出: //”%c”是格式符,c是变量名s格式符:用来输出一个字符串。例 字符串小于m,,则左补空格。 //standardinput&output.headvoid{floatx,y;(double}例:用scanf函数输入数据: //standardinput&output.headvoid {int “&a、&b、&c”:“&”是“地址运算符”,&a指a在内存中的地址。a.能被4整除,但不能被100整除,如2008;b.能被4整除,又能被400整除,如2000。#include<stdio.h>//standardinput&output.head标准输入输出头文件voidmain() {intyear,leap; /*指定year,leap为整型变量*/ /*表示要按十进制整数形式输入year数据*/{{}

}printf(“aleap} 语句标号:由字母、数字和下划线组成,其第一个字符必须为字母或下划线;不能用整数来用while void {int /*指定i,sum=0为整型函数 i /*循环设定值,即i只在<=100数值内循环{ //将sum+i所得的值赋给 /*“i++”,则i的值始终不改变,循环永不结束conte语句:其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。break void {int {if(n%3= 的地址}}类型说明符数组名[常量表达式 如:inta[10]//定义了一个整型号数组数组名为a,此数组中有10个元素 void {int //0-9for //换行

例:floata3*4(34列)的数组,b5*10(510列)二维数组的初始化 int 100 int 赋初值后数组各元素为:500 9001000011 //输入输出标准头void //主函{charc[10]={‘I’,a’,’ma //定义数组长度为10个字//或charc[]={“Iama /*数级c的长度不是10而是11;因为字符串常量的最后由/*系统加上一个”字符串结束标志int //整型函数变量 //定义0-9 c[i]Iama//或 //用来输出一个字符 //换行回}串“Iamaboy”的,字符串中的字符是逐个存放到数组元素中的;字符串的实际长度与数组长度相等. //输入输void //主函{chardiamond[][5]={{***’},{‘****’},{*’int //赋i,j整型变 }字符数组的输入输逐个字符输入输出.用格式符”%c如:charc[]={“”}; );/ void {charstring[]=(或*string=)”Ilove /*赋数组名string(代表字符数组的首元素的地址)的值为”Ilove /*%S用来输出一个字符串,并换行,将string的地址里的内容以字符串的形式输出*/ //运行结果:Ilove将字符串a为字符串 //标准输入输出void //主函{chara[]=”Iama //赋初int //i //在for语句中,先检查*(a+1)是否为’\0’ //如果不等于’\0’,表示字符串尚未处理完,就将*(a+1)的值赋给 //再将’\0’给 //将数组名a地址里的内容以字符串printf(“stringb //b //在for语句中,先检查b[i]是否为’\0’ //将数组名b[i]地址里的内容以一个字符(c格式符:用来输出一个字符) }

stringais:Iamaboy.stringbisabo如:charstr[]={“ \nBeijing”};

即一般利用gets函数的目的是向字符数组输入一个字符串。把字符2接到字符1的后面,结果放在字符数组1中,函数调用后得到一函数值---字符数1的地址。例如:charstr1[30]={“People’sRepublic charstr2[]={“ //定义数组str2的字符 People’sRepublic说明:1.字符数组1必须足够大,以便容纳连接后的新字符串;即字符数组1必须定义足够的长连接前两个字符串的后面都有’\0’,连接时将字符串 后面的’\0’取消,只在新串最后保留’\0’函数:在C语言中,子程序的作用是由函数来完成的。一个C程序可由一个主函数和若干个其它函数构成。由主函数调用vidmi()定义函数的类型为void,意为函数无类型,即无函数值,也就是说,执行这个函数后不会把任何值带回an {}有参函数类型标识 函数名(形式参数表 形参{语句部}例如intmax(intx,int /*两个形式参数x和y,它们都是整型{intz; /*函数体中的部分,指定z为整型*/z=x>y?x:y; /*如果需要从被调用函数带回一个函数值(供主调函数使用 宏定义:用一个指定的标识符(即名字)来代表一个字符串。#define标识符字符串如:#definePI ”这个字符串 #defineR #definePI #defineL //L#defineSvoid /*把L,S变量的地址里的内容以f格式符(用来输出实数(包括单、双精度),以小数形式输出)输出 #definePR #defineNL #defineD“%d” #defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS //s格式符:用来输出一个字符void {int charstring[]=””; //把string变量的地址里的内容以s格式符(用来输出一个字符串)输出}1 #ifdef如:#ifdef /*假如计算机A已被定义过,则编译下程序段#defineINTEGER_SIZE 程序段 #defineINTEGER_SIZE 它的作用是若程序所指定的标识符已经被#defing命令定义过,则在程序编译阶段编译程序段1,否则编译程序段2。其中else部分可以没有,即 #ifdef标识符#ifndef2。#if 指针---由于通过地址能找到所需的变量单元,地址指向该变量单元;因此在C语言中,将地址形象化地称为“指针”,意如 int int /*将变量i的地址存放到指针变量pointer_1中,因此pointer_1就“指向”了变量i*/ /*将变量j的地址存放到指针变量pointer_2中,因此pointer_2就“指向”了变量j*/int int p=&a[0];或P=a /*把a[0]元素的地址赋给指针变量P,也就是使P指向a数组的第0号元素;C语言规定数组名int int /*所以,P+i是指向a数组的第i个元素,a代表数组首元素的地址,它实际地址为 a+i*d=1000+3*4=1012,然后从1012地址所指向的float型单元取出元素的值。aa00110a[1][0]12a[1][2]12a[1][2] #define {int /*a34a[3][4]的值 //00 //101 //10 //20 //10} void {int int /*P为指向整型变量的指针变量;定义i为整型变量 }

void {voidcopy_strin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论