单片机试验源程序文件
单片机实验 P3.3口输入,P1口输出

实验一P3.3口输入,P1口输出一、实验目的1、掌握P3口、P1口简单使用2、学习Keil,Proteus软件使用二、实验说明本次实验用外中断1的中断方式控制P1口8位LED亮灭状态,即第一次按下S键时,8位LED点亮,再次按下S时,8位LED熄灭,如此循环。
三、实验线路图四、实验步骤1、先建立文件夹“ex1”,然后建立“ex1”工程项目,最后建立源程序文件“ex1.c”,输入如下源程序;/*******************************************实验1:P3.3输入,P1口输出******************************************///用外中断1的中断方式进行数据采集#include<reg51.h>sbit S=P3^3;/*******************************************函数功能:主函数******************************************/void main(void){EA=1;EX1=1;IT1=1;P1=0xff;while(1); //无限循环,防止程序跑飞}/**************************************************************函数功能:外中断T1的中断服务程序**************************************************************/void int1(void) interrupt 2 using 0{P1=~P1;}2、用Proteus软件仿真经过Keil软件编译通过后,可利用Proteus软件仿真。
在Proteus ISIS编辑环境中绘制仿真电路图。
打开配套实验1仿真原理图文件“ex1.DSN”,将编译好的“ex1.hex”文件载入AT89C51。
单片机实验报告

单片机实验报告班级:0911电子信息工程姓名:汪岳学号:2009128147实验1 Keil C51的使用(汇编语言)实验目的:初步掌握Keil C51(汇编语言)和ZY15MCU12BD型综合单片机实验箱的操作和使用,能够输入和运行简单的程序。
实验设备:ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
实验原理及环境:在计算机上已安装Keil C51软件。
这个软件既可以与硬件(ZY15MCU12BD型综合单片机实验箱)连接,在硬件(单片机)上运行程序;也可以不与硬件连接,仅在计算机上以虚拟仿真的方法运行程序。
如果程序有对硬件的驱动,就需要与硬件连接;如果没有硬件动作,仅有软件操作,就可以使用虚拟仿真。
实验内容:1.掌握软件的开发过程:1)建立一个工程项目选择芯片确定选项。
2)加入C 源文件或汇编源文件。
3)用项目管理器生成各种应用文件。
4)检查并修改源文件中的错误。
5)编译连接通过后进行软件模拟仿真。
6)编译连接通过后进行硬件仿真。
2.按以上步骤实现在P1.0输出一个频率为1Hz的方波。
3.在2的基础上,实现同时在P1.0和P1.1上各输出一个频率同为1Hz但电平状态相反的方波。
程序清单ORG 0000HAGAIN:CPL P1.0MOV R0,#10 ;延时0.5秒LOOP1: MOV R1,#100LOOP2: MOV R2,#250DJNZ R2,$DJNZ R1,LOOP2DJNZ R0,LOOP1SJMP AGAINEND第二个实验程序:程序(2)ORG 0000HAGAIN:CPL P1.0MOV C,P1.0CPL CMOV P1.1,CMOV R0,#10 ;延时0.5秒LOOP1: MOV R1,#100LOOP2: MOV R2,#250DJNZ R2,$DJNZ R1,LOOP2DJNZ R0,LOOP1SJMP AGAINEND实验步骤:以下假定你在E:\TEST 文件夹下学习、运行Keil1.建立一个工程项目选择芯片确定选项①Project→②New Project→③输入工程名test→④保存工程文件(鼠标点击保存按钮)弹出下一界面。
置数程序单片机实验报告

(1)创建、保存工程文件在uVision2环境下,选择“FILM/New FILM”选项,工程名为“LL.ASM”(2)在新建film文件中输入附录一置数程序源程序代码(3)MCU 选择在“Select Device for Target”界面,选择Atlmel的AT89C51。
(4)添加源文件“Target 1/Source Group 1”上选择“/Add Files to Group ‘Source Group 1’”添加源程序LL.ASM。
源程序包括“*.C”、“*.ASM”、“*.LIB”、“*.A51”等。
(5)目标硬件系统配置在菜单栏中,选择“Project/Option for Target…”(6)程序编译成功。
(7)编译等无误后,菜单栏中的“Debug”下“/start/stop Debug Session”进行调试。
(8)开始运行。
二.拆字程序(1) 创建、保存工程文件在uVision2环境下,选择“FILM/New FILM”选项,工程名为“AA.ASM”。
(2)在新建film文件中输入附录一拆字程序源程序代码。
(3)新建工程,选择“Project/New Projiect”选项,并保存工程名为”AA.UV2”(4)MCU 选择在“Select Device for Target”界面,选择Atlmel的AT89C51,如拆字程序所示。
(5)添加源文件“Target 1/Source Group 1”上选择“/Add Files to Group ‘Source Group 1’”添加源程序AA.ASM。
(6)目标硬件系统配置在菜单栏中,选择“Project/Option for Target…”,如拆字程序所示。
(7)编译并运行程序。
三、内部、外部RAM数据传送程序1. 内部RAM之间数据传送;(1) 创建、保存工程文件在uVision2环境下,选择“FILM/New FILM”选项,工程名为“NEIBU.ASM”。
Cortex-M4实验指导书-TM4C1294

Cortex-M4实验指导书陈朋 编写浙江工业大学信息工程学院2014.9前言本系列实验适用于单片机初学者。
通过系列实验的训练,学习者可以对单片机程序开发的过程有初步了解,能使用集成开发环境Code Composer Studio进行简单的单片机系统应用开发。
如果想精通单片机,仅仅靠这些实验是不够的,需要在更多的项目实践中训练提高。
实验内容按照由浅入深的顺序组织。
其中实验一和实验二为CCS环境的熟悉与基本使用,实验三至实验六为验证性实验,实验七至实验十二为设计性实验,实验十三为综合性实验。
教师可以根据课时进行全部实验或者选做其中部分。
指导书中所使用的实验扩展板是浙江工业大学设计的,核心板为TI公司制造的,型号为EK-TM4C1294XL。
开发软件环境为Code Composer Studio IDE 6.0以上。
实验注意事项1、实验前请做好预习,熟悉实验任务,了解所用仪器的使用方法和注意事项。
2、实验过程中,设备接通电源前,必须确认接线无误。
如实验中需更改接线,必须切断相关设备的电源后才能操作。
3、做实验时若发生异常现象(例如,元件发烫、有异味或冒烟等),应立即关断电源,保持现场,报告指导老师。
排除故障后,须经指导老师同意,才能继续实验。
4、实验操作完成后请关闭仪器设备电源,并将仪器设备按放回规定位置。
报告指导老师,经同意后可以离开。
5、实验后按照实验要求提交电子稿或者纸质实验报告。
抄袭者不得分。
目录前 言 (i)实验注意事项 (ii)目 录 (iii)实验一 GPIO接口实验 (4)实验二 矩阵按键操作实验 (14)实验三 PWM呼吸灯实验 (18)实验四 中断实验 (23)实验五 I2C编程及应用 (26)实验六 ADC操作实验 (32)实验七 并行ADC与DAC (36)实验八 三轴加速度传感器实验 (42)实验九 MicroSD卡操作实验 (49)实验十 TFT液晶显示实验 (55)实验十一 TFT LCD触摸控制实验 (62)实验十二 红外遥控接收编程实验 (67)实验十三 综合操作实验 (70)附录A TM4C1294管脚定义 (71)附录B EK‐TM4C1294XL核心板原理图 (75)附录C AY‐SCMP Kit开发板原理图 (81)附录D AY‐SCMP Kit开发板模块接口资源 (91)实验一GPIO接口实验一、实验目的1.掌握Code Composer Studio 6.0(以下简称CCS)的安装和配置步骤过程。
单片机程序调试步骤

步骤:①首先建立工程项目文件;②为工程选择目标器件(如TA89S52);③工程项目设置软硬件调试环境;④创建源程序文件并输入程序代码;⑤保存创建的源程序项目文件;⑥把源程序文件添加到项目中;第一步:建立工程项目文件双击桌面Keil uVision3.LNK快捷图标得到图1KEIL 图标在打开的下界面中点工程项得到图2。
图1打开工程下拉菜单,选择点击“新建工程“,首先在这里要新建一个工程项目文件。
图2为工程文件取一个名称,确定选择存放的路径(事先为每一个工程单独建立一个目录),在建立工程时形成的所有文件全部存放在这个目录下,如起工程名y2(此时不加后缀),保存类型选择 Project Files(*.uv2)点保存选择新建工图3接下来选择CPU驱动芯片,如AT89S52芯片,然后点确定。
图4这时提示:复制标准的8051开始代码到工程项目文件夹或添加文件到工程项目文件夹?(如果选择Y之后将会产生一个STARTUP文件,对我们实验是一个无用的文件,会在个别计算机上会导致不能创建目标文件,同时会产生一个空白的工程项目文件),选择N之后只建立一个空白的工程项目文件,我们选N便于操作。
至此用户就完成了建立一个空白的工程项目文件,并为工程选好了目标器件,但却是空白的工程项目文件。
第二步:建立源文件在界面中打开文件下拉菜单,在打开的选项中点“新建”,产生一个新建空白文件。
点新建图1在新建空白文件中输入源程序文件在确认源程序无错时点保存,这时界面上弹出提示“另存为”菜单,选择好保存路径,也就是刚才保存建立工程项目文件的目录路径,输入文件名,如y2.asm(要有后缀,汇编程序是*.asm),然后点击保存。
图4这时仅仅是完成了汇编程序的建立而已,但y2.asm汇编程序与y2.Uv2工程项目文件现在还没建立任何关系,此时应把y2.asm源程序文件添加到y2.Uv2工程中,构成一个完整的工程项目。
第三步:将源程序文件添加到工程项目中在左侧Project Windows窗口内右击 Source Group1,在弹出下拉菜单中选种 Add Filesto Group‘Source Group1’(向工程中添加源文件)命令,点Target,选右键点Source选择在弹出的菜单栏中点文件类型一栏下拉菜单,选Asm Source Files(*.a*:*.src:*.a*)即(汇编程序),文件框中选择将刚才创建的源程序文件y2.asm然后点Add,这时在文件名框后出现刚才选中y2.asm文件,在点击CLOSE完成源程序文件向工程项目的添加。
单片机实验全部程序

实验一I /O口输出实验—LED流水灯实验源程序#include<reg52.h>#include<intrins.h>sbit out0 = P2^0;sbit out7 = P2^7;sbit in = P1^0;void delay() //延迟函数{unsigned char i,j;for(i = 0; i<255;i++){for(j = 0;j<255;j++);}}void main(){P2 = 0xfe;while(out7 == 1) //左移位{if(in == 0) //改进有键按下时循环(必须一直按下){delay();P2 = _crol_(P2,1);}}while(out0 == 1) //右移位{if(in == 0) //改进有键按下时循环(必须一直按下){delay();P2 = _cror_(P2,1);}}}实验二定时器实验实验源程序#include "reg51.h"#include <intrins.h>#define uchar unsigned char#define uint unsigned intLight_left_right(); /*从左往右流动*/Light_shining(); //灯闪烁delay(uint t){uint s,i;for(s=0;s<t;s++) /*延时*/for(i=0;i<255;i++);}initial() //初始化;{EA=1; //总中断开关打开;EX0=1; //允许外中断0中断;IT0=0; //外中断0电平触发;}void main(void){initial();P1=0xff;while(1){Light_shining();}}void inter_func() interrupt 0 //外中断0中断函数;{Light_left_right();}Light_shining() //灯闪烁{P1=0xff;delay(255);P1=0x00; //交替闪烁delay(255);}Light_left_right() /*从左往右流动*/ {uchar i;P1=0xfe; /*下移初始值*/delay(150);for(i=1;i<8;i++){P1=_crol_(P1,1);delay(150);}}实验原理图实验三单个外部中断实验实验源程序#include<reg52.h>#include <intrins.h>sbit in = P3^2;void delay_10ms(unsigned char delay_ms_num) //延时函数{unsigned int i,j,k;for(i = 0;i<=delay_ms_num;i++)for(j = 0;j<=100;j++)for(k = 0;k>=100;k++);}void tx_init() //中断初始化函数{EA = 1; //总中断开EX0 = 1; //外部中断0开IT0 = 0; //选择为电平触发方式}void main(){tx_init(); //中断初始化P2 = 0x00; //初始化P2口while(1) //延迟循环求反{delay_10ms(100);P2 = ~P2;}}void tx0_func() interrupt 0 //中断服务程序{P2 = 0xfe; //将P2口初始化while(1) //使LED流水显示{P2 = _crol_(P2,1);delay_10ms(100);if(in == 1) //扫描P3.2口若它没按下则跳出循环{break;}}P2 = 0x00; //出中断是对P2口初始化}实验原理图实验四双单片机通信实验实验源程序#include<reg52.h>unsigned char num = 10;unsigned char temp ;unsigned char r;sbit in = P1^7;void delay(); //延迟函数unsigned keyscan(); //键盘扫描函数void spi_init4800(); //波特率为4800void main(){spi_init4800();while(1){keyscan();switch(num) //接收按键号并输出给数码管{case 0:{P2 = 0xc0;r = 0xc0; delay();break;}case 1:{P2 = 0xf9;r = 0xf9;delay();break;}case 2:{P2 = 0xa4;r = 0xa4;delay();break;}case 3:{P2 = 0xb0;r = 0xb0;delay();break;}case 4:{P2 = 0x99;r = 0x99;delay();break;}case 5:{P2 = 0x92;r = 0x92;delay();break;}case 6:{P2 = 0x82;r = 0x82;delay();break;}case 7:{P2 = 0xf8;r = 0xf8;delay();break;}case 8:{P2 = 0x80;r = 0x80;delay();break;}case 9:{P2 = 0x90;r = 0x90;delay();break;}default:P2 = 0xff;}}}void delay() //延迟函数{unsigned char i,j;for(i = 0;j <= 5;j++)for(j = 0;j <=200;j++);}unsigned keyscan() //键盘扫描{P1=0xfe;temp = P1;temp=temp&0xf8;while(temp!=0xf8){delay();temp=P1;temp=temp&0xf8;while(temp!=0xf8){temp=P1;switch(temp){case 0xf6:num=1;break;case 0xee:num=4;break;case 0xde:num=7;break;}while(temp!=0xf8){temp=P1;temp=temp&0xf8;}}}P1=0xfd;temp=P1;temp=temp&0xf8;while(temp!=0xf8){delay();temp=P1;temp=temp&0xf8;while(temp!=0xf8){temp=P1;switch(temp){case 0xf5:num=2;break;case 0xed:num=5;break;case 0xdd:num=8;break;case 0xbd:num=0;break;}while(temp!=0xf8){temp=P1;temp=temp&0xf8;}}}P1=0xfb;temp=P1;temp=temp&0xf8;while(temp!=0xf8){delay();temp=P1;temp=temp&0xf8;while(temp!=0xf8){temp=P1;switch(temp){case 0xf3:num=3;break;case 0xeb:num=6;break;case 0xdb:num=9;break;;}while(temp!=0xf8){temp=P1;temp=temp&0xf8;}}}return num;}void spi_init4800() //波特率为4800{IE = 0x94; //总中断串行口中断和计数器一中断开SCON = 0x40; //八位异步收发,波特率可变// TCON = 0x04;PCON = 0x80; //波特率加倍TI = 0; //软件清零表示未发送完TMOD = 0x20; //8位自动装入模式TH1 = 0xfa; //装入初值TL1 = 0xfa;TR1 = 1; //启动T}void spi_send() interrupt 2 //外部中断1函数{EX1 = 0; //关外部中断1REN = 1; //准许串行口接收数据SBUF = r; //发送数据}void spi_sendfinish() interrupt 4 //定时器1中断函数{if(RI == 1) //查询接收数据完成标志位{RI = 0; //接收中断标志位清零P0 = SBUF; //P0口将接受的数据读出REN = 0; //禁止接收数据}elseTI = 0; //关定时器1中断EX1 = 1; //准许外部中断1}实验原理图实验五单片机与PC之间串行通信实验实验源程序#include<reg52.h>sbit KEY=P3^2;void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void inti_com(void){SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xFD;TL1=0xFD;TR1=1;}void main(){inti_com();while(1){if(!KEY) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY) //再次确认按键是否按下,没有按下则退出{while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待SBUF=0xAB;}}}}实验原理图实验六8255并行I/O扩展实验实验源程序#include<reg52.h>#include "absacc.h"/*#define up_pa8255 XBYTE[0XF8]//上一片的各端口及控制寄存器地址#define up_pb8255 XBYTE[0XF9]#define up_pc8255 XBYTE[0XFA]#define up_ctrl8255 XBYTE[0XFB]*/#define down_pa8255 XBYTE[0XFF7C]//下一片的各端口及控制寄存器地址#define down_pb8255 XBYTE[0XFF7D]#define down_pc8255 XBYTE[0XFF7E]#define down_ctrl8255 XBYTE[0XFF7F]void delay10ms(void){unsigned char i=0,j=0;for(i=0;i<20;i++)for(j=0;j<248;j++);}//------------------------------------------------void main(void){unsigned int temp;down_pa8255=0xff;delay10ms();down_ctrl8255=0x82;delay10ms();while(1){temp=down_pb8255;delay10ms();down_pa8255=temp;}}实验原理图实验七矩阵键盘扫描实验实验源程序#include <reg52.h> //52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit wei1=P2^0; //申明U1锁存器的锁存端sbit wei2=P2^1;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void display(uchar num){P0=table[num]; //显示函数只送段选数据}void matrixkeyscan(){uchar temp,key;P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}P1=0xfb;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xeb:key=8;break;case 0xdb:key=9;break;case 0xbb:key=10;break;case 0x7b:key=11;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}P1=0xf7;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xe7:key=12;break;case 0xd7:key=13;break;case 0xb7:key=14;break;case 0x77:key=15;break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}display(key);}}}void main(){wei1=0;wei2=1;P0=0x00;while(1){matrixkeyscan();//不停调用键盘扫描程序}}实验原理图实验八1602液晶显示的控制(44780)实验源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="windway a good news";//uchar code table1[]="5201314";sbit lcden=P2^2;sbit lcdrs=P2^0;sbit lcdrw=P2^1;#define LCD_Data P0uchar num;uchar num1[3];uint ii;//长延时void delay(void){uint x,y;for(x=5;x>0;x--)for(y=7269;y>0;y--);}//短延时void delay1(void){uint y;for(y=5552;y>0;y--);}uchar LCD_Status(void){lcdrs = 0;lcdrw = 1;lcden = 0;lcden = 0;lcden = 1;while (LCD_Data & 0x80); //检测忙信号return(LCD_Data);}//写命令void write_com(uchar com,busy){ if(busy) LCD_Status();lcdrs=0;lcdrw=0;P0=com;delay1();lcden=1;delay1();lcden=0;}//写数据void write_data(uchar date){ // LCD_Status();lcdrs=1;lcdrw=0;P0=date;delay1();lcden=1;delay1();lcden=0;}//初始化void init(){lcden=0;write_com(0x38,0);delay1();write_com(0x38,0);delay1();write_com(0x38,0);delay1();write_com(0x38,1);write_com(0x08,1);write_com(0x01,1);write_com(0x0e,1); //write_com(0x0c,1); //write_com(0x0e,1); 光标闪烁write_com(0x06,1);}//在指定位置写一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码write_com(X,0); //这里不检测忙信号,发送地址码write_data(DData);}//写字符串void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar b=0;while (DData[b]>'\0') //若到达字串尾则退出{DisplayOneChar(X++, Y, DData[b++]); //显示单个字符if(X==16){X=0;Y^=1;}}}//主函数void main(){delay();init();DisplayListChar(0,0,table);while(1){}}实验原理图实验九A/D转换实验实验源程序#include<reg51.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned int#define N 5uchar getdata;sbit ST=P2^1;sbit CLK=P2^0;sbit EOC=P2^3;sbit OE=P2^7;sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;void inital(){TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;ET0=1;EA=1;TR0=1;}void intr()interrupt 1{TH0=(65536-2000)/256;TL0=(65536-2000)%256;CLK=~CLK;}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}void main(){P24=0;P25=0;P26=0;inital();while(1){P1=0xff;ST=0;OE=0;ST=1;delayms(1);ST=0;while(EOC==0);OE=1;getdata=P1;OE=0;P0=getdata;}}实验原理图实验十D/A转换实验实验源程序#include<reg52.h>sbit CS=P2^0;sbit WRDA=P2^1;void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void main(){unsigned int i;CS=1;CS=0;WRDA=0;while(1){P1=0;DelayMs(1000);P1=0xff;DelayMs(1000);}}实验原理图实验十一温度传感器DS18B20实验实验源程序#include<reg52.h>#define DataPort P0bit ReadTempFlag;sbit COM2=P2^2;sbit COM1=P2^1;sbit ds18b20_dq=P3^7;#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuint Tn;float Td;bit fuhao;void delay15us(uint t) //!!正常的程序示波器显示稳定数据丰富,不正常的显示不稳定数据短,这种情况应该是时序问题{ //时序问题1.要准确测量延时函数的持续时间2.要看哪里遗漏了延时,或延时不够长,尤其是读完数据和写完数据之后for(t;t>0;t--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}_nop_();_nop_();_nop_();_nop_();}bit init_ds18b20(){bit flag; //判断是否初始化成功ds18b20_dq=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();ds18b20_dq=0;delay15us(31);ds18b20_dq=1;delay15us(2); //给18b20反映时间,等待它输出存在脉冲flag=ds18b20_dq; //检测总线上的低电平delay15us(31);//延时足够长时间,等待存在脉冲输出完毕return flag;}uint read_ds18b20(){uint i,dat;for(i=0;i<8;i++){ds18b20_dq=1;_nop_();ds18b20_dq=0;_nop_();ds18b20_dq=1;_nop_();_nop_();_nop_();_nop_(); //dat>>=1; //从低位开始读,用这种形式;从高位开始读,直接右移if(ds18b20_dq==1)dat|=0x80;elsedat|=0x00; //从总线读取数据delay15us(1); //每读完一位要延时一定时间//!!!错误原因点之一:此处延时3个微妙太短了}return dat;}void write_ds18b20(uchar date){uint i,dat;dat=date;for(i=0;i<8;i++){ds18b20_dq=1;_nop_();ds18b20_dq=0;ds18b20_dq=dat&0x01; //数据写到总线上dat=dat>>1;delay15us(1); //等待18b20检测到数值ds18b20_dq=1;//_nop_(); //每写完一位要延时一定时间}//_nop_(); //稍作延时,给硬件一点反应时间}/*****************************************************函数功能:做好读温度的准备***************************************************/void ReadyReadTemp(){init_ds18b20(); //将DS18B20初始化write_ds18b20(0xCC); //跳过读序号列号的操作write_ds18b20(0x44); //启动温度转换//delay(200); //转换一次需要延时一段时间init_ds18b20(); //将DS18B20初始化write_ds18b20(0xCC); //跳过读序号列号的操作write_ds18b20(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位}readc_ds28b20(){uchar dh,dl;ReadyReadTemp();dl=read_ds18b20(); //低八位dh=read_ds18b20(); //高八位if((dh&0xf8)==0xf8){dh=~dh;dl=~dl+1; //这里的数据判断,转换没有任何问题fuhao=1;if(dl>255)dh=dh+1;}elsefuhao=0;Tn=dh*16+dl/16; //整数部分Td=(dl%16)*10/16; //小数部分*10/16可以把16进制小数变成10进制小数}void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void main(){Tn=0;COM1=0;COM2=0;while(1){readc_ds28b20();DataPort=Tn%10;COM2=1;DelayMs(40);COM2=0;DataPort=(Tn%100)/10;COM1=1;DelayMs(40);COM1=0;}}实验原理图实验十二直流电机控制实验实验源程序#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit K1=P3^4;sbit K2=P3^5;sbit DW_PWM = P3^7;//定义电机信号输出端口sbit DW_DIR = P3^6; //控制电机正反转,DW_DIR = 1,正转;DW_DIR = 0,反转void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时void main (void){unsigned char i;DW_DIR = 1;while (1) //主循环{if(!K1) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!K1) //再次确认按键是否按下,没有按下则退出{while(!K1);//如果确认按下按键等待按键释放,没有释放则一直等待{i=i-1;//释放则执行需要的程序}}}if(!K2) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!K2) //再次确认按键是否按下,没有按下则退出{while(!K2);//如果确认按下按键等待按键释放,没有释放则一直等待{i=i+1;//释放则执行需要的程序}}}DW_PWM=1;DelayMs(20+i);DW_PWM=0;DelayMs(20-i);}}void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}实验原理图实验十三步进电机控制实验实验源程序#include <reg52.h>sbit K1=P0^0;sbit K2=P0^1;sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed;void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------主函数------------------------------------------------*/main(){//unsigned int K1,K2;旋转一周时间Speed=10;Coil_OFF;K1=1;K2=1;while(!K1) //正向{Coil_A1DelayMs(Speed);Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替DelayMs(Speed); //改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_D1DelayMs(Speed);Coil_CD1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_BC1DelayMs(Speed);Coil_B1DelayMs(Speed);Coil_AB1DelayMs(Speed);}while(!K2)//反向{Coil_A1DelayMs(Speed);Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替DelayMs(Speed); //改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_B1DelayMs(Speed);Coil_BC1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_CD1DelayMs(Speed);Coil_D1DelayMs(Speed);Coil_DA1DelayMs(Speed);}Coil_OFF;}实验原理图实验十四直流电机测速实验实验源程序#include <reg52.h>unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};unsigned char temp[8];unsigned char dispcount;unsigned char T0count;unsigned char timecount;bit flag;unsigned long x;void main(void){unsigned char i;TMOD=0x15;TH0=0;TL0=0;TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;while(1){if(flag==1){flag=0;x=T0count*65536+TH0*256+TL0;for(i=0;i<8;i++){temp[i]=0;}i=0;while(x/10){temp[i]=x%10;x=x/10;i++;}temp[i]=x;for(i=0;i<6;i++){dispbuf[i]=temp[i];}timecount=0;T0count=0;TH0=0;TL0=0;TR0=1;}}}void t0(void) interrupt 1 using 0 {T0count++;}void t1(void) interrupt 3 using 0 {TH1=(65536-5000)/256;TL1=(65536-5000)%256; timecount++;if(timecount==200){TR0=0;timecount=0;flag=1;}P2=0xff;P0=dispcode[dispbuf[dispcount]];P2=dispbit[dispcount];dispcount++;if(dispcount==8){dispcount=0;}}实验原理图实验十五16X16阵列LED显示实验源程序#include <reg51.h>#define uint unsigned int#define uchar unsigned charunsigned char code hanzi[]={//哈(0) 尔(1) 滨(2) 冰(3) 雪(4) 节(5) 欢(6) 迎(7)你(8)0x00,0x40,0x00,0x40,0x08,0xA0,0x7C,0xA0,0x49,0x10,0x49,0x08,0x4A,0x0E,0x4D,0xF4,0x48,0x00,0x48,0x08,0x4B,0xFC,0x7A,0x08,0x4A,0x08,0x02,0x08,0x03,0xF8,0x02,0x08,/*"哈",0*/0x08,0x00,0x08,0x00,0x08,0x00,0x1F,0xFC,0x10,0x04,0x21,0x08,0x41,0x00,0x81,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"尔",1*/0x00,0x80,0x20,0x40,0x17,0xFE,0x14,0x02,0x88,0x14,0x43,0xE0,0x4A,0x00,0x0A,0x00,0x13,0xFC,0x12,0x10,0xE2,0x10,0x2F,0xFE,0x20,0x00,0x21,0x10,0x22,0x08,0x04,0x04,/*"滨",2*/0x00,0x40,0x40,0x40,0x20,0x40,0x20,0x44,0x00,0x68,0x07,0x70,0x11,0x60,0x11,0x50,0x21,0x50,0xE2,0x48,0x22,0x48,0x24,0x44,0x28,0x42,0x20,0x40,0x21,0x40,0x00,0x80,/*"冰",3*/0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x41,0x02,0x9D,0x74,0x01,0x00,0x1D,0x70,0x00,0x00,0x3F,0xF8,0x00,0x08,0x00,0x08,0x1F,0xF8,0x00,0x08,0x00,0x08,0x3F,0xF8,0x00,0x08,/*"雪",4*/0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x08,0x20,0x00,0x00,0x7F,0xF8,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x50,0x02,0x20,0x02,0x00,0x02,0x00,0x02,0x00,/*"节",5*/ 0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,/*"欢",6*/ 0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,/*"迎",7*/ 0x08,0x80,0x08,0x80,0x08,0x80,0x11,0xFE,0x11,0x02,0x32,0x04,0x34,0x20,0x50,0x20,0x91,0x28,0x11,0x24,0x12,0x24,0x12,0x22,0x14,0x22,0x10,0x20,0x10,0xA0,0x10,0x40/*"你",8*/ };void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar jiaohuan(uchar dat){uchar i,b;for(i=0;i<8;i++){b<<=1;if((dat&0x01)==1){b=b|0x01;}elseb=b&0xfe;dat>>=1;}return b;}void main(void){uchar i,j,k,temp1,temp2;while(1){for(j=0;j<9;j++) //对9字进行切换{for(k=0;k<180;k++) //一个字循环24次{for(i=0;i<16;i++) //动态显示一个字{temp1=hanzi[2*i+32*j];temp2=hanzi[2*i+1+32*j];P0=~temp1;P2=~temp2;delay(1);P1=i+1;}}}}}实验原理图。
基于51单片机按键长按短按效果源程序

基于51单片机按键长按短按效果源程序[复制链接]* 实验名称:多位数按键加减** 晶振:12MHZ* 内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描** 并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DEC=P3^2; //S18#define DataPort P1 //定义数据端口程序中遇到DataPort 则用P1 替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsigned char code HEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0123456789unsigned char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayUs2x(unsigned char t);//函数声明void DelayMs(unsigned char t);void Init_Timer0(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num=0,key_press_num;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DEC=1;Init_Timer0();while (1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下DelayMs(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_ADD){key_press_num++;DelayMs(10); //10x200=2000ms=2sif(key_press_num==200) //大约2s{key_press_num=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_press_num=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DEC)key_press_num++;DelayMs(10);if(key_press_num==200) //大约2s{key_press_num=0;while(!KEY_DEC){if(num>0) //减操作num--;//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作的速度}}}key_press_num=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];// Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
北京工业大学8051单片机实验报告材料

8051单片机实验报告专业:电子科学与技术:学号:120231指导教师:金冬月第一单元单片机程序调试环境使用及并行数据传送操作训练1-1修改例程一的源程序:将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。
$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#080H ;赋初始值并在发光二极管上显示该数值 CPL AMOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYRR A ;A寄存器容右移1位并送发光二极管显示 MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令 END将LED向左循环移位点亮改为向右循环移位点亮。
$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令LCALL Init_Device ;调用初始设置子程序MOV A,#07FH ;赋初始值并在发光二极管上显示该数值 MOV P3,ALOOP: CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYRL A ;A寄存器容右移1位并送发光二极管显示 MOV P3,AAJMP LOOP ;无限循环DELAY: MOV R5,#0H ;延时子程序D1: MOV R6,#0HDJNZ R6,$DJNZ R5,D1RET$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END加快LED循环移位点亮的速度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验指导书(实验源程序)实验二、三 I/O接口实验1、输出实验例1:ORG 0000HAJMP START ;跳转到初始化程序ORG 0033H;----- 主程序开始 -----START: MOV P1,#0FFH ;是所有LED熄灭ACALL DELAY ;调用延时子程序CLR P1.0 ;P1.0输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0输出高电平,使LED3熄灭CLR P1.1 ;P1.1输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1输出高电平,使LED4熄灭CLR P1.2 ;P1.2输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2输出高电平,使LED5熄灭CLR P1.3 ;P1.3输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序MOV P1, #0F0H ;LED3~LED6全部发光ACALL DELAY ;调用延时子程序AJMP START ;返回到标号START处再循环;----- 延时子程序 -----DELAY: MOV R5,#10LOOP: MOV R6,#200LOOP1: MOV R7,#250LOOP2: DJNZ R7,LOOP2DJNZ R6,LOOP1DJNZ R5,LOOPRET例2:ORG 0000HAJMP START ;跳转到初始化程序ORG 0033H;----- 主程序开始 -----START: MOV P1,#0FFH ;是所有LED熄灭ACALL DELAY ;调用延时子程序MOV ACC,#0FEH ;ACC中先装入LED3亮的数据(二进制的11111110) MOV P1,ACC ;将ACC的数据送P1口ACALL DELAY ;调用延时子程序MOV R0,#03H ;上句送到P1口的数据就点亮了LED1,所以将数据再移动3次就完成一个4位流水过程LOOP3: RL A ;将ACC中的数据左移一位MOV P1,A ;把ACC移动过的数据送p1口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP3 ;没有移动够4次继续移动MOV P1, #0F0H ;LED3~LED6全部发光ACALL DELAY ;调用延时子程序AJMP START ;返回到标号START处再循环;----- 延时子程序 -----DELAY: MOV R5,#10LOOP: MOV R6,#200LOOP1: MOV R7,#250LOOP2: DJNZ R7,LOOP2DJNZ R6,LOOP1DJNZ R5,LOOPRET2、输入实验例1:;****************************************************************;* K1控制LED3亮灭交替 *;****************************************************************org 0star: mov p1,#0hmov p3,#0ffhst1: jb p3.2,$jnb p3.2,$cpl p1.0sjmp st1end例2:;****************************************************************************** ;* 按压实验板上的按钮K1,控制P1.0的LED亮灭 * ;* 按压K1,LED点亮,再次按压K1,LED熄灭 * ;* 程序没有进行按键消抖动处理,控制结果会因为按键抖动而出错 * ;* 按压K1十次,大概有3~5次输出会因为按键抖动而发生错误 * ;* 实验时请多按几次,观察一下效果,加深对按键消抖动重要性的认识 * ;******************************************************************************ORG 0000HAJMP START ;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H ;SP初始化MOV P3,#0FFH ;端口初始化MAIN: JB P3.2,MAIN ;检测按键K1有没有按下CPL P1.0 ;执行按键命令,改变P1.0指示灯状态JNB P3.2,$ ;等待按键K1释放AJMP MAIN ;返回重新检测按键END例3:;****************************************************************************** ;* 按压实验板上的按钮K1,控制P1.0的LED亮灭 * ;* 按压K1,LED点亮,再次按压K1,LED熄灭 * ;* 程序进行了按键消抖动处理,不会出现控制结果出错的现象 * ;* 由此可以看出按键软件消抖动的功效 * ;******************************************************************************ORG 0000HAJMP START ;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H ;SP初始化MOV P3,#0FFH ;端口初始化MAIN: JB P3.2,MAIN ;检测按键P3.2有没有按下ACALL YS20ms ;消前沿抖动延时,实现软件去抖动JB P3.2,MAIN ;再次检测按键,如果为高电平,则是抖动CPL P1.0 ;执行按键命令,改变P1.0指示灯状态JNB P3.2,$ ;等待按键释放AJMP MAIN ;返回重新检测按键YS20ms: MOV R7,#40 ;延时20ms子程序YS1: MOV R6,#229DJNZ R6,$DJNZ R7,YS1RET实验四多级外部中断控制实验例程:;************************************************************************ ;* INT0,INT1为边沿触发方式,INT1为高级中断*;* 主程序中8个LED轮流闪烁 * ;* 外中断程序0中,8个指示灯同时闪烁8次*;* 外中断程序1中,左右4个指示灯交替闪烁*;* 因为INT1为高级中断,所以INT1中断可以中断INT0中断程序 * ;* 即当按压K1进入外中断0时,8个LED同时闪烁,此时按压K2可以中断 * ;* TIN0的执行。
相反,当INT1中断后,按压K1则不能中断INT1的执行 *;************************************************************************ ORG 0000HAJMP STARTORG 0003HJMP PGINT0ORG 0013HJMP PGINT1ORG 0033HSTART: MOV P0,#0FFHMOV P1,#0FFHMOV P2,#0FFHMOV P3,#0FFHMAIN: MOV IE,#10000101B ;INT0,INT1中断使能MOV IP,#00000100B ;INT1中断优先MOV TCON,#00000000B ;INT0,INT1为电平触发MOV SP,#60HMOV A,#0FEHLOOP: MOV P1,ACALL DELAYRL AJMP LOOPJMP MAINPGINT0: PUSH ACCMOV R2,#8LOOP0: MOV P1,#00HCALL DELAYMOV P1,#0FFHCALL DELAYDJNZ R2,LOOP0POP ACCRETIPGINT1: PUSH ACCMOV R3,#8LOOP1: MOV P1,#0FHCALL DELAYMOV P1,#0F0HCALL DELAYDJNZ R3,LOOP1POP ACCRETI;******** 延时子程序 ********DELAY: MOV R4,#80D1: MOV R5,#10D2: MOV R6,#228DJNZ R6,$DJNZ R5,D2DJNZ R4,D1RETEND实验五定时器/计数器实验程序一:ORG 0000HAJMP STARTORG 000BH ;定时器0的中断向量地址AJMP TIME0 ;跳转到真正的定时器程序处ORG 0030HSTART:MOV P1,#0FFH ;关所有灯MOV TMOD,#00000001B ;定时/计数器0工作于方式1MOV TH0,#15HMOV TL0,#0A0H ;即数5536SETB EA ;开总中断允许SETB ET0 ;开定时/计数器0允许SETB TR0 ;定时/计数器0开始运行LOOP: AJMP LOOP ;真正工作时,这里可写任意程序TIME0: ;定时器0的中断处理程序PUSH ACCPUSH PSW ;将PSW和ACC推入堆栈保护CPL P1.0MOV TH0,#15HMOV TL0,#0A0H ;重置定时常数POP PSWPOP ACCRETIEND程序二:ORG 0000HAT0: MOV P1,#0FFHMOV TMOD,#61H ;设置T1为计数器,工作于方式2;设置T0为定时器,工作于方式1 MOV TL1,#246MOV TH1,#246SETB TR1AT1: CPL P1.7AT2: MOV TL0,#00H ;MOV TH0,#4CH ;即数15536SETB TR0JNB TF0,$ CLR TF0CPL P1.0JNB TF1,AT2 CLR TF1SJMP AT1END实验六数码管显示实验;**********数码管显示"6"的程序1 **********MAIN: CLR P0.0 ;P0.0输出低电平,点亮数码管段码"a"SETB P0.1 ;P0.1输出高电平,熄灭数码管段码"b"CLR P0.2 ;P0.2输出低电平,点亮数码管段码"c"CLR P0.3 ;P0.3输出低电平,点亮数码管段码"d"CLR P0.4 ;P0.4输出低电平,点亮数码管段码"e"CLR P0.5 ;P0.5输出低电平,点亮数码管段码"f"CLR P0.6 ;P0.6输出低电平,点亮数码管段码"g"SETB P0.7 ;P0.7输出高电平,熄灭数码管段码"dp"CLR P2.0 ;P2.0输出低电平,选通数码管DG1SETB P2.1 ;P2.1输出高电平,不选通数码管DG2SETB P2.2 ;P2.2输出高电平,不选通数码管DG3SETB P2.3 ;P2.3输出高电平,不选通数码管DG4SETB P2.4 ;P2.4输出高电平,不选通数码管DG5SETB P2.5 ;P2.5输出高电平,不选通数码管DG5AJMP MAIN ;跳转到开始重新进行END ;程序结束;**********数码管显示"6"的程序2 **********MAIN: MOV P0,#82H ;将数字"6"的段码输出到P0口MOV P2,#0FEH ;从P2口输出数码管选通代码,让DG1显示,其它数码管关闭 AJMP MAIN ;跳转到开始重新进行END ;程序结束;****************************************************************;* ------ 在数码管上动态显示"89C51" ------ *;****************************************************************MAIN: MOV P0,#80H ;第1位数码管显示“8”CLR P2.5 ;允许第1位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#90H ;第2位数码管显示“9”CLR P2.4 ;允许第2位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#0C6H ;第3位数码管显示“C”CLR P2.3 ;允许第3位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#92H ;第4位数码管显示“5”CLR P2.2 ;允许第4位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#0F9H ;第5位数码管显示“1”CLR P2.1 ;允许第5位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示AJMP MAIN ;跳转到开始重新进行;******** 延时子程序 ********DELAY: MOV R1,#10Y1: MOV R2,#100DJNZ R2,$DJNZ R1,Y1RETEND。