山东建筑大学机电学院单片机30个程序

合集下载

山东建筑大学电气工程及其自动化专业2020-2021第二学期单片机测试

山东建筑大学电气工程及其自动化专业2020-2021第二学期单片机测试

山东建筑大学电气工程及其自动化专业2020-2021第二学期单片机测试1. 单片机的CPU主要由()组成的。

[单选题] *A.运算器,控制器(正确答案)B.加法器,寄存器C.运算器,加法器D.运算器,译码器2. 51单片机中的程序计数器PC用来()。

[单选题] *A.存放指令B.存放正在执行的指令地址C.存放下一条指令地址(正确答案)D.存放上一条指令地址3. 51单片机上电复位后,PC的内容为()。

[单选题] *A.0000H(正确答案)B.0003HC.000BHD.0800H4. 程序是以()形式存放在程序存储器中的。

[单选题] *A.C语言源程序B.汇编程序C.机器码(正确答案)D.BCD码5. 51单片机的程序计数器PC为16位计数器,其寻址范围是()。

[单选题] *A.8KBB.16KBC.32KBD.64KB(正确答案)6. 51单片机的4个并行I/O端口作为通用I/O端口使用,在输出数据时,必须外接上拉电阻的是()。

[单选题] *A.P0口(正确答案)B.P1口C.P2口D.P3口7. 当51单片机应用系统需要扩展外部存储器或其他接口芯片时,()可作为低8位地址总线使用。

[单选题] *A.P0口(正确答案)B.P1口C.P2口D.P0口和P2口8. 当51单片机应用系统需要扩展外部存储器或其他接口芯片时,()可作为高8位地址总线使用。

[单选题] *A.P0口B.P1口C.P2口(正确答案)D.P0口和P2口9. 当51单片机应用系统需要扩展外部存储器或其他接口芯片时,()可作为数据总线使用。

[单选题] *A.P0口(正确答案)B.P1口C.P2口D.P0口和P2口10. 51单片机的定时器T1用做定时方式时是()。

[单选题] *A.对内部时钟频率计数,一个时钟周期加1B.对内部时钟频率计数,一个机器周期加1(正确答案)C.对外部时钟频率计数,一个时钟周期加1D.对外部时钟频率计数,一个机器周期加111. 51单片机的定时器T1用做计数方式时计数脉冲是()。

山东建筑大学单片机原理及应用考试题试卷大全

山东建筑大学单片机原理及应用考试题试卷大全

单片机模拟试卷001一、选择题(每题1分,共10分)1.8031单片机的( D )口的引脚,还具有外中断、串行通信等第二功能。

a)P0 b)P1 c)P2 d)P32.单片机应用程序一般存放在( B )a)RAM b)ROM c)寄存器 d)CPU3.已知某数的BCD码为0111 0101 0100 0010 则其表示的十进制数值为(B )a)7542H b)7542 c)75.42H d)75.424.下列指令中不影响标志位CY的指令有(D )。

a)ADD A,20H b)CLR c)RRC A d)INC A5.CPU主要的组成部部分为( A )a)运算器、控制器 b)加法器、寄存器c)运算器、寄存器 d)运算器、指令译码器6.INTEL 8051 CPU是( C )位的单片机a)16 b)4 c)8 d)准167.8031复位后,PC与SP的值为(B )a )0000H,00H b)0000H,07H c)0003H,07H d)0800H,00H8.当需要从MCS-51单片机程序存储器取数据时,采用的指令为(B)。

a)MOV A, @R1 b)MOVC A, @A + DPTRc)MOVX A, @ R0 d)MOVX A, @ DPTR9.8031单片机中既可位寻址又可字节寻址的单元是(A )a)20H b)30H c)00H d)70H10.下列哪条指令是正确的( D )a)PUSH R2 b)ADD R0,Ac)MOVX A @DPTR d)MOV @R0,A二、填空题(每空1分,共30分)1.一个完整的微机系统由硬件和软件两大部分组成。

2.8051 的引脚RST是IN脚(IN脚还是OUT脚),当其端出现高电平时,8051进入复位状态。

8051一直维持这个值,直到RST脚收到低电平,8051才脱离复位状态,进入程序运行状态,从ROM 0000H单元开始取指令并翻译和执行。

3.半导体存储器分成两大类:RAM ROM,其中RAM具有易失性,常用于存储临时性数据。

山大单片机实验

山大单片机实验

单片机实验报告孙洪悦2011实验1:汇编程序实验1自我完成实验(1)实验内容将片内RAM 30H 单元中的8 位二进制数转换成10 进制数。

希望转换后的结果保存于31H和32H,31H 低 4 位存放个位,高 4 位存放十位,32H 低 4 位存放百位,高 4 位为0自我完成实验程序ORG 0000H!AJMP MAINORG 0030HMAIN:MOV SP,#62H ;MOV 30H,#0AFH ;先将30H写上100MOV R0,#32H ;将百位地址送R0MOV A,30H ;这句写错了,应该是将30H的内容送给A,而不是30H,我误写成了#30HMOV B,#64H ;除数为100DIV AB ;AB相除…MOV @R0,A ;将百位的数送给32H地址MOV A,B ;将余数送给AMOV B,#0AH ;将10送BDIV AB ;AB相除SWAP A ;高低四位交换DEC R0 ;R0减1 到31HMOV @R0,A ;将十位送31H的高四位MOV A,BANL A,#0FHORL 31H,A ;31高低四位分别存十和百位~SJMP $END总结与提高:本程序用了一个小算法,一个三位数数X除以100,商a为百位,余数为:X-100*a 再用此余数除10,商为十位,余数为个位。

实验2:汇编程序实验2自我完成实验(1)实验内容:将片内RAM 30H 开始的32 个单元中分布着随机的有符号8 位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到30H 开始的32 个单元中(低地址存放小数据)。

程序及其注释②自我完成实验程序第一种排序方法:ORG 0000HAJMP MAINORG 0090H:MAIN:MOV SP,#62H ;MOV A,#0HMOV R1,#30HMOV R7,#20HMOV DPTR,#TABLEMOV R0,#1FH ;执行31次LOOP1:MOVC A,@A+DPTR}MOV @R1,AINC R1INC DPTRMOV A,#0HDJNZ R7,LOOP1 ;执行32次循环,在30-4F写表格数据LOOP2: MOV R1,#30H ;将起始地址给R1MOV A,R0 ;R0为执行31次MOV R2,A ;把进行一次冒泡的次数存到R2中|LOOP3:CLR C ;清CMOV A,@R1 ;;比较开始,取第一个数MOV R3,A ; 腾出累加器INC R1 ;指向下一个地址SUBB A,@R1 ;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JC LOOP4 ;前一个数小的情况下,两个数交换位置,否则,继续执行MOV A,R3 ;把后一个数存到累加器下XCH A,@R1 ;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交【DEC R1 ;R1自减,准备将后面的数存到前面MOV @R1,A ;将后面的数存到前面INC R1 ;R1自增,准备下次转换,以上五行为交换LOOP4: DJNZ R2,LOOP3 ;R2自减,为下次冒泡准备DJNZ R0,LOOP2 ;跳回去进行下一轮冒泡SJMP $·ORG 30HTABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69END第二种排序方法;!ORG 0000HAJMP MAINORG 0090HMAIN:MOV SP,#62H ;MOV A,#0HMOV R1,#30HMOV R7,#20HMOV DPTR,#TABLEMOV R0,#1FH ;执行31次(LOOP1:MOVC A,@A+DPTRMOV @R1,AINC R1INC DPTRMOV A,#0HDJNZ R7,LOOP1 ;执行32次循环,在30-4F写表格数据…LOOP2: MOV R1,#30H ;将起始地址给R1MOV A,R0 ;R0为执行31次MOV R2,A ;把进行一次冒泡的次数存到R2中MOV R4,#30H ;R4存的是最大数的位置LOOP3:CLR C ;清CMOV A,@R1 ;;比较开始,取第一个数MOV R3,A ; 腾出累加器INC R1 ;指向下一个地址、MOV A,@R4SUBB A,@R1 ;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JC LOOP4 ;前一个数小的情况下,两个数交换位置,否则,继续执行;MOV A,R3 ;把后一个数存到累加器下;XCH A,@R1 ;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交;DEC R1 ;R1自减,准备将后面的数存到前面;MOV @R1,A ;将后面的数存到前面;INC R1 ;R1自增,准备下次转换,以上五行为交换>DJNZ R2,LOOP3 ;R2自减,为下次冒泡准备LOOP4:MOV A,R1 ;MOV R4,ADJNZ R2,LOOP3DJNZ R0,LOOP2 ;跳回去进行下一轮冒泡SJMP $#ORG 30HTABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69END.总结与提高:所谓冒泡法,有两种理解方式:1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。

单片机编程100例

单片机编程100例

单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#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(); //延时一段时间}}*实例6:将 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口}}*实例7:用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的灯被熄灭 } *实例8:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;n=71;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=11000000B,P3.1,P3.6,P3.7口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例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: //缺省值,关闭所有LED P0=0xff; }*实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件 sbitsound=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 codeTab[ ]={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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned charp[ ]={&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 charTab[ ]={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 codeTab[ ]={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 codeTab[ ]={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 codeTab[ ]={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 codeTab[]={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 byDS18B20";//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<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位后再赋给P3 delay(); //调用延时函数}}*实例37:标准函数stdlib.h应用举例#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引脚/ 函数功能:主函数{// 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引脚/ 函数功能:主函数{// 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引脚/ 函数功能:主函数{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开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器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的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(1)//无限循环等待中断;}/ 函数功能:定时器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。

山东建筑大学PLC课件 (6)

山东建筑大学PLC课件 (6)

山东建筑大学
《电气控制与PLC》 范文利 2012
一、CPM1A的数据移位指令 8. 算术右移位指令ASR(26)/ @ASR(26) 格式:ASR D 符号:
D:移位通道。取值范围IR、SR、HR、AR、LR、DM、*DM。 功能:每执行一次ASR指令,将D通道中的数据按位右移一位 ,最低位移到CY中,0移进最高位。
二、CPM1A的数据转换指令
2. 二进制数→BCD码转换指令BCD(24)/ @BCD(24)
格式:BCD S 符号: D S:源通道。内容为二进制数,取值范围IR、SR、HR、AR、LR、 DM、*DM。 D:结果通道。取值范围同S。 功能:将S中的二进制数转换成BCD码 (S中的内容保持不变)并存入D中。
山东建筑大学
《电气控制与PLC》 范文利 2012
一、CPM1A的数据移位指令 2.可逆移位寄存器指令SFTR(84)/ @SFTR(84) SFTR指令执行条件为ON时,则 (1) 若控制通道C的bit15位(复位端)为1,D1到D2通道中的所有 数据及进位位CY(25504)全部清为0,且不接收输入数据。 (2) 控制通道C的bitl5为0时,在移位脉冲bit14位的作用下,根据 C的bit12位的状态进行左移或右移。左移:从D1到D2通道的所有数 据,每个移位脉冲依次左移一位,C的bit13的数据移入开始通道D1 的最低位中,结束通道D2的最高位数据移入进位位CY中。右移:从 D1到D2通道的所有数据,每个移位脉冲依次右移一位,C的bit13的 数据移入结束通道D2的最高位中,开始通道D1的最低位的数据移入 进位位CY中。 SFTR指令执行条件为OFF时,停止移位,此时复位信号(C的 bitl5)若为1,D1到D2通道中的数据及进位位CY保持原状态不变。

山东建筑大学复习重点单片机讲述

山东建筑大学复习重点单片机讲述

与口相关7个 P0,P1,P2,P3 SBUF SCON PCON
与定时/计数器相关6个 TH0,TL0 TH1,TL1 TMOD TCON
2020/3/3
4
8. 并行口的负载能力(AT89S52) 每根口线最大可吸收10mA的(灌)电流 P0口吸收电流的总和不能超过26mA P1、P2和P3每个口吸收电流的总和限制在15mA 4个口所有口线的吸收电流总和限制在71mA
2020/3/3
1
第2章 80C51的结构和原理
1.MCS-51系列带有字母“C”为CHMOS芯片,否则HMOS 工艺,基本型与增强型区别(ROM RAM TIMER INT) 2.8051进行总线扩展时,使用锁存器(373、573)扩 展P0口为地址低8位,使用P2口作为地址高8位。 AT89S2051没有P0口和P2口 3. 1个机器周期等于12个晶振周期;一个指令周期 包括(单、双、四机器周期) 4.开关闭合与断开时的抖动及去抖电路
立即寻址
MOV A,#50H
变址寻址
MOV A,@A+DPTR
相对寻址
JC rel
位寻址
MOV C,00H
2020/3/3
6
3.数据传送指令
16位传送:MOV DPTR,#data16; DPTR← data16
8位传送
Rn MOV A ,@dirReci t
# data
A MOV direct,dRinrect1
总结:四个口都是准双向口,读入时先写1 P0作通用I/O需外部上拉
2020/3/3
5
第3章 80C51的指令系统
1.机器指令的长度:单字节 双字节 三字节 周期:单机器 双机器 四机器(乘除)

山东建筑大学机电学院plc实验报告

山东建筑大学机电学院plc实验报告

课题:加工中心轮式刀库控制系统设计一、实验目的通过对一个加工中心刀库的控制程序的设计,熟悉基于PLC的中小型控制系统的设计,掌握其设计方法和设计思路,为今后工作中PLC的应用打下基础。

二、实验要求1、刀库容量为10把(0~9),均匀周向分布于一个轮式刀库中。

2、控制要求:A、初始状态—默认为基准位(0位)在取刀位,取消手动调整部分操作。

B、输入刀号—按清除键后输入取刀号,用刀号按钮按下次数表示取刀号,如取2号刀则按按钮2次,当按下次数超过9次,刀号清零进入下一次循环。

C、取刀路线优化与取刀—输入取刀号后,按下启动按钮,首先依据转角最小的原则判断刀库的转向,然后刀库旋转至被取刀号位对准取刀位停止,并且启动5秒内不接受取刀指令。

D、数码显示—输入刀号时,利用数码管显示刀号;按下启动按钮后数码管即时显示对准取刀位的刀位号。

按清除键时数码管显示0。

E、暂停—取刀过程中按下暂停键,刀库停止旋转,按启动键刀库继续运行。

F、取刀路线优化具有即时功能,既根据刀库现在的位置判断下一次取刀时的转向。

如图:a) b)图1刀库若处于a 图中位置,则此时若取0~4号刀,刀库应正转,若取5~9号刀,刀库应反转。

当刀库处于b 图中位置,则此时若取6~9,0号刀,刀库应正转,若取1~4号刀,刀库应反转。

(x-y)的结果取个位然后判断是否大于5G、自动选刀控制原则指定刀具自动转至换刀位置(取刀口)。

为提高取刀效率,按路径最短原则取刀,即要求换刀时按最小旋转角(≤180º)转动。

“设定取刀号”减去“现值刀号”,如果其值大于5,则确定刀库盘转动的方向为正向,否则反转。

例如:设定取刀号为9,现值刀号为3,则9-3=6> 5,置正转标志(刀库将正转144º);若设定取刀号为6,现值为3,则6-3=3< 5,置反转标志(刀库将反转108º);如果设定取刀号为1,现值为3,则1-3=-2<0,需取补修正,-2+10=8>5,置正转标志(正转72º),由于8>5,经小于半数处理,10-8=2。

机电一体化《单片机原理及应用》山东大学网络教育考试模拟题及问题详解教学文稿

机电一体化《单片机原理及应用》山东大学网络教育考试模拟题及问题详解教学文稿

机电一体化《单片机原理及应用》山东大学网络教育考试模拟题及问题详解教学文稿机电一体化《单片机原理及应用》山东大学网络教育考试模拟题及问题详解《单片机原理及应用》除非特别声明,编程题可以使用汇编语言编写,也可以使用C语言编写1、分析程序的执行结果,将结果填写到空格中。

ORG 0000HMOV 30H,#50HMOV R0,#30HMOV A,@R0 ;(A= 50H )MOV A,#79HMOV B,#20H ;(A= 79H B= 20H )DIV AB ;(A= 03H B= 19H )PUSH BMOV B,#0AHMUL AB ;(A= 1EH B= 00H )POP BADD A,B ;(A= 37H B= 19H )MOV 30H,A ;(30H单元的内容= 37H )MOV 20H,30HCLR 01H ;(20H单元的内容= 37H )MOV A,20H ;(PSW中P的内容= 1 )CPL ARR A ;( PSW中C的内容= 0 )SWAP A ;(A= 46H )ADDC A,#0F0H ;(A= 36H );(PSW中P的内容= 0 )仅供学习与交流,如有侵权请联系网站删除谢谢2;( PSW中C的内容= 1 )RL A ;(A= 6CH );(PSW中P的内容= 0 );( PSW中C的内容= 0 )LOOP: AJMP LOOP2、将MCS51内部RAM60H~65H单元存放的12个16进制数变为ASCII码,放到0090H单元开始的外部RAM中。

[使用汇编语言编写] MAIN:MOV R0,#60HMOV R2,#6MOV DPTR, #0090HHASC:MOV A,@R0ANL A,#0FH ;屏蔽高四位ADD A,#0DHMOVC A,@A+PC ;查表低四位转换为ASCII码MOVX @DPTR,A ;送如外部RAMINC DPTRMOV A,@R0ANL A,#0F0HSWAP AADD A,#6仅供学习与交流,如有侵权请联系网站删除谢谢3MOVC,@A+PC ;高四位转换为ASCII码MOVX @DPTR,AINC R0INC DPTRDJNZ R2,HASCENDASCTAB:DB 30H 31H 32H 33H 34 H 35H 36H 37H 38H 39HDB41H 42H 43H 44H 45H 46H3、某一故障检测系统,当出现故障1时,线路1上出现上升沿;当出现故障2时,线路2上出现下降沿。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机实验30个程序1.两个数比较大小2.LED流水灯3.LED闪烁(利用定时器或者延时)、4.实现流水灯和闪烁的交替出现(利用中断)5.红绿灯(利用延时)6.红绿灯(利用定时器)7.单片机直接驱动单个数码管(0-9)显示8.164驱动2个数码管(0-99)显示9.2个数码管(0-99)显示(动态扫描)利用单片机管脚控制位选10.2个数码管(0-99)显示(动态扫描)利用138位选74hc138(大家可以百度这个芯片进行学习)11.独立式按键识别12.矩阵式按键识别13.13-18题按键与数码管随意组合(创新题目,要求创新控制,根据创新程度给分)19.串行口通信20. 串口+AD(将甲机的AD转换的结果在乙机显示(查询方式)21. 串口+AD(将甲机的AD转换的结果在乙机显示(中断方式)22. 将甲机的按键用(LED显示)并在乙机进行D/A转换23. ADC080824. DAC083225.按键脉冲调制26.步进电机控制27.单片机与PC通信28.LED按键改变数字及秒闪(按键1后LED显示数字开始闪烁,按键2使数字增加,按键3使数字减少)29.甲机发出一定频率的波形让乙机去检测30.4个数码管加一计数考试规则, 1.不允许自带笔记本2.每次10个人考试3.随机抽取电脑以及考试题目4.以上题目分值不公布(5分题一定概率也有难的,请大家全部复习完)1111111111111111111111111111111111111ORG 00HAJMP MAINORG 30HMAIN:MOV 21H,#45HMOV 22H,#46HMOV A,21HCLR CSUBB A,22HJC BIGMOV 23H,21HSJMP LASTBIG: MOV 23H,22HLAST: END;如果需要在数码管上显示出来,请结参考AD转换的DISPLAY和DISLOOP部分。

2222222222222222222222222222222222ORG 00HAJMP MAINORG 30HMAIN:MOV SP,#60HMOV A,#0FEHLOOP:RL AMOV P0,AACALL DELAYSJMP LOOPDELAY:MOV R6,#0HDEL0:MOV R5,#0HDJNZ R5,$DJNZ R6,DEL0RETEND33333333333333333333333333333333333 延时ORG 00HAJMP MAINORG 30HMAIN:MOV P0,#00HACALL DELAYMOV P0,#0FFHACALL DELAYAJMP MAINDELAY:MOV R0,#0HDEL1:MOV R1,#0HDJNZ R1,$DJNZ R0,DEL1RETEND定时ORG 00HAJMP MAINORG 30HMAIN:MOV TMOD,#02HMOV TH0,#00HMOV TL0,#00HMOV A,#00HSETB TR0LOOP:JBC TF0,LOOP1AJMP LOOPLOOP1:CPL AMOV P0,AAJMP LOOPEND 44444444444444444444444444444444 AJMP MAINORG 0003HAJMP INT0ORG 30HMAIN:MOV SP,#60HSETB EASETB EX0SETB IT0MOV A,#0FEHLOOP:RL AMOV P0,AACALL DELAYSJMP LOOPINT0:PUSH P0CLR EAMOV P0,#00HACALL DELAYMOV P0,#0FFHACALL DELAYMOV P0,#00HACALL DELAYMOV P0,#0FFHACALL DELAYSETB EAPOP P0RETIDELAY:MOV R0,#0HDEL1:MOV R1,#0HDJNZ R1,$DJNZ R0,DEL1RETEND777777777777777777777777777ORG 00HAJMP MAINORG 30HMAIN:MOV DPTR,#TABMOV R0,#0LOOP:MOV A,R0MOVC A,@A+DPTRMOV P0,AACALL DELAY1sINC R0CJNE R0,#10,LOOPMOV R0,#0AJMP LOOP;误差0usDELAY1s:MOV R7,#0A7HDL1:MOV R6,#0ABHDL0:MOV R5,#10HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1NOPRETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,080H,90H END8888888888888888888888888 ORG 0000HAJMP MAINORG 30HMAIN:MOV 30H,#0MOV 31H,#0GOON: ACALL DISPLAYACALL DELAYACALL LPAJMP GOONDISPLAY:MOV R0,#30HMOV DPTR,#TABLOOP:MOV A,@R0MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIINC R0CJNE R0,#32H,LOOPRETLP: INC 30HMOV R1,30HCJNE R1,#10,GOMOV 30H,#0INC 31HMOV R1,31HCJNE R1,#10,GOMOV 31H,#0GO:RETDELAY:MOV R3,#0DEL1:MOV R4,#0DJNZ R4,$DJNZ R3,DEL1RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,080H,90H END11111 1111 1111 1111ORG 00HAJMP MAINORG 30HMAIN:KEY1:JB P1.0,KEY2MOV P0,#0C0HACALL DELKEY2:JB P1.1,KEY3MOV P0,#0F9HACALL DELKEY3:JB P1.2,KEY4MOV P0,#0A4HACALL DELKEY4:JB P1.3,KEY1MOV P0,#0B0HACALL DELDEL:MOV R0,#0DEL1:MOV R1,#0DJNZ R1,$DJNZ R0,DEL1RET12 12 12 12 12KEYORG 00HAJMP MAINORG 30HMAIN:MOV DPTR,#TABKEYSCAN:CLR P1.0SETB P1.1JNB P1.4,KEY1JNB P1.7,KEY3SETB P1.0CLR P1.1JNB P1.4,KEY2JNB P1.7,KEY4AJMP GOONKEY1:MOV R0,#1AJMP GOONKEY2:MOV R0,#2AJMP GOONKEY3:MOV R0,#3AJMP GOONKEY4:MOV R0,#4AJMP GOONGOON:ACALL DISPLAYACALL DELAYAJMP KEYSCANDISPLAY:MOV A,R0MOVC A,@A+DPTRMOV P0,ARETDELAY: MOV R7,#0FHDEL1: MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ENDORG 00HMAIN:MOV DPTR,#TAB KEYSCAN:CLR P1.0SETB P1.1JB P1.6,KEY2MOV 30H,#1SJMP DISKEY2:JB P1.7,KEY3MOV 30H,#2SJMP DISKEY3:SETB P1.0CLR P1.1JB P1.6,KEY4MOV 30H,#3SJMP DISKEY4:JB P1.7,DISMOV 30H,#4DIS: ACALL DISPLAYACALL DELSJMP KEYSCANDISPLAY:MOV A,30HMOVC A,@A+DPTRCLR P2.0CLR P2.1SETB P2.2MOV P0,ARETDEL :MOV R7,#0DEL1:MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,080H,90H19U1ORG 0HMAIN:MOV TMOD,#20HMOV TH1,#0FDHMOV TL1,#0FDHMOV SCON,#40HSETB TR1MOV R1,#0 KEYSCAN:JB P1.0,$JNB P1.0,$INC R1CJNE R1,#1,GOON1MOV A,#1MOV SBUF,AJNB TI,$CLR TICLR P0.0SETB P0.3AJMP KEYSCAN GOON1:CJNE R1,#2,GOON2MOV A,#2MOV SBUF,AJNB TI,$CLR TICLR P0.3SETB P0.0AJMP KEYSCAN GOON2:CJNE R1,#3,GOON3MOV A,#3MOV SBUF,AJNB TI,$CLR TICLR P0.0CLR P0.3MOV R1,#0AJMP KEYSCAN GOON3:MOV R1,#0AJMP KEYSCANENDU2ORG 0H MAIN:MOV TMOD,#20HMOV TH1,#0FDHMOV TL1,#0FDHMOV SCON,#50HSETB TR1SCAN:JNB RI,$CLR RIMOV A,SBUFCJNE A,#1,LED2CLR P0.0SETB P0.3AJMP SCAN LED2:CJNE A,#2,LED3SETB P0.0CLR P0.3AJMP SCAN LED3:CJNE A,#3,SCANCLR P0.0CLR P0.3AJMP SCANEND2023ORG 00HMAIN: ACALL DISPLAYACALL AD0808ACALL DELAYSJMP MAINAD0808:MOV A,#0MOV DPTR,#7FF8HMOVX @DPTR,AACALL DELAYMOVX A,@DPTRMOV 40H,ARETDISPLAY:MOV A,40HMOV B,#100DIV ABMOV 32H,AMOV A,BMOV B,#10DIV ABMOV 31H,AMOV 30H,BMOV R0,#30H DISLOOP:MOV DPTR,#TABMOV A,@R0MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIINC R0CJNE R0,#33H,DISLOOPRETDELAY:MOV R7,#0DEL1:MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END26ORG 00HAJMP MAINORG 30HMAIN:CLR P3LOOP:MOV P3,#001HACALL DELAY7MSMOV P3,#002HACALL DELAY7MSMOV P3,#004HACALL DELAY7MSMOV P3,#008HACALL DELAY7MSAJMP LOOPDELAY7MS: ;误差0us MOV R7,#01HDL1:MOV R6,#1AHDL0:MOV R5,#85HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1RET30ORG 0000HAJMP MAINORG 30HMAIN:MOV 30H,#5MOV 31H,#3mov 32H,#2MOV 33H,#6 GOON: ACALL DISPLAYACALL DELAYACALL LPAJMP GOONDISPLAY:MOV R0,#30HMOV DPTR,#TABLOOP:MOV A,@R0MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIINC R0CJNE R0,#34H,LOOPRETLP: INC 30HMOV R1,30HCJNE R1,#10,GOMOV 30H,#0INC 31HMOV R1,31HCJNE R1,#10,GOMOV 31H,#0INC 32HMOV R1,32HCJNE R1,#10,GOMOV 32H,#0INC 33HMOV R1,33HCJNE R1,#10,GOMOV 33H,#0GO:RETDELAY:MOV R3,#0DEL1:MOV R4,#0DJNZ R4,$DJNZ R3,DEL1RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,080H,90H END红路灯ORG 0000HAJMP MAINORG 30HMAIN: MOV P1,#00010001B MOV R4,#50LOP1:ACALL DELAY1S DJNZ R4,LOP1MOV P1,#00100001B MOV R4,#5LOP2: ACALL DELAY1S DJNZ R4,LOP2MOV P1,#00001010B MOV R4,#50LOP3:ACALL DELAY1S DJNZ R4,LOP3MOV P1,#00001100B MOV R4,#5LOP4:ACALL DELAY1S DJNZ R4,LOP4AJMP MAINDELAY1S:MOV R7,#0FFH DEL:MOV R6,#0FFHDJNZ R6,$DJNZ R7,DEL END。

相关文档
最新文档