单片机重点(编程)

合集下载

单片机C语言编程学习

单片机C语言编程学习

单片机C 语言编程学习一、概述在一个集成电路芯片上集成微处理器、存储器、I/0接口电路,从而构成了单片机。

Intel公司推出了MCS-51系列单片机:集成8位CPU、4K字节ROM、128字节的RAM、4个8位并口、一个全双工串行口、2个16位定时器/计数器。

寻址范围64K,并有控制功能较强的布尔处理器。

二、预备知识<一>、电平特性1、数字电路中只有两种电平:高和低(本课程中)定义单片机为TTL电平:高+5V 低0V2、RS232电平:计算机的串口(-9V~15V) 高-12V 低+12V (+3V~+15V)所以计算机与单片机之间通讯时需要加电平转换芯片max232。

<二>、二进制与十六进制的表示及转换1、二进制:数字电路中的两种电平特性决定了它:0 0 6 110 12 11001 1 7 111 13 11012 10 8 1000 14 11103 11 9 1001 15 11114 100 10 1010 16 100005 101 11 10112、十六进:是二进制的简短表示形式。

十进制中的0-15分别表示为十六进制的0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F3、熟练掌握二进制与十六进制之间的转换。

规律:一般把四个二进制数放在一起转换成一个十六进制数,转换时先把二进制数转换成十进制数,再把十进制数转换成十六进制数。

如:0001B -> 1 -> 1HB表示为二进制,H为十六进制1001B -> 9 -> 9H1010B -> 10 -> AH0010 1100 -> 44 -> 2CH4、二进制各种对制关系:<三>、二进制数的逻辑运算1. “与”运算“与”运算是实现“必须都有,否则就没有”这种逻辑关系的一种运算。

运算符为“· ”, 其运算规则如下:0·0=0, 0·1=1·0=0, 1·1=12. “或”运算“或”运算是实现“只要其中之一有,就有”这种逻辑关系的一种运算, 其运算符为“+”。

单片机C语言 必知的数据存储与程序编写知识 附单片机应用编程知识介绍

单片机C语言 必知的数据存储与程序编写知识 附单片机应用编程知识介绍

一、五大内存分区内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

1、栈区(StaCk):FIFo就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。

里面的变量通常是局部变量、函数参数等。

2、堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。

如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3、自由存储区:就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free 来结束自己的生命。

4、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5、常量存储区:这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)code/data/stack内存主要分为代码段,数据段和堆栈。

代码段放程序代码,属于只读内存。

数据段存放全局变量,静态变量,常量等,堆里存放自己malloc或new出来的变量,其他变量就存放在栈里,堆栈之间空间是有浮动的。

数据段的内存会到程序执行完才释放。

调用函数先找到函数的入口地址,然后计算给函数的形参和临时变量在栈里分配空间,拷贝实参的副本传给形参,然后进行压栈操作,函数执行完再进行弹栈操作。

字符常量一般放在数据段,而且相同的字符常量只会存一份。

二、C语言程序的存储区域1、由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。

编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。

2、C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。

单片机常考知识点总结归纳

单片机常考知识点总结归纳

单片机常考知识点总结归纳单片机(Microcontroller Unit,简称MCU)是一种集成了微处理器和其他电子器件的芯片,具有处理数据、控制外设、执行程序等功能。

在电子领域,单片机是一种重要的组件,在各种应用中得到广泛的应用。

本文将总结和归纳单片机的常考知识点,帮助读者系统地了解单片机的基础知识。

1. 单片机的基本概念和分类单片机是嵌入式系统中最常见的计算机组成部分之一。

它由微处理器核心、存储器、定时器、I/O接口等多个模块组成。

基于不同的应用需求,单片机可以分为多种不同的类型,例如8位单片机、16位单片机和32位单片机等。

2. 单片机的基本结构和工作原理单片机的基本结构包括中央处理器(CPU)、存储器、输入/输出(I/O)接口、定时器/计数器和串行通信接口等。

单片机通过执行程序来完成特定的任务,程序存储在存储器中,通过CPU的指令执行功能来实现各种操作。

3. 单片机的编程和开发环境单片机的编程可以使用汇编语言、C语言等多种编程语言实现。

在开发单片机应用程序时,需要选择适当的开发环境,例如Keil、IAR等集成开发环境(IDE)。

同时,还需要学习如何使用编译器、调试器和仿真器等工具。

4. 单片机的输入/输出和中断机制单片机通过I/O接口与外部设备进行通信,包括输入设备(如按键、传感器等)和输出设备(如LED、LCD等)。

单片机还支持中断机制,可以在特定事件发生时中断当前程序的执行并跳转到中断服务程序进行处理。

5. 单片机的定时器和计数器定时器和计数器是单片机的重要功能模块,用于生成精确的时间延迟和计数操作。

通过定时器和计数器,可以实现精准的定时任务、PWM输出、脉冲计数等功能。

6. 单片机的串行通信和总线系统单片机支持多种串行通信接口,包括UART、SPI、I2C等,用于与其他设备进行数据交换。

此外,单片机还可以通过总线系统与外部存储器、外设进行数据传输和控制。

7. 单片机的电源管理和低功耗设计在实际应用中,单片机的功耗管理非常重要。

单片机重点复习题

单片机重点复习题

第三章4.什么是ALU?简述MCS-51系列单片机ALU的功能与特点。

答:ALU是用于对数据进行算术运算和逻辑操作的执行部件,由加法器和其他逻辑电路(移位电路和判断电路等)组成。

在控制信号的作用下,它能完成算术加、减、乘、除和逻辑与、或、异或等运算以及循环移位操作、位操作等功能。

6.什么是指令?什么是程序?简述程序在计算机中的执行过程。

答:指令由操作码和操作数构成,分别表示何种操作和操作数的存储地址;而程序则是:程序是可以连续执行,并能够完成一定任务的一条条指令的集合。

程序执行是由控制器控制的,控制器是CPU 的大脑中枢,它包括定时控制逻辑、指令寄存器IR、数据指针DPTR及程序计数器PC、堆栈指针SP、地址寄存器、地址缓冲器等。

它的功能是对程序的逐条指令进行译码,并通过定时和控制电路在规定的时刻发出各种操作所需的内部和外部控制信号,协调各部分的工作,完成指令规定的操作。

7.什么是堆栈?堆栈有何作用?在程序设计时,有时为什么要对堆栈指针SP重新赋值?如果CPU在操作中要使用两组工作寄存器,你认为SP的初值应为多大?答:堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。

它的特点是按照先进后出的原则存取数据,这里的进与出是指进栈与出栈操作。

80C51片内RAM的部分单元可以用做堆栈。

有一个8位的堆栈指针寄存器SP,专用于指出当前堆栈顶部是片内RAM的哪一个单元。

80C51单片机系统复位后SP的初值为07H,也就是将从内部RAM 的08H 单元开始堆放信息。

但是,80C51 系列的栈区不是固定的,只要通过软件改变SP寄存器的值便可更动栈区。

为了避开工作寄存器区和位寻址区,SP 的初值可置为2FH或更大的地址值。

如果CPU在操作中要使用两组工作寄存器,如果不使用位变量,SP的初值至少应为0FH或更大的值;如果使用位变量,SP 的初值至少应为2FH 或更大的值;Keil C51 编译器会自动计算SP的初始设定值,无需编程者关心。

单片机超详细教程

单片机超详细教程

单片机超详细教程单片机(Microcontroller)是一种嵌入式芯片,可用于实现各种功能,如控制、通信和输入输出等。

它集成了中央处理器(CPU)、内存、IO口和外围设备接口等功能单元,具有小巧、低功耗、成本低廉和易于编程的特点。

在本教程中,我们将介绍如何使用单片机进行简单的编程和控制。

详细的内容如下:一、单片机概述(100字)单片机是一种集成了CPU、存储器和IO口等功能的集成电路芯片。

它通常用于嵌入式系统中,可实现各种功能,如控制、通信和输入输出等。

二、单片机原理(200字)单片机由中央处理器(CPU)、存储器(ROM和RAM)、输入输出接口(IO口)和时钟电路等组成。

通过编程对CPU进行控制,从而实现各种功能。

三、单片机选择(200字)单片机市场上有许多不同型号和品牌的选择。

选型时需要考虑需求和预算,并对不同单片机的特性和性能进行比较。

四、单片机编程(200字)单片机编程通常使用C语言或汇编语言。

在编程之前,需要了解单片机的基本指令集和寄存器结构,并根据需求进行相关配置。

五、单片机开发环境搭建(200字)六、单片机应用(300字)单片机广泛应用于各个领域,如智能家居、工业自动化和物联网等。

其应用范围包括控制、通信、传感和数据处理等。

七、单片机实例(300字)为了更好地理解单片机的应用,我们将介绍一个简单的实例。

该实例是一个LED灯控制系统,通过单片机控制LED的亮灭。

八、单片机扩展(200字)单片机支持各种外围设备的扩展,如传感器、无线模块和显示屏等。

通过扩展可以实现更丰富的功能和应用。

九、单片机调试和测试(200字)在单片机开发过程中,调试和测试是必不可少的。

通过软件和硬件调试工具,可以对程序进行调试和性能测试,以确保系统正常运行。

十、单片机发展趋势(200字)随着技术的发展,单片机正变得更加高性能和功能强大。

未来,单片机将更广泛地应用于各个领域,并与其他技术相结合,实现更多的创新。

以上就是单片机超详细教程的内容,希望能对初学者提供帮助。

单片机编程大全_实例_解析

单片机编程大全_实例_解析

学习单片机//实例1:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}//实例2:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待一个机器周期}/函数功能:主函数(C语言规定必须有也只能有1个主函数)/void main(void){while(1) //无限循环{P1=0xfe; //P1=1111 1110B,P1.0输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B,P1.0输出高电平delay(); //延时一段时间}}//实例3:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/函数功能:主函数(C语言规定必须有也只能有1个主函数)/ void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将P1口状态送入P0口P2=P1; // 将P1口状态送入P2口P3=P1; // 将P1口状态送入P3口}}//实例4:使用P3口流水点亮8位LED #include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/函数功能:主函数/ void main(void){while(1){P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮delay(); //调用延时函数P3=0x7f; //第八个灯亮delay(); //调用延时函数}}//实例7:通过对P3口地址的操作流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/函数功能:延时一段时间/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++); //利用循环等待若干机器周期,从而延时一段时间}/函数功能:主函数/void main(void){while(1){x=0xfe; //第一个灯亮delay(); //调用延时函数x=0xfd; //第二个灯亮delay(); //调用延时函数x=0xfb; //第三个灯亮delay(); //调用延时函数x=0xf7; //第四个灯亮delay(); //调用延时函数x=0xef; //第五个灯亮delay(); //调用延时函数x=0xdf; //第六个灯亮delay(); //调用延时函数x=0xbf; //第七个灯亮delay(); //调用延时函数x=0x7f; //第八个灯亮delay(); //调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#include<reg51.h> //包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/void int_delay(void) //延时一段较长的时间{unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++); //空操作}/函数功能:用字符型数据延时一段时间/void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255 for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作}/函数功能:主函数/void main(void){unsigned char i;while(1){for(i=0;i<3;i++){P1=0xfe; //P1.0口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //P1.4口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay(); //延时一段较长的时间}}}//实例9:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;s=m n; //s=64 71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17 256+192=H3 16 16 16+H2 16 16+H1 16+H0//两边同除以256,可得17+192/256=H3 16+H2+(H1 16+H0)/256//因此,高8位16进制数H3 16+H2必然等于17,即4544除以256的商//低8位16进制数H1 16+H0必然等于192,即4544除以256的余数P1=s/256; //高8位送P1口,P1=17=11H=0001 0001B, P1.0和P1.4口灭,其余亮P0=s%256; //低8位送P0口, P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7口灭,其余亮}//实例11:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void){unsigned int i;for(i=0;i<20000;i++)}/函数功能:主函数/ void main(void){unsigned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0口delay(); //调用延时函数}}//实例13:用P0口显示逻辑"与"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}//实例14:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000Bwhile(1); //设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000Bwhile(1); //设置无限循环,防止程序“跑飞”}//实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xecwhile(1); //无限循环,防止程序“跑飞”}//实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为P1.4sbit X=P1^5; //将X位定义为P1.5sbit Y=P1^6; //将Y位定义为P1.6sbit Z=P1^7; //将Z位定义为P1.7void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}//实例18:用右移运算流水点亮P1口8位LED #include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时一段时间/void delay(void){unsigned int n;for(n=0;n<30000;n++);}/函数功能:主函数/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0delay(); //调用延时函数}}}//实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/函数功能:主函数/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4/函数功能:延时一段时间/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/函数功能:主函数/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1;}switch(i) //使用多分支选择语句{case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LEDP0=0xff;}}}//实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件sbit sound=P3^7; //将sound位定义为P3.7/函数功能:延时形成1600Hz音频/void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/函数功能:延时形成800Hz音频/void delay800(void){unsigned char n;for(n=0;n<200;n++);}/函数功能:主函数/void main(void){unsigned int i;while(1){for(i=0;i<830;i++){sound=0; //P3.7输出低电平delay1600();sound=1; //P3.7输出高电平delay1600();}for(i=0;i<200;i++){sound=0; //P3.7输出低电平delay800();sound=1; //P3.7输出高电平delay800();}}}//实例22:用while语句控制LED #include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时约60ms (3 100 200=60000μs)/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/函数功能:主函数/void main(void){unsigned char i;while(1) //无限循环{i=0; //将i初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体{P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}//实例23:用do-while语句控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时约60ms (3 100 200=60000μs)/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/函数功能:主函数/void main(void){do{P0=0xfe; //第一个LED亮delay60ms();P0=0xfd; //第二个LED亮delay60ms();P0=0xfb; //第三个LED亮delay60ms();P0=0xf7; //第四个LED亮delay60ms();P0=0xef; //第五个LED亮delay60ms();P0=0xdf; //第六个LED亮delay60ms();delay60ms();P0=0xbf; //第七个LED亮delay60ms();P0=0x7f; //第八个LED亮delay60ms();}while(1); //无限循环,使8位LED循环流水点亮}//实例24:用字符型数组控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时约60ms (3 100 200=60000μs)/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/函数功能:主函数/void main(void){unsigned char i;unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示delay60ms();//调用延时函数}}//实例25:用P0口显示字符串常量#include<reg51.h> //包含单片机寄存器的头文件/函数功能:延时约150ms (3 200 250=150 000μs=150ms/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/void main(void){unsigned char str[]={"Now,Temperature is :"}; //将字符串赋给字符型全部元素赋值unsigned char i;while(1){i=0; //将i初始化为0,从第一个元素开始显示while(str[i]!='\0') //只要没有显示到结束标志'\0'{P0=str[i]; //将第i个字符送到P0口显示delay150ms(); //调用150ms延时函数i++; //指向下一个待显字符}}}//实例26:用P0 口显示指针运算结果#include<reg51.h>void main(void)unsigned char p1, p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0= p1+ p2; // p1+ p2相当于i+j,所以P0=25+15=40=0x28//则P0=0010 1000B,结果P0.3、P0.5引脚LED熄灭,其余点亮while(1); //无限循环,防止程序“跑飞”}//实例27:用指针数组控制P0口8位LED流水点亮#include<reg51.h>/函数功能:延时约150ms (3 200 250=150 000μs=150ms/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/void main(void){unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],&Tab[6],&Tab[7]};unsigned char i; //定义无符号字符型数据while(1){for(i=0;i<8;i++){P0= p[i];delay150ms();}}}//实例28:用数组的指针控制P0 口8 位LED流水点亮#include<reg51.h>/函数功能:延时约150ms (3 200 250=150 000μs=150ms/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/void main(void){unsigned char i;unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};//流水灯控制码unsigned char p; //定义无符号字符型指针p=Tab; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0= (p+i); // (p+i)的值等于a[i]delay150ms(); //调用150ms延时函数}}}//实例29:用P0 、P1口显示整型函数返回值#include<reg51.h>/函数功能:计算两个无符号整数的和/unsigned int sum(int a,int b){unsigned int s;s=a+b;return (s);}/函数功能:主函数/void main(void){unsigned z;z=sum(2008,2009);P1=z/256; //取得z的高8位P0=z%256; //取得z的低8位while(1);}//实例30:用有参函数控制P0口8位LED流水速度#include<reg51.h>/函数功能:延时一段时间/void delay(unsigned char x){unsigned char m,n;for(m=0;m<x;m++)for(n=0;n<200;n++);}/函数功能:主函数/void main(void){unsigned char i;unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3 100 200=60 000μs)}//慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3 250 200=150 000μs)}}}//实例31:用数组作函数参数控制流水花样#include<reg51.h>/函数功能:延时约150ms/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水点亮P0口8位LED/void led_flow(unsigned char a[8]){unsigned char i;for(i=0;i<8;i++){P0=a[i];delay();}}/函数功能:主函数/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码led_flow(Tab);}//实例32:用指针作函数参数控制P0口8位LED流水点亮#include<reg51.h>/函数功能:延时约150ms/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水点亮P0口8位LED/void led_flow(unsigned char p) //形参为无符号字符型指针{unsigned char i;while(1){i=0; //将i置为0,指向数组第一个元素while( (p+i)!='\0') //只要没有指向数组的结束标志{P0= (p+i);// 取的指针所指变量(数组元素)的值,送P0口delay(); //调用延时函数i++; //指向下一个数组元素}}}/函数功能:主函数/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E};//流水灯控制码unsigned char pointer;pointer=Tab;led_flow(pointer);}//实例33:用函数型指针控制P1口灯花样#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量/函数功能:延时约150ms/ void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水灯左移/void led_flow(void){unsigned char i;for(i=0;i<8;i++) //8位控制码{P0=Tab[i];delay();}}/函数功能:主函数/void main(void){void ( p)(void); //定义函数型指针,所指函数无参数,无返回值p=led_flow; //将函数的入口地址赋给函数型指针pwhile(1)( p)(); //通过函数的指针p调用函数led_flow()}//实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址unsigned char code str3[ ]="The Systerm is designed by Zhang San";unsigned char code str4[ ]="The date is 2008-9-30";unsigned char p[ ]={str1,str2,str3,str4}; //定义p[4]为指向4个字符串的字符型指针数组/函数功能:延时约150ms/ void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水点亮P0口8位LED/ void led_display(unsigned char x[ ]) //形参必须为指针数组{unsigned char i,j;for(i=0;i<4;i++) //有4个字符串要显示{j=0; //指向待显字符串的第0号元素while( (x[i]+j)!='\0') //只要第i个字符串的第j号元素不是结束标志{P0= (x[i]+j); //取得该元素值送到P0口显示delay(); //调用延时函数j++; //指向下一个元素}}}/函数功能:主函数/ void main(void){unsigned char i;while(1){for(i=0;i<4;i++)led_display(p); //将指针数组名作实际参数传递}}//实例35:字符函数ctype.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}//实例36:内部函数intrins.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<intrins.h> //包含函数isalpha()声明的头文件/函数功能:延时约150ms/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/void main(void){P3=0xfe; //P3=1111 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3delay(); //调用延时函数}}//实例37:标准函数stdlib.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<stdlib.h> //包含函数isalpha()声明的头文件/函数功能:延时约150ms/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/void main(void){unsigned char i;while(1){for(i=0;i<10;i++) //产生10个随机数{P3=rand()/160; //将产生的随机数缩小160倍后送P3显示delay();}}}//实例38:字符串函数string.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<string.h> //包含函数isalpha()声明的头文件void main(void){unsigned char str1[ ]="Now, The temperature is :";unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}//实例39:宏定义应用举例2#include<reg51.h> //包含51单片机寄存器定义的头文件# define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏定义,a和b为形参void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}//实例40:宏定义应用举例2#include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0; //将P3.0引脚置低电平,LED点亮P3_1=0; //将P3.0引脚置低电平,LED点亮P3_2=0; //将P3.0引脚置低电平,LED点亮P3_3=0; //将P3.0引脚置低电平,LED点亮P3_4=1; //将P3.4引脚置高电平,LED熄灭P3_5=1; //将P3.5引脚置高电平,LED熄灭P3_6=1; //将P3.7引脚置高电平,LED熄灭P3_7=1; //将P3.7引脚置高电平,LED熄灭while(1);}//实例41:宏定义应用举例3#include<reg51.h> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/中断、定时器中断、定时器中断、定时器中断、定时器///实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值}}//实例43:用定时器T1查询方式控制单片机发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/函数功能:主函数/void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}//实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}//实例45:用定时器T0的中断控制1位LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/函数功能:主函数/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/函数功能:定时器T0的中断服务程序/void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}//实例46:用定时器T0的中断实现长时间定时#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/函数功能:主函数/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/函数功能:定时器T0的中断服务程序/void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}//实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚sbit D2=P2^1; //将D2位定义为P2.1引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/函数功能:主函数/void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数;}/函数功能:定时器T1的中断服务程序/void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将P2.1引脚输出电平取反Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}//实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/函数功能:主函数/void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1;}/函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数{sound=~sound;TH1=(65536-921)/256; //定时器T1的高8位重新赋初值TL1=(65536-921)%256; //定时器T1的高8位重新赋初值}//实例49:用定时器T0的中断实现"渴望"主题曲的播放#include<reg51.h> //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7unsigned int C; //储存定时器的定时常数//以下是C调低音的音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz#define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz#define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz//以下是C调中音的音频宏定义#define dao 523 //将“dao”宏定义为中音“1”的频率523Hz#define re 587 //将“re”宏定义为中音“2”的频率587Hz#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz#define sao 784 //将“sao”宏定义为中音“5”的频率784Hz#define la 880 //将“la”宏定义为中音“6”的频率880Hz#define xi 987 //将“xi”宏定义为中音“7”的频率523H//以下是C调高音的音频宏定义#define h_dao 1046 //将“h_dao”宏定义为高音“1”的频率1046Hz #define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz#define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率1975Hz/函数功能:1个延时单位,延时200ms/void delay(){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/函数功能:主函数/void main(void){unsigned char i,j;//以下是《渴望》片头曲的一段简谱unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, //每行对应一小节音符l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,0xff}; //以0xff作为音符的结束标志//以下是简谱中每个音符的节拍//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位unsigned char code JP[ ]={4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10};EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x00; // 使用定时器T0的模式1(13位计数器)while(1) //无限循环{i=0; //从第1个音符f[0]开始播放while(f[i]!=0xff) //只要没有读到结束标志就继续播放{C=/f[i];TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法TR0=1; //启动定时器T0for(j=0;j<JP[i];j++) //控制节拍数delay(); //延时1个节拍单位TR0=0; //关闭定时器T0i++; //播放下一个音符}}}/函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波/void Time0(void ) interrupt 1 using 1{sound=!sound; //将P3.7引脚输出电平取反,形成方波TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法}数据发送程序#include<reg51.h> //包含单片机寄存器的头文件sbit p=PSW^0;unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量/*****************************************************函数功能:向PC发送一个字节数据***************************************************/void Send(unsigned char dat){ACC=dat;TB8=p;SBUF=dat;while(TI==0);TI=0;}/************************************************************** 函数功能:延时约150ms**************************************************************/ void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*****************************************************函数功能:主函数***************************************************/void main(void){unsigned char i;TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2SCON=0xc0; //SCON=1100 0000B,串口工作方式3,//SM2置0,不使用多机通信,TB8置0 PCON=0x00; //PCON=0000 0000B,波特率9600TH1=0xfd; //根据规定给定时器T1赋初值TL1=0xfd; //根据规定给定时器T1赋初值TR1=1; //启动定时器T1while(1){for(i=0;i<8;i++) //模拟检测数据{Send(Tab[i]); //发送数据idelay(); //50ms发送一次检测数据}}}//实例50-1:输出50个矩形脉冲#include<reg51.h> //包含51单片机寄存器定义的头文件sbit u=P1^4; //将u位定义为P1.4/函数功能:延时约30ms (3 100 100=30 000μs =30m/ void delay30ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}/函数功能:主函数/void main(void){unsigned char i;u=1; //初始化输出高电平for(i=0;i<50;i++) //输出50个矩形脉冲{u=1;delay30ms();u=0;delay30ms();}while(1); //无限循环,防止程序“跑飞”}//实例50-2:计数器T0统计外部脉冲数#include<reg51.h> //包含51单片机寄存器定义的头文件/函数功能:主函数/void main(void){TMOD=0x06; // TMOD=0000 0110B,使用计数器T0的模式2EA=1; //开总中断ET0=0; //不使用定时器T0的中断TR0=1; //启动T0TH0=0; //计数器T0高8位赋初值TL0=0; //计数器T0低8位赋初值while(1) //无限循环,不停地将TL0计数结果送P1口P1=TL0;}//实例51-2:定时器T0的模式2测量正脉冲宽度#include<reg51.h> //包含51单片机寄存器定义的头文件sbit ui=P3^2; //将ui位定义为P3.0(INT0)引脚,表示输入电压/函数功能:主函数/void main(void){TMOD=0x0a; // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1 EA=1; //开总中断ET0=0; //不使用定时器T0的中断TR0=1; //启动T0TH0=0; //计数器T0高8位赋初值TL0=0; //计数器T0低8位赋初值while(1) //无限循环,不停地将TL0计数结果送P1口{while(ui==0) //INT0为低电平,T0不能启动;TL0=0; //INT0为高电平,启动T0计时,所以将TL0清0while(ui==1) //在INT0高电平期间,等待,计时;P1=TL0; //将计时结果送P1口显示}}//实例52:用定时器T0控制输出高低宽度不同的矩形波#include<reg51.h> //包含51单片机寄存器定义的头文件sbit u=P3^0; //将u位定义为P3.0,从该引脚输出矩形脉冲unsigned char Countor; //设置全局变量,储存负跳变累计数/函数功能:延时约30ms (3 100 100=30 000μs =30ms)/void delay30ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}/函数功能:主函数/void main(void){unsigned char i;EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断Countor=0;for(i=0;i<100;i++) //输出100个负跳变{u=1;delay30ms();。

单片机重点知识点

单片机重点知识点

单片机重点知识点单片机是嵌入式系统开发中的重要组成部分,广泛应用于各种领域,如家电、汽车、医疗等。

本文将对单片机重点知识点进行介绍。

一、单片机的基础知识点1. 单片机的定义单片机是一种集成了处理器、存储器和输入/输出接口的微型计算机系统,具有体积小、功耗低、成本低等特点。

常用的单片机有AVR、PIC、STM32等。

2. 单片机的组成单片机由以下几个部分组成:- 中央处理器- 存储器- 输入/输出接口- 时钟电路- 辅助电路3. 单片机的工作原理单片机的工作原理可分为以下几个步骤:- 程序存储器中的指令被取出并送到中央处理器中执行;- 执行指令时,进行数据读取和存储;- 中央处理器将结果写入存储器或输出到外部设备。

二、单片机编程的知识点1. 单片机编程语言单片机编程语言主要有汇编语言和高级语言两种。

常用的高级语言有C语言和Basic语言。

2. 单片机的寄存器单片机寄存器是指内部的用于存储数据和控制单元的设备。

常用的寄存器有通用寄存器、状态寄存器、计数寄存器等。

3. 单片机的输入/输出单片机的输入/输出通常使用端口操作来实现。

输入操作可以通过读取端口输入的信号,输出操作可以通过向端口输出信号来实现。

4. 单片机的中断中断是指单片机在执行程序时遇到某些事件时,暂停程序的执行,跳转到中断服务程序中去处理该事件。

常见的中断有外部中断、定时中断和任务间中断等。

三、单片机应用的知识点1. 单片机应用领域单片机应用广泛,涉及的领域包括:- 家电控制- 汽车电子- 机器人控制- 医疗器械等。

2. 单片机的通信方式单片机的通信方式有多种,常用的有串口通信、并口通信、SPI通信、I2C通信等。

其中串口通信应用最为广泛。

3. 单片机的电源管理单片机的电源管理是指如何控制单片机系统的供电,以保证单片机正常工作。

常见的电源管理方式有降压稳压和电源管理芯片等。

4. 单片机的调试与测试单片机的调试与测试是指如何验证单片机系统的正确性,包括硬件测试和软件测试。

C51单片机编程基本知识

C51单片机编程基本知识

C51单片机编程基本知识C51单片机编程是指使用C语言对C51系列单片机进行编程的过程。

这种编程方式广泛应用于嵌入式系统开发中,具有灵活性高、可靠性强的特点。

本文将介绍C51单片机编程的基本知识,包括单片机结构、编程语言、编译器以及编程流程等。

一、单片机结构C51单片机是由Intel公司开发的一种嵌入式微控制器,由中央处理器、存储器、输入输出接口和外设等部分组成。

其中,中央处理器用于执行程序指令,存储器用于存储程序和数据,输入输出接口用于与外部设备进行交互。

了解单片机的基本结构对于进行C51单片机编程至关重要。

二、编程语言C语言是一种高级编程语言,广泛应用于嵌入式系统开发中。

C语言具备结构化编程的特点,能够提高程序的可读性和可维护性。

在C51单片机编程中,使用C语言可以更加方便地编写程序,并且兼容性强,可以在不同的平台上使用。

三、编译器编译器是将C语言源代码转换为机器语言的工具。

在C51单片机编程中,常用的编译器有Keil C51、SDCC等。

不同的编译器具有不同的特点和使用方法,开发人员需要选择适合自己需求的编译器,并且熟悉其使用方法。

四、编程流程C51单片机编程的流程一般包括以下几个步骤:1. 确定需求:根据实际应用需求,明确单片机的功能和性能要求。

2. 掌握硬件特性:了解单片机的硬件特性,包括引脚功能、外设接口和中断等。

3. 编写代码:使用C语言编写单片机的程序代码,包括初始化设置、主程序和中断服务程序等。

4. 编译代码:使用编译器将C语言源代码编译为可执行的机器语言文件。

5. 烧录程序:将机器语言文件通过烧录工具烧录到单片机的存储器中。

6. 调试测试:连接单片机和外部设备,进行功能测试和调试,确保程序的正确性和稳定性。

7. 优化改进:根据实际运行情况,对程序进行优化和改进,提高性能和效率。

五、常见问题与解决方法在C51单片机编程的过程中,常常会遇到一些问题,下面介绍几个常见问题及其解决方法:1. 编译错误:根据编译器给出的错误提示信息,检查代码语法和逻辑错误,并进行相应的修正。

单片机重点

单片机重点

1、若不使用MCS-51片内存储器引脚EA必须接地。

2、微处理器由寄存器、控制器和运算器三部分组成。

3、单片机系统复位后,PSW=00H,因此片内RAM寄存区的当前寄存器是第 0 组,8个寄存器的单元地址为 00H ~ 07H 。

4、当80C51的RST引脚上保持 2 个机器周期以上的高电平时,80C51即发生复位。

5、当单片机的型号为8031时,其芯片引线EA一定要接低电平。

6、MCS-51单片机内RAM的寄存器区共有 32 单元,分为 4 组寄存器,每组 8 个单元,以 R0~R7 作为寄存器名称。

7、若单片机使用频率为6MHz的晶振,那么机器周期为 2US 。

8、复位后A= 00H ,PSW= 00H ,SP= 07H ,P0~P3= 0FFH 。

80C51复位后,CPU从 0000 H单元开始执行程序,SP的内容为 07 H,第一个压入堆栈的数据将位于内部 RAM的 08 H单元。

OPL A,#4执行指令后,PSW寄存器的内容P为 0 H。

9、8031单片机的引脚必须接低电平, P0 口作地址/数据总线,传送地址码的低8位, P2 口作地址总线,传送地址码的高 8位。

三态缓冲寄存器输出端的“三态”是指高电平态、低电平态和高阻态10、80C51中断有 2 个优先级。

11、MCS-51有5个中断源,有2个中断优先级,优先级由软件填写特殊功能寄存器 IP加以选择。

12、外部中断INT1入口地址为 0013H 。

13、MCS-51中,T0中断服务程序入口地址为__000BH__。

14、80C51中断嵌套最多__2__级。

15、外中断请求标志位是_IE0_和_IE1_。

16、中断系统(1)INT0和INT1的中断标志分别是IE0和IE1。

(2)T0和T1两引脚也可作外部中断输入引脚,这时TMOD寄存器中的C/T位应当为1。

17、MCS-51串行接口有4种工作方式,这可在初始化程序中用软件填写 SCON 特殊功能寄存器加以选择。

C51单片机编程基本知识

C51单片机编程基本知识

C51单片机编程基本知识全文选段:该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。

第三节 Keil C51软件包中的通用文件在C51\LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。

1. 动态内存分配init_mem.C:此文件是初始化动态内存区的程序源代码。

它可以指定动态内存的位置及大小,只有使用了init_mem( )才可以调回其它函数,诸如malloc calloc,realloc等。

calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。

malloc.c:此文件是malloc的源代码,分配一段固定大小的内存。

realloc.c:此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。

全文内容:本章讨论以下内容:l 绝对地址访问l C与汇编的接口l C51软件包中的通用文件l 段名转换与程序优化第一节绝对地址访问C51提供了三种访问绝对地址的方法:1. 绝对宏:在程序中,用“#include〈absacc.h〉”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具体使用可看一看absacc.h便知例如:rval=CBYTE[0x0002];指向程序存贮器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址2. _at_关键字直接在数据定义后加上_at_ const即可,但是注意:(1)绝对变量不能被初使化;(2)bit型函数及变量不能用_at_指定。

例如:idata struct link list _at_ 0x40;指定list结构从40h开始。

xdata char text[25b] _at_0xE000;指定text数组从0E000H开始提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。

单片机重点复习题

单片机重点复习题

单片机重点复习题单片机课后习题第三章4.什么就是alu?详述mcs-51系列单片机alu的功能与特点。

请问:alu就是用作对数据展开算术运算和逻辑操作方式的继续执行部件,由加法器和其他逻辑电路(移位电路和推论电路等)共同组成。

在掌控信号的促进作用下,它能够顺利完成算术提、减至、乘坐、除和逻辑与、或、异或等运算以及循环移位操作方式、位操作等功能。

值。

如果cpu在操作方式中要采用两组工作寄存器,如果不采用位变量,sp的初值至少应属0fh或更大的值;如果使用位变量,sp的初值至少应为2fh或更大的值;keilc51编译器会自动计算sp的初始设定值,无需编程者关心。

8.程序状态寄存器psw的促进作用就是什么?常用状态标识有哪几位?作用是什么?答:psw是8位寄存器,用做程序运行状态的标识。

表中4.7psw寄存器各位名称及地址地址d7hd6hd5hd4hd3hd2hd1hd0h名称cacf0rs1rs0ovf1p当cpu进行各种逻辑操作或算术运算时,为反映操作或运算结果的状态,把相应的标识边线位或明0。

这些标识的状态,可以由专门的指令去测试,也可以通过指令念出。

它为计算机确定程序的下一步运行方向提供依据。

psw寄存器中各位的名称及地址如表4.7所示,下面表明各标识位的促进作用。

●p:奇偶标识。

该位始终跟踪累加器a的内容的奇偶性。

如果有奇数个1,则置p为1,否则清0。

在80c5l的指令系统中,凡是改变累加器a中内容的指令均影响奇偶标识位p。

●f1:用户标识。

由用户置位或登位。

●ov:外溢标识。

存有符号数运算时,如果出现外溢,ov复置1,否则清0。

对于1b的存有符号数,如果用最高位表示正、负号,则只有7位有效位,能表示-128~+127之间的数。

如果运算结果超出了这个数值范围,就会发生溢出,此时,ov=l,否则ov=0。

在乘法运算中,ov=l表示乘积超过255;在除法运算中,ov=l表示除数为0。

●rs0、rsl:工作寄存器组选择位。

单片机编程入门

单片机编程入门
名字有了,我们又怎样让它变'高'或变'低'呢?叫人做事,说一声就可以,这叫发布命令,要计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。让一个引脚输出高电平的指令是SETB,让一个引脚输出低电平的指令是CLR。因此,我们要P1.0输出高电平,只要写SETB P1.0,要P1.0输出低电平,只要写 CLR P1.0就可以了。
有了这么一个构造,我们就可以开始存放数据了,想要放进一个数据12,也就是00001100,我们只要把第二号和第三号小格子里存满电荷,而其它小格子里的电荷给放掉就行了(看图3)。可是问题出来了,看图2,一个存储器有好多单元,线是并联的,在放入电荷的时候,会将电荷放入所有的单元中,而释放电荷的时候,会把每个单元中的电荷都放掉,这样的话,不管存储器有多少个单元,都只能放同一个数,这当然不是我们所希望的,因此,要在结构上稍作变化,看图2,在每个单元上有个控制线,我想要把数据放进哪个单元,就给一个信号这个单元的控制线,这个控制线就把开关打开,这样电荷就可以自由流动了,而其它单元控制线上没有信号,所以开关不打开,不会受到影响,这样,只要控制不同单元的控制线,就可以向各单元写入不同的数据了,同样,如果要某个单元中取数据,也只要打开相应的控制开关就行了。
现在我们已经有办法让计算机去将P10输出高或低电平了,但是我们怎样才能计算机执行这条指令呢?总不能也对计算机也说一声了事吧。要解决这个问题,还得有几步要走。第一,计算机看不懂SETB CLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算机去读。计算机能懂什么呢?它只懂一样东西——数字。因此我们得把SETB P1.0变为(D2H,90H ),把CLR P1.0变为 (C2H,90H ),至于为什么是这两个数字,这也是由51芯片的设计者--INTEL规定的,我们不去研究。第二步,在得到这两个数字后,怎样让这两个数字进入单片机的内部呢?这要借助于一个硬件工具"编程器"。

单片机编程复习题c语言

单片机编程复习题c语言

单片机编程复习题c语言单片机编程复习题C语言单片机编程是电子工程领域中的一项重要技能,它涉及到嵌入式系统的开发和控制。

C语言是单片机编程中常用的编程语言之一。

本文将通过一些复习题来帮助读者回顾和巩固单片机编程中的C语言知识。

1. 请编写一个C语言函数,用于计算给定数组中的最大值。

```cint findMax(int arr[], int size) {int max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max) {max = arr[i];}}return max;}```2. 请编写一个C语言函数,用于计算给定数组中的平均值。

```cfloat calculateAverage(int arr[], int size) {int sum = 0;for (int i = 0; i < size; i++) {}return (float)sum / size;}```3. 请编写一个C语言函数,用于将给定的字符串反转。

```cvoid reverseString(char str[]) {int length = strlen(str);for (int i = 0; i < length / 2; i++) {char temp = str[i];str[i] = str[length - i - 1];str[length - i - 1] = temp;}}```4. 请编写一个C语言函数,用于判断给定的字符串是否为回文字符串。

```cint isPalindrome(char str[]) {int length = strlen(str);for (int i = 0; i < length / 2; i++) {if (str[i] != str[length - i - 1]) {}}return 1;}```5. 请编写一个C语言函数,用于将给定的十进制数转换为二进制数。

单片机原理及应用(C51编程)

单片机原理及应用(C51编程)
02
C51语言继承了标准C语言的语法和结构,同时针对单片机的 特性进行了一些扩展和优化。
03
C51语言支持结构化编程、模块化设计和可重用性,使得程序 更加清晰、易于维护和调试。
C51编程的基本语法
变量声明
C51语言支持多种类型的变量声明,包括整 型、浮点型、字符型等。
条件语句
使用if、else if、else等关键字实现条件判断 和选择执行。
位域
用于表示二进制位,可以用来存储状 态信息或控制位。
C51编程的运算符与表达式
算术运算符
包括加、减、乘、除等基本算术运算。
逻辑运算符
包括与、或、非等逻辑运算,用于实现条 件判断。
位运算符
赋值ห้องสมุดไป่ตู้算符
包括位与、位或、位异或等位运算,可以 用于控制硬件位操作。
包括赋值、自增、自减等赋值运算,用于 修改变量值。
02
单片机具有强大的控制功能,能够实现各种数字信号处理和控制,广泛应用于 工业自动化控制、智能家居、智能仪表等领域。
03
单片机编程语言主要有汇编语言和C语言,其中C语言编程具有易学易用、可读 性强、可移植性好等优点,被广泛应用于单片机开发。
单片机的应用领域
工业自动化控制
01
单片机能够实现各种传感器数据的采集、处理和控制,广泛应
延时函数
在程序中实现一个延时函数,用于控制LED灯的闪烁频率。
按键输入的实现
硬件连接
将按键的一端连接到单片机的某个I/O口,另一端 接地。
编程实现
使用C51编程语言,通过检测I/O口的电平变化来 判断按键是否被按下。
去抖动
为了消除按键抖动对程序的影响,可以在程序中 实现去抖动算法。

单片机编程基础知识

单片机编程基础知识

单片机编程基础知识包括以下几个方面:
了解单片机的体系结构:单片机是一种在一个芯片上集成了处理器、存储器、输入/输出(I/O)端口和其他外设的微型计算机系统。

需要了解单片机的中央处理器CPU,程序存储器ROM,数据存储器RAM和外设等基本组成。

学习汇编语言:单片机的编程语言通常使用汇编语言,这是一种低级的、与硬件密切相关的编程语言。

掌握单片机的编程工具:单片机编程通常需要使用特定的编程工具,例如编程器和调试器。

学会使用这些工具,可以帮助将编写的程序下载到单片机中,并进行调试和测试。

理解输入/输出(I/O)编程:单片机的主要任务是通过输入/输出(I/O)端口与外部设备进行通信。

理解时钟和定时器编程:时钟和定时器是单片机中重要的时序控制器,用于生成时序和定时的信号。

学习存储器编程:单片机通常包含多种类型的存储器,如RAM、ROM、EEPROM等,用于存储程序和数据。

学习中断:中断能加强CPU对多任务事件的处理能力。

引起中断的事件称为中断源。

此外,在学习过程中还需要注意实践和耐心,不要怕失败,多试多练才能更好地掌握单片机编程技能。

单片机编程入门

单片机编程入门

单片机编程入门随着科技的发展,单片机已经成为了现代电子设备中不可或缺的一部分。

单片机具有体积小、功耗低、功能强大等特点,广泛应用于家电、汽车、通信等领域。

而作为入门级的单片机编程对于初学者来说可能会感到有些困惑,本文将为大家介绍单片机编程的基础知识和入门方法。

一、单片机的基础知识1. 什么是单片机单片机是一种集成了微处理器、存储器和输入输出设备等功能于一体的微型计算机系统。

它由CPU、RAM、ROM、IO等基本部件组成,具有独立完成特定任务的能力。

2. 常见的单片机类型常见的单片机类型有AVR、8051、PIC等。

不同的单片机具有不同的指令集和架构,因此在学习单片机编程时需要选择合适的单片机型号。

3. 单片机编程语言常用的单片机编程语言有汇编语言和高级语言。

汇编语言是一种低级语言,与单片机的指令集密切相关,需要直接操作寄存器和内存。

高级语言如C语言则更加易于编写和理解,可以通过编译器将代码转化成汇编语言或机器码进行执行。

二、单片机编程入门步骤1. 准备工作在开始单片机编程之前,需要准备好以下工具:- 单片机开发板:用于连接单片机及外部设备的主板。

- 开发软件:如Keil、IAR等常用的单片机开发平台。

2. 学习基本知识在进行实际编程前,了解并掌握一些基本知识是必要的:- 单片机的GPIO口:GPIO口是单片机提供给外部设备进行输入输出的管脚,需要了解各个引脚的功能和使用方法。

- 寄存器操作:学习如何使用寄存器来配置单片机的各项参数。

- 中断:了解并学习单片机中断的原理和使用方法。

3. 编写第一个程序在学习了基本知识后,可以尝试编写第一个单片机程序:```#include <reg51.h>void main() {while(1) { // 无限循环P0 = 0x55; // 将P0口的值设置为0x55}}```以上是一个8051单片机的简单程序,它将P0的值设置为0x55,然后进入无限循环。

单片机编程题整理

单片机编程题整理

1.试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。

若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。

START:MOV R0,#30HMOV R2,#20HLOOP: MOV A,@R0CJNE A,#0AAH,NEXTMOV 51H,#01HLJMP EXITNEXT: INC R0DJNZ R2,LOOPMOV 51H,#00HEXIT: RET2. 试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H 单元。

START: MOV 41H,#0MOV R0,#20HMOV R2,#20HLOOP: MOV A,@R0JNZ NEXTINC 41HNEXT: INC R0DJNZ R2,LOOPRET 3. 一批单字节无符号数,以R0为首地址,R2中为字节数,将这批数进行升序排列。

SORT: MOV A,R0MOV R1,AMOV A,R2MOV R5,ACLR F0DEC R5MOV A,@R1LOOP: MOV R3,AINC R1CLR CMOV A,@R1SUBB A,R3JNC LOOP1SETB F0MOV A,R3XCH A,@R1DEC R1XCH A,@R1INC R1LOOP1: MOV A,@R1DJNZ R5,LOOPJB F0,SORTRET4. 以AT89S51为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。

测得的不同温度下的电压值数据构成一个表,表中温度值为y(双字节无符号数),x(双字节无符号数)为电压值数据。

设测得电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。

LTB2:MOVDPTR,#TAB2MOV A,R3CLRCRLCAMOVR3,AXCHA,R2RLCAXCHR2,AADDA,DPLMOVDPL,AMOV A,DPHADDC A,R2MOVDPH,ACLRAOVC A,@A+DPTRMOVR2,ACLRAINCDPTRMOVC A,@A+DPTRMOVR3,ARETTAB2:DW…,… ,…5. 片内RAM中存放一批数据,查找出最大值并存放于首地址中。

单片机编程基础知识(提交版).doc

单片机编程基础知识(提交版).doc

基础知识:51单片机编程基础单片机的外部结构:1. DIP40双列直插;2. PO, P1, P2, P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3. 电源VCC (PIN40)和地线GMD (PIN20);4. 高电平复位RESET (PIN9) ;(10uF电容接VCC RESET,即可实现上电复位)5. 内置振荡电路,外部只要接晶体至X1 (PIN18)和XO (PIN19);(频率为主频的12倍)6. 程序配置EA (RN31)接高电平VCC;(运行单片机内部ROM中的程序)7. P3 支持第二功能:RXD、TXD、INTO、INT1、TO、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1.四个8位通用I/O端口,对应引脚PO、P1、P2和P3;2.两个16 位定时计数器;(TMOD, TCON, TLO, THO, TL1, TH1)3.一个串行通信接口;(SCON, SBUF)4.一个中断控制器;(IE, IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端曰的定义。

C语言编程基础:1. 十六进制表示字节0x5a:二进制为0101101 OB; 0x6E为01101110。

2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。

3. + + var表示对变量var先增一;var—表示对变量后减一。

4. x |= OxOf;表示为x = x | OxOf;5. TMOD = (TMOD & OxfO ) | 0x05;表示给变量TMOD的低四位赋仙0x5,而不改变TMOD的高四位。

6. While( 1 );表示无限执行该语句,即死循环。

语句后的分号表示空循环体,也就是(;}在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)代码1.#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.32 . void main ( void ) //void表示没右输入参数,也没有函数返值,这入单片机运行的复位入口3.(4.Pl_3 = 1; //给Pl_3赋值1,引脚P1.3就能输出高电平VCC5.While ( 1 ) ; //死循环,相当LOOP: goto LOOP;6.}注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至V8电源。

单片机编成要点

单片机编成要点

rst/rபைடு நூலகம்可省
模块 子模块 8位跑马灯
编程要点 低电平亮 先数据(P0),后上升脉冲写(WR)与上升脉冲位选CS2, 8位数码管 最后上升脉冲写(WR)与上升脉冲段选CS1 先行数据(P0),ROW0/1下降脉冲行选,再片数据(P0),COL0/1/2/3下 16x32点阵LED屏 降脉冲片选,逐行扫描完4片(每行隔0.5ms,每屏清一次)横向取模
RS低指令高数据,低电平写,能(E)读高电平;能(E)写下降脉冲,CS1 高电平左,CS2高电平右,RST上升脉冲复位 显示 1、初始化(复位,显示关/开,清屏),2、开左半屏,置页\行\列,P0=显示 模块 128x64绘图液晶显示屏 字符;3、开右半屏,置页\行\列,P0=显示字符(纵向取模) 相关命令:显示关/开0x3e/3f,置页0XB8/每页8x64点,置行 0XC0,置列0X40,{读忙0x80(P0^7)或复位0x10(P0^4)K可不判断} RS低指令高数据,低电平写(RW),能(E)读高电平;能(E)写下降脉冲 步骤:1、初始化,2、设位置,3、显示字符(P0,位置自动往后) 1602字符型液晶显示屏 命令(P0):1、置功能0x38,2、显示关0x08,3、清显示0x01,4、 显示开x0c,5、设位置0x80+n/0xC0+n 6、读忙0x80(P0^7) 为了以后的模块综合,使用后应该片选离开
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、试编写程序,计算Y=ai的平方连加ORG 8000HMAIN: MOV R0, #20H ;置数据指针MOV R7, #10 ;置计数初值MOV R3, #0 ;结果单元清零MOV R2, #0LOOP: MOV A, @R0 ;取数ACALL SORT ;调用求平方子程序ADD A, R2 ;累加平方和MOV R2, AADDC A, #0 ;加进位CyINC R0 ;修改指针DJNZ R7, LOOP ;未完,继续SJMP ENSORT: MOV DPTR, #TAB ;进入子程序查平方表MOVC A, @A+DPTRRET ;返主程序TAB: DB 0, 1, 4, 9, 16DB 25, 36, 49, 64, 81 EN: NOPEND2、设有50个用ASCII码表示的16进制数存放在内部RAM以30H为首址的连续单元中。

要求将其转换成相应的16进制数并存放到外部RAM以4100H为首址的25个连续单元中。

根据上述要求,使用堆栈传递参数的方法编写程序。

ORG 4000HMAIASH: MOV R0, #2FH ;置取数指针R0初值,从30H开始MOV DPTR, #40FFH ;置数据指针DPTRMOV SP, #20H ;置堆栈指针SP初值MOV R2, #19H ;置循环计数器R2初值为25 NELOOP: INC R0;修改R0 INC DPTR ;修改DPTR指下一个MOV A, @R0 ;取被转换的ASCII码并压入堆栈PUSH ACCACALL SUBASH ;调用SUBASH子程序POP 1FH ;相应的16进制数送1FH单元INC R0 ;修改R0MOV A, @R0 ;取被转换的ASCII码并压入堆栈PUSH ACCACALL SUBASH ;调用SUBASH子程序POP ACC ;相应的16进制数送ASWAP A ;作为高4位ORL A, 1FH ;合成两位16进制数MOVX @DPTR, A ;送存数单元DJNZ R2, NELOOP ;转换结束否?若未完,则继续SJMP ENSUBASH: MOV R0, SP ;SP值不能改变,否则不能正确返回DEC R0DEC R0XCH A, @R0 ;从堆栈取出被转换的数送ACLR CSUBB A, #3AH ;为0~9的ASCII码否?小于3AH?共减30HJC ASCDTG ;若是小于,则转ASCDTGSUBB A, #07H ;若否,则再减去7,(A)-3AH-7H+0AH=(A)-37H ASCDTG: ADD A, #0AH ;转换成16进制数,XCH A, @R0 ;转换后的16进制数压入堆栈RETEN: NOPEND3将内部RAM的20H单元中的1字节16进制数转换为两位ASCII码,存放在30H和31H两个单元中。

ORG 8000HMAIN: MOV SP, #40H ;建立堆栈指针MOV R0, #30H ;置结果单元指针MOV A, 20H ;将1字节16进制数的地址送A SWAP A ;1字节16进制数高、低4位交换PUSH ACC ;参数压栈ACALL HEASC ;调转换子程序HEASCPOP ACC ;弹出结果MOV @R0, A ;存高位16进制数转换结果INC R0 ;修改指针PUSH 20H ;参数压栈ACALL HEASC ;调转换子程序HEASCPOP ACC ;弹出结果MOV @R0, A ;存低位16进制数转换结果SJMP ENHEASC: MOV R1, SP ;堆栈指针送R1DEC R1DEC R1;R1指向被转换数据XCH A, @R1;取被转换数据ANL A, #0FH ;取一位16进制数ADD A, #2;修正ASCII码表的首地址 MOVC A, @A+PC ;查表取对应的ASCII码XCH A, @R1;结果存放在堆栈区RET ;取出断点,返主程序ASCTAB: DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37HDB 38H, 39H, 40H, 41H, 42H, 43H, 44H, 45H EN: NOPEND MAIN 1、访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。

答:访问外部数据存储器可以用以下指令实现:MOVX A, @Ri ;((Ri))→A,寄存器Ri指向的片外RAM地址中的内容送到累加器A中MOVX @Ri, A ;A→((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中MOVX A, @DPTR ; ((DPTR))→A,数据指针指向的片外RAM地址中的内容送到累加器A中MOVX @DPTR, A ; A→((DPTR)),累加器中内容送到数据指针指向的片外RAM地址中访问程序存储器可以用以下指令实现:MOVC A, @A+DPTR ;((A+DPTR))→A,表格地址单元中的内容送到累加器A中MOVC A, @A+PC ;PC+1→PC,((A+PC))→A,表格地址单元中的内容送到累2、写出实现下列要求的指令或程序片段。

(1) 将R0的内容传送到R1;(2) 内部RAM的20H单元内容传送到寄存器R1;(3) 内部RAM的20H单元的D7和D3位清零,其它位保持不变;(4) 外部RAM的1000H单元内容传送到内部RAM的60H单元中;(5) 外部RAM的1000H单元内容传送到寄存器R2;(6) 清除累加器高4位。

答:(1)MOV A, R0MOV R1, A(2)MOV R1, 20H(3)MOV A, 20HANL A, #77H(4)MOV DPTR, #1000HMOVX A, @DPTRMOV 60H, A(5)MOV DPTR, #1000HMOVX A, @DPTRMOV R2, A(6)ANL A, #0FH加器A中3、试编写—段程序,将R3中的数乘4(用移位指令)。

答: MOV A, R3MOV 23H, #02HL0: DJNZ 23H, L1L1: RL ASJMP L04、试编写—段程序,将R2中的各位倒序排列后送入R3中。

答: MOV A, R2MOV 23H, #08HL0: DJNZ 23H, L1L1: RL ASJMP L0MOV R3, A5、编写程序,将片内30H~39H单元中的内容送到以2000H为首的外部存储器。

答: ORG 0000HSTART: MOV R0, #30HMOV DPTR, #2000HMOV R1, #10CLR ALOOP: MOV A, @R0MOVX @DPTR, ADEC R1DJNZ R1, LOOPEND6、某系统有三个外部中断源1、2、3,当某一中断源变低电平时便要求CPU处理,它们的优先处理次序由高到低为3、2、1,处理程序的入口地址分别为2000H、2100H、2200H。

试编写主程序及中断服务程序(转至相应的入口即可)。

答:对系统的三个外中断源,可利用MCS-51 的 2 个外中断源 INT0 和INTI,再将定时/计数器 T1 作为扩展的外部中断使用,INT0 接外中断源 3,INTI 接外中断源 2,定时/计数器 T1 接外中断源 1,3 个中断源设置为同级中断,外中断源 1、2、3 依次接到 P1.0、P1.1、P1.2上。

汇编语言程序代码如下:ORG 0000H ;复位入口地址AJMP MAIN ;转主程序ORG 0003HAJMP INT1ORG 0100HMAIN: MOV TMOD, #60H ;T1方式2MOV TH1, #0FFHMOV TL1, #0FFH ;置初值SETB TR1 ;启动计数器T1SETB EA ;CPU中断开放SETB ET1 ;允许T1中断SETB IT0 ;允许外中断0产生中断SETB IT1SETB PX0 ;外中断0为高级中断SETB PX1SETB PT1SETB IT0 ;外中断0为跳沿触发方式SETB IT1LOOP1: SJMP LOOP1 ;等待中断;中断服务程序 ORG 1000HINT1: PUSH PSW ;保护现场PUSH ACCJB P1.0,IR1 ;P1.0高,外中断1有请求JB P1.1,IR2 ;P1.1高,外中断2有请求JB P1.2,IR3 ;P1.2高,外中断3有请求INTIR: POP ACC ;恢复现场POP PSWRETI ;中断返回ORG 2000HIR1: …… ;外中断1的中断处理程序AJMP INTIRORG 2100HIR2: …… ;外中断2的中断处理程序AJMP INTIRORG 2200HIR3: …… ;外中断3的中断处理程序AJMP INTIREND10、编程将片内35H~55H单元中的内容送入到以3000H为首的存储区中。

M: MOV R0,#35HMOV R1,#21HMOV DPTR,#3000HLOOP:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R1,LOOPRET12、从20H单元开始有一无符号数据块,其长度在20H单元中,求出数据块中最小值,并存入21H单元。

MIN: MOV R0,#21HMOV R2,#20HMOV A,R2MOV R1,ADEC R2MOV A,@R1LP0: MOV R3,AINC R1CLR CSUBB A,@R1JC LP1MOV A,@R1LP1: MOV A,R3LP2: DJNZ R2,LP0MOV @R0,ARET1、阅读下列程序并回答问题ORG 0000HMOV R0,#32HMOV R2,#00HLOOP: MOV A,@R0CJNE A,#00H,DON INC R2DON: INC R0DJNZ 31H,LOOPMOV 30H,R2SJMP $END(1)说明该程序的功能。

统计以32H开始单元中存放的数据中0的个数,并把个数值放到30H 单元(2分)(2)31H中存放的是(待统计数据的总个数),R2是用来存放(0的个数)的计数器。

(3)执行程序后31H中的值为(1 111.数据块求和.设有20个单字节数,存放在片内RAM从30H开始的单元,求累加和(双字节),将结果存放在60H,61H单元(高位字节在高地址,低位字节在低地址)。

1.ORG 2000HSTART :MOV R0, #30HMOV R7, #20MOV 60H,#00HMOV 61H,#00HLOOP : MOV A, @R0ADD A, 60HMOV 60H,AJNC NEXTINC 61HNEXT : INC R0DJNZ R7,LOOPSJMP $END1. 阅读下面子程序,说明它实现的功能。

相关文档
最新文档