单片机4个dd实验

合集下载

C51单片机实战100例

C51单片机实战100例

目录目录 1函数的使用和熟悉 6实例3:用单片机控制第一个灯亮7实例4:用单片机控制一个灯闪烁:认识单片机的工作频率7实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能8实例6:使用P3口流水点亮8位LED 9实例7:通过对P3口地址的操作流水点亮8位LED 11实例8:用不同数据类型控制灯闪烁时间13实例9:用P0口、P1 口分别显示加法和减法运算结果15实例10:用P0、P1口显示乘法运算结果15实例11:用P1、P0口显示除法运算结果16实例12:用自增运算控制P0口8位LED流水花样17实例13:用P0口显示逻辑"与"运算结果18实例14:用P0口显示条件运算结果18实例15:用P0口显示按位"异或"运算结果 19实例16:用P0显示左移运算结果19实例17:"万能逻辑电路"实验20实例18:用右移运算流水点亮P1口8位LED 20实例19:用if语句控制P0口8位LED的流水方向 22实例20:用swtich语句的控制P0口8位LED的点亮状态23 实例21:用for语句控制蜂鸣器鸣笛次数25实例22:用while语句控制LED 27实例23:用do-while语句控制P0口8位LED流水点亮29 实例24:用字符型数组控制P0口8位LED流水点亮30实例25:用P0口显示字符串常量 32实例26:用P0 口显示指针运算结果33实例27:用指针数组控制P0口8位LED流水点亮34实例28:用数组的指针控制P0 口8 位LED流水点亮35实例29:用P0 、P1口显示整型函数返回值37实例30:用有参函数控制P0口8位LED流水速度38实例31:用数组作函数参数控制流水花样40实例32:用指针作函数参数控制P0口8位LED流水点亮41 实例33:用函数型指针控制P1口灯花样44实例34:用指针数组作为函数的参数显示多个字符串45实例35:字符函数ctype.h应用举例48实例36:内部函数intrins.h应用举例48实例37:标准函数stdlib.h应用举例49实例38:字符串函数string.h应用举例 51实例39:宏定义应用举例2 52实例40:宏定义应用举例2 52实例41:宏定义应用举例3 53中断、定时器54实例42:用定时器T0查询方式P2口8位控制LED闪烁54 实例43:用定时器T1查询方式控制单片机发出1KHz音频55 实例44:将计数器T0计数的结果送P1口8位LED显示56 实例45:用定时器T0的中断控制1位LED闪烁57实例46:用定时器T0的中断实现长时间定时59实例47:用定时器T1中断控制两个LED以不同周期闪烁60 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频62实例49:用定时器T0的中断实现"渴望"主题曲的播放64 实例50-1:输出50个矩形脉冲69实例50-2:计数器T0统计外部脉冲数70实例51-2:定时器T0的模式2测量正脉冲宽度71实例52:用定时器T0控制输出高低宽度不同的矩形波72 实例53:用外中断0的中断方式进行数据采集75实例54-1:输出负脉宽为200微秒的方波76实例54-2:测量负脉冲宽度77实例55:方式0控制流水灯循环点亮78实例56-1:数据发送程序80实例56-2:数据接收程序83实例57-1:数据发送程序84实例57-2:数据接收程序86实例58:单片机向PC发送数据88实例59:单片机接收PC发出的数据90数码管显示 92实例60:用LED数码显示数字5 92实例61:用LED数码显示器循环显示数字0~9 92实例62:用数码管慢速动态扫描显示数字"1234" 94实例63:用LED数码显示器伪静态显示数字1234 95实例64:用数码管显示动态检测结果96实例65:数码秒表设计100实例66:数码时钟设计103实例67:用LED数码管显示计数器T0的计数值110实例68:静态显示数字“59”112键盘控制113实例69:无软件消抖的独立式键盘输入实验113实例70:软件消抖的独立式键盘输入实验114实例71:CPU控制的独立式键盘扫描实验115实例72:定时器中断控制的独立式键盘扫描实验121实例73:独立式键盘控制的4级变速流水灯128实例74:独立式键盘的按键功能扩展:"以一当四" 132实例75:独立式键盘调时的数码时钟实验135实例76:独立式键盘控制步进电机实验143实例77:矩阵式键盘按键值的数码管显示实验148实例78:矩阵式键盘按键音154实例79:简易电子琴157实例80:矩阵式键盘实现的电子密码锁169液晶显示LCD 175实例81:用LCD显示字符'A' 175实例82:用LCD循环右移显示"Welcome to China" 182 实例83:用LCD显示适时检测结果188实例84:液晶时钟设计196一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控 208实例85:将数据"0x0f"写入AT24C02再读出送P1口显示208实例86:将按键次数写入AT24C02,再读出并用1602LCD显示216 实例87:对I2C总线上挂接多个AT24C02的读写操作231实例88:基于AT24C02的多机通信读取程序242实例88:基于AT24C02的多机通信写入程序249实例90:DS18B20温度检测及其液晶显示271实例91:将数据"0xaa"写入X5045再读出送P1口显示 289实例92:将流水灯控制码写入X5045并读出送P1口显示296实例93:对SPI总线上挂接多个X5045的读写操作303实例94:基于ADC0832的数字电压表312实例95:用DAC0832产生锯齿波电压324实例96:用P1口显示红外遥控器的按键值 325实例97:用红外遥控器控制继电器 330实例98:基于DS1302的日历时钟335实例99:单片机数据发送程序353实例100:电机转速表设计 355//模拟霍尔脉冲 365函数的使用和熟悉实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#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(); //延时一段时间}}实例5:将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口}}实例6:使用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;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口灭,其余亮}实例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 1000B while(1); //设置无限循环,防止程序“跑飞”}实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(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++)//设置循环次数为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=150msvoid 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位后再赋给P3 delay(); //调用延时函数}}实例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显示。

单片机静态数码管实验报告

单片机静态数码管实验报告

单片机静态数码管实验报告一、引言静态数码管是一种常用的显示器件,广泛应用于各种仪器仪表、计时器、计数器等场合。

本实验旨在通过单片机控制静态数码管,实现数字的显示功能。

二、实验原理静态数码管由若干个发光二极管组成,每个发光二极管代表一个数字。

通过控制每个发光二极管的亮灭,可以显示不同的数字。

单片机通过控制数码管的共阳极或共阴极,以及发光二极管的亮灭,实现数字的显示。

三、实验器材1. 单片机开发板2. 静态数码管3. 连接线四、实验步骤1. 连接电路:将静态数码管的共阳极或共阴极与单片机开发板相应的IO口连接。

2. 编写程序:使用C语言编写程序,通过控制IO口的高低电平控制数码管的亮灭,实现数字的显示。

3. 烧录程序:将编写好的程序烧录到单片机开发板中。

4. 调试程序:通过调试程序,观察数码管是否能正常显示数字。

5. 结果分析:根据实验结果,分析程序的正确性及数码管显示的准确性。

6. 实验总结:总结实验过程中的问题及解决方法,并对实验结果进行分析和评价。

五、实验结果经过实验,我们成功地通过单片机控制静态数码管,实现了数字的显示。

数码管能够根据程序的控制,显示出不同的数字,显示效果良好,准确度高。

六、实验分析通过本实验,我们掌握了单片机控制静态数码管的方法和技巧。

在实验过程中,我们发现控制数码管显示数字的关键在于正确地控制IO口的高低电平。

同时,我们还发现静态数码管显示数字的亮度和清晰度与电源电压和电流的稳定性有关,需要合理选择电源参数。

七、实验应用静态数码管广泛应用于各种仪器仪表、计时器、计数器等场合。

通过单片机控制静态数码管,可以实现各种数字的显示功能,满足不同场合的需求。

八、实验总结通过本实验,我们深入了解了单片机控制静态数码管的原理和方法。

通过编写程序和调试程序,我们成功地实现了数字的显示功能。

实验过程中,我们遇到了一些问题,但通过不断的调试和尝试,最终解决了问题。

通过本次实验,我们不仅加深了对单片机原理的理解,还提升了实际操作和问题解决的能力。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

单片机实验程序及流程图

单片机实验程序及流程图

《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.程序清单及程序流程框图ORG 0000H Array LJMP MAINMAIN: MOV R0,#30HMOV R2,#10HCLR AA1: MOV @R0,AINC R0INC ADJNZ R2,A1MOV R0,#30HMOV R1,#40HMOV R2,#10HA2: MOV A, @R0MOV @R1,AINC R0INC R1DJNZ R2, A2MOV R1,#40HMOV DPTR ,#4800HMOV R2, #10HA3: MOV A,@R1MOVX @DPTR ,AINC R1INC DPTRDJNZ R2,A3MOV SP,#60HMOV R2,#10HMOV DPTR ,#4800HPUSH DPLPUSH DPHMOV DPTR,#5800HMOV R3,DPLMOV R4,DPHA4: POP DPHPOP DPLMOVX A,@DPTRINC DPTRPUSH DPLPUSH DPHMOV DPL,R3MOV DPH,R4 MOVX @DPTR,A INC DPTRMOV R3,DPLMOV R4,DPHDJNZ R2,A4MOV R0,#50HMOV DPTR,#5800H MOV R2,#10HA5: MOVX A,@DPTR MOV @R0,AINC R0 INC DPTR DJNZ R2,A5POP DPH POP DPL HERE: LJMP HEREEND《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义《单片机技术》实验多媒体讲义三.实验电路四.程序清单及流程图程序一ORG 0000HLJMP MAIN ORG 000BH LJMP IPTO MAIN: MOV SP, #30H MOV TMOD, #01HCLR 00H SETB EA SETB ET0 MOV TH0, #3CH MOV TL0, #0B0H MOV R1, #14H SETB TR0 MOV A, #0feH MOV P1, A NT: JNB 00H, NT RL A MOV P1, ACLR 00H LJMP NT IPTO: MOV TH0,#3CH MOV TL0,#0B0HDJNZ R1, TIOMOV R1, #14HSETB 00HTIO: RETIEND程序二只需将程序一中“RL A”改为“RR A”即可实现其功能。

单片机实验报告实验5行列式键盘实验

单片机实验报告实验5行列式键盘实验

学号姓名专业电气工程及其自动化班级实验5 行列式键盘实验一、实验目的(1)、学习掌握行列式键盘接口方法(2)、学习掌握行列式键盘编程方法。

二、实验内容用单片机P1口接4*4键盘,P0口接共阳数码管,编程实现键字的显示。

P1.0-P1.3为行,P1.4-P1.7为列。

先给端口设处置FEH,相当于给第一行置0,然后分写列值,如果对应的列值为0,说明该行与该列交叉处的键是按下的,接下来扫描第二行,与第一行的操作相同。

这就是行列式键盘扫描原理。

当扫描到某行的键按下时,就退出扫描,然后取键值,再将键值对应的额编码送P0端口显示。

三、实验设备计算机(已安装Keil和Proteus软件)元器件:A T89C51, CAP, CAP-ELEC, CRYSTAL, RES, 7SEG-COM-AN-GRN, RESPACK-7, BUTTON四、实验硬件电路实验源程序:#include<reg51.h>charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x7 1};charkey_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x 77};char getkey(void){char key_scan[]={0xef,0xdf,0xbf,0x7f};char i=0,j=0;for(i=0;i<4;i++){P1=key_scan[i];if((P1&0x0f)!=0x0f){for(j=0;j<16;j++){if(key_buf[j]==P1)return j;}}}return -1;}void main(void){char key=0;P0=0x00;while(1){key=getkey();if(key!=1)P0=~led_mod[key]; }}五、实验要求(1)、根据实验内容设计相应的调试程序,并通过仿真,运行正确。

单片机流水灯实验报告

单片机流水灯实验报告

单片机流水灯实验报告引言单片机是一种集成电路,可以通过编程来控制不同的功能。

其中,流水灯是一个最简单的单片机实验项目,也是学习单片机的第一步。

本篇实验报告将详细介绍如何通过使用 AVR 单片机来实现一个流水灯的控制器。

实验原理流水灯的原理很简单,就是通过一个方向控制信号,以及一定的时间延时控制来逐步点亮和熄灭多个 LED 灯。

在本次实验中,我们将使用 AVR ATmega328P 单片机,它可以通过编程来实现流水灯的控制功能。

实验步骤1. 硬件准备将 ATmega328P 单片机插入到开发板中,并使用杜邦线将单片机的引脚连接到各个 LED 灯。

我们需要将一个引脚连接到方向控制信号,用于控制灯的点亮方向。

同时,我们还需要连接一个电位器,用于调节流水灯的速度。

2. 程序设计使用 Arduino 开发环境来编写 AVR 单片机的程序。

首先需要包含头文件 avr/io.h 和 util/delay.h,并定义输入输出引脚。

然后,我们需要定义一个名为“led” 的一个数组,来存储各个 LED 灯的输出状态。

同时,还需要定义一个变量“dir”,来表示流水灯的方向。

在程序主循环中,我们使用 for 循环来遍历各个 LED 灯。

同时,根据“dir”变量的不同,我们可以实现流水灯的正向和反向控制。

另外,我们还需要使用“_delay_ms()”函数来延时一定的时间,实现流水灯的闪烁效果。

3. 程序烧录使用 AVR ISP 编程器将编写好的程序烧录到单片机中。

在烧录过程中需要设置正确的程序和芯片类型,并选择正确的口线连接方式。

实验结果经过实际测试,我们成功地实现了一个流水灯控制器。

在调节电位器之后,灯的闪烁速度可以得到不同的调整。

同时,也可以通过改变方向控制信号来改变流水灯的运动方向。

结论通过本次实验可以学习到如何使用 AVR 单片机来实现一个简单的流水灯控制器。

通过编写程序、烧录编译等过程,可以加深对单片机的基础知识和理解。

单片机实验的实验心得8篇

单片机实验的实验心得8篇

单片机实验的实验心得8篇(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如工作计划、工作总结、心得体会、条据文书、汇报材料、规章制度、合同协议、教学资料、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays for everyone, such as work plans, work summaries, reflections, written documents, reporting materials, rules and regulations, contract agreements, teaching materials, essay summaries, other sample essays, etc. If you want to learn about different sample essay formats and writing methods, please stay tuned!单片机实验的实验心得8篇真实的感受和深入的思考是我们获得优秀心得体会的必要条件,心得体会是通过实际经验的积累而得出的,本店铺今天就为您带来了单片机实验的实验心得8篇,相信一定会对你有所帮助。

单片机定时器实验报告

单片机定时器实验报告

单片机定时器实验报告单片机定时器实验报告概述:单片机是一种集成电路,具有微处理器核心,用于控制和执行各种任务。

在嵌入式系统中,单片机的定时器是一个重要的组件,用于生成精确的时间延迟和周期性的信号。

本实验旨在通过使用单片机的定时器模块,学习和掌握定时器的基本原理和应用。

实验目的:1. 理解单片机定时器的工作原理;2. 掌握定时器的基本配置和使用方法;3. 实现定时器产生精确的时间延迟和周期性的信号。

实验器材:1. 单片机开发板;2. USB数据线;3. 电脑。

实验步骤:1. 连接单片机开发板和电脑,确保开发板与电脑正常通信;2. 打开开发板的开发环境软件,创建一个新的工程;3. 在工程中选择定时器模块,并进行基本配置,如选择定时器模式、预分频系数等;4. 编写程序代码,实现定时器功能。

可以选择定时产生一个精确的时间延迟,或者产生一个周期性的信号;5. 将程序代码下载到单片机开发板中,并运行程序;6. 观察实验结果,验证定时器的工作是否符合预期。

实验结果:经过实验,我们成功实现了单片机定时器的功能。

通过设置定时器的工作模式和预分频系数,我们可以生成精确的时间延迟和周期性的信号。

实验结果与预期一致,证明了定时器的可靠性和准确性。

实验总结:通过本次实验,我们深入了解了单片机定时器的原理和应用。

定时器作为嵌入式系统中的重要组件,具有广泛的应用前景。

掌握定时器的基本配置和使用方法,对于开发嵌入式系统和实现各种功能非常重要。

通过实验,我们不仅学到了理论知识,还掌握了实际操作的技巧和经验。

然而,单片机定时器的应用不仅仅局限于时间延迟和周期性信号的生成。

在实际工程中,定时器还可以用于测量脉冲宽度、频率计数、PWM波形生成等。

因此,我们在以后的学习和工作中,应该进一步探索和应用定时器的其他功能,以满足不同场景下的需求。

总之,单片机定时器是嵌入式系统中不可或缺的组件之一。

通过本次实验,我们对定时器的原理和应用有了更深入的了解。

单片机控制流水灯程序汇编语言

单片机控制流水灯程序汇编语言

单片机控制流水灯程序汇编语言随着科技的发展和微电子技术的迅猛进步,单片机逐渐成为智能系统与设备中不可或缺的组成部分。

而流水灯作为最基础的应用之一,不仅在学习过程中具有重要意义,同时也在实际工程中发挥着重要作用。

本文将介绍如何使用汇编语言编写单片机控制流水灯程序,并详细讲解其运行原理和实现方法。

一、流水灯原理流水灯是一种由多个LED组成的灯条或灯链,在按照一定次序依次点亮和熄灭的灯光效果。

其原理基于单片机通过控制输出口的电平高低来控制LED的亮灭状态,实现灯光的变化和移动效果。

二、程序设计方法1. 初始化设置在编写流水灯程序之前,我们首先要了解单片机的相应接口和寄存器的使用方法。

在程序开始时,需要进行相应的初始化设置,包括将数据方向寄存器和端口寄存器设置为输出,并将初始值赋予输出口电平。

例如,对于51单片机,可以使用以下汇编语言代码进行初始化设置:MOV P1, #00H ;将P1端口的输出电平置为低电平MOV P1M1, #FFH ;将P1端口的数据方向设置为输出MOV P1M0, #00H2. 主程序在流水灯程序中,需要编写主程序来实现流水灯的效果。

主程序中使用循环结构控制LED的亮灭状态和移动效果。

例如,以下是一个简单的汇编语言代码,实现了由4个LED组成的流水灯的效果:MOV R0, #F0H ;初始亮灭状态MOV R1, #00H ;初始LED位置LOOP: ;循环MOV P1, R0 ;将亮灭状态赋予P1端口的输出电平ACALL DELAY ;延时,形成流水灯效果MOV A, R1SUBB A, #01H ;将LED位置减一MOV R1, AJZ CHANGE ;当LED位置为零时,改变亮灭状态MOV R0, R0SJMP LOOP ;继续循环CHANGE: ;改变亮灭状态CPL R0 ;对亮灭状态进行取反操作SJMP LOOP ;继续循环3. 延时函数为了实现流水灯的移动效果,需要设置一个合适的延时时间来控制LED的亮灭速度。

单片机综合实训教案

单片机综合实训教案

单片机综合实训教案一、实训目的和要求1. 实训目的(1)了解单片机的基本原理和工作原理;(2)掌握单片机的编程方法和应用技巧;(3)培养动手能力和团队协作精神;(4)提高创新意识和解决实际问题的能力。

2. 实训要求(1)全体学生需参加实训,不得缺席;(2)实训期间,遵守实验室纪律,爱护实验设备;(3)完成实训任务,提交完整的实训报告;(4)实训成果需进行展示和评价。

二、实训内容1. 单片机概述(1)单片机的定义和发展历程;(2)单片机的组成和功能;(3)单片机的应用领域。

2. 单片机编程基础(1)单片机编程语言(C语言、汇编语言等);(2)单片机指令系统;(3)编程规范和技巧。

3. 单片机外围设备(1)键盘、显示器、传感器等外围设备;(2)外围设备接口和驱动程序;(3)外围设备与单片机的通信。

4. 单片机应用系统设计(1)系统需求分析;(2)硬件选型和电路设计;(3)软件设计和编程;(4)系统测试和调试。

5. 实训案例分析(1)分析实际项目中的单片机应用;(2)讨论项目中的关键技术问题;三、实训步骤1. 课堂讲解:介绍单片机的基本原理、编程方法和应用领域;2. 动手实践:学生分组进行单片机编程和外围设备接入;3. 案例分析:分析实际项目中的单片机应用,讨论关键技术问题;4. 成果展示:各组展示实训成果,进行自评、互评和他评;四、实训评价1. 评价内容(1)实训报告:内容完整、论述清晰、技术正确;(2)实训成果:功能完善、性能稳定、创新性强;(3)课堂表现:积极参与、动手能力强、团队协作好。

2. 评价方式(1)实训报告评分(30%);(2)实训成果评分(40%);(3)课堂表现评分(30%)。

五、实训资源1. 教材和参考书:介绍单片机的基本原理、编程方法和应用领域;2. 实验设备:单片机开发板、外围设备、编程软件等;3. 网络资源:查阅相关资料、学习编程技巧、交流心得体会。

六、实训环境与安全1. 实训环境(1)单片机实验室:配备单片机开发板、编程电脑、外围设备等;(3)实验桌椅整洁,方便学生操作。

基于单片机的4通道模拟信号采集与显示系统

基于单片机的4通道模拟信号采集与显示系统

设计(论文)内容及要求:一、设计内容1、分析理解常用的单片机模拟电压测量电路系统,设计一可同时测量4路0~5V直流电压的电路,系统具有4路顺序循环采集与指定某一路采集的功能,且能通过显示出通道和电压值;2、学习Keil uVision2和proteus7电子仿真软件;3、将设计的电路通过仿真软件进行运行,并能得到正确结果;4、总结写出设计论文。

二、设计要求[1] 根据设计任务书设计内容,作出设计进度安排,写出开题报告;[2] 撰写毕业设计(论文),篇幅不少于1.5万字,图表数据完整;[3]收集查找资料,参考资料不少于六本,并于引用处标明;[4]按毕业设计(论文)规范要求,打印装订成册两本;[5]完成英语译文一篇。

三、主要参考资料[1] 谢自美. 电子线路设计*实验*测试.华中科技大学出版社.[2] 张友德等. 单片微型机原理、应用和实验.电子工业出版社.[3] 吴经国等.单片机应用技术. 中国电力出版社.[4] 李群芳.单片机微型计算机与接口技术.电子工业出版社.[5] 阉石.数字电子技术基础.高等教育出版社.[6] 黄智伟.全国大学生电子设计竞赛训练教程.电子工业出版社.[7] 周立功.单片机实验与实践.北京航空航天大学出版社.南华大学本科生毕业设计(论文)开题报告设计(论文)题目基于单片机的4通道模拟信号采集与显示系统设计(论文)题目来源其它设计(论文)题目类型软件仿真起止时间07年12月-08年5月一、设计(论文)依据及研究意义:依据:单片机I/O口的输入输出功能、AD转换原理及LCD显示原理意义:多通道的模拟信号采集与显示系统比单通道的实用范围更广二、设计(论文)主要研究的内容、预期目标:(技术方案、路线)1、主要研究内容:分析理解常用的单片机模拟电压测量电路系统,设计一可同时测量4路0~5V直流电压的电路,系统具有4路顺序采集与指定某一路采集的功能,且能通过显示屏显示出通道数的电压值。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

单片机实训报告实验步骤

单片机实训报告实验步骤

一、实验目的1. 掌握单片机的基本工作原理和硬件结构。

2. 熟悉单片机的编程方法,提高编程能力。

3. 学习单片机的调试技巧,提高调试效率。

4. 通过实际操作,培养动手能力和团队合作精神。

二、实验仪器与设备1. 单片机实验开发板2. 编译器(如Keil、IAR等)3. 仿真软件(如Proteus、Multisim等)4. 连接线、电源、示波器等辅助设备三、实验步骤1. 熟悉单片机实验开发板(1)观察开发板的硬件结构,了解各个模块的功能和连接方式。

(2)熟悉开发板上的按键、LED、串口、I2C、SPI等接口。

2. 编写程序(1)根据实验要求,设计程序功能。

(2)选择合适的编程语言(如C语言、汇编语言等)。

(3)使用编译器编写程序代码,并进行语法检查。

3. 程序调试(1)使用仿真软件(如Proteus)对程序进行仿真调试。

(2)观察程序运行结果,检查程序是否存在错误。

(3)根据仿真结果,修改程序代码,直至程序正常运行。

4. 硬件连接(1)根据程序功能,连接开发板上的相关硬件模块。

(2)确保连接正确,避免短路或接触不良。

5. 实验运行(1)打开电源,启动单片机。

(2)观察程序运行情况,验证程序功能是否实现。

(3)根据实验要求,调整程序参数或硬件配置,优化程序性能。

6. 数据采集与记录(1)使用示波器等设备,采集实验过程中的数据。

(2)记录实验数据,为后续分析提供依据。

7. 结果分析(1)对实验数据进行整理和分析,评估程序性能。

(2)总结实验过程中的经验教训,提出改进措施。

8. 实验报告撰写(1)整理实验过程,包括实验步骤、实验数据、实验结果等。

(2)分析实验结果,总结实验经验教训。

(3)撰写实验报告,要求格式规范、内容完整。

四、实验注意事项1. 确保实验环境安全,避免触电、短路等事故。

2. 严格遵守实验操作规程,避免损坏实验设备。

3. 注意程序调试过程中的细节,提高调试效率。

4. 实验过程中,积极思考,勇于创新,提高动手能力。

单片机按键实验报告

单片机按键实验报告

单片机按键实验报告篇一:单片机按键扫描实验报告键盘扫描一.实验目的(1)掌握矩阵键盘接口电路和键盘扫描编程方法。

(2)掌握按键值处理与显示电路设计。

二.实验任务(1)设计4*4键盘,编写各个键的特征码和对应的键值(0~F);(2)编程扫描按键,将按键对应的数字值使用数码管显示出来。

三.实验电路及连线方法1.采用动态显示连线方法:电路由2 片74LS573,1 个六字一体的共阴数码管组成。

由U15 输出段选码,U16 做位选码,与单片机的采用I/O 口连接方式,短路片J22 连接P2.0,J23 连接P2.3,做输出信号锁存。

(实际电路连接是d7-d6-d5-d4-d3-d2-d1-d0?h-c-d-e-g-b-a-f)。

PW12 是电源端。

2.键盘电路连线方法:电路由16 个按键组成,用P1 口扩展4×4 行列式键盘。

J20 是键盘连接端,连接到P1 口。

J21 是行列键盘、独立键盘选择端,当J21 的短路片连接2-3脚时,构成4×4 行列式键盘;当J21 的短路片连接2-1 脚时,可形成3×4 行列式键盘,4 个独立式按键S4、S8、S12、S16,这4 个独立按键分别连接P1.4~P1.7;其他12 个键3×4 行列式键盘。

PW15 是电源端。

四.编程思路1.采用反转法识别按键的闭合。

2.采用动态显示将键值显示出来。

五.算法流程图六.资源分配1.用P1口进行查找按键2.用R3做键值指针3.用R1做动态显示为选码指针。

4.R5为延时指针。

七.程序设计KPIN:ORG MOV MOV ANL MOV 0000H P1,#0F0H A,P1 A,#0F0H B,AMOVP1,#0FHMOVA,P1ANLA,#0FHORLA,BCJNE A,#0FFH,KPIN1AJMP EXITKPIN1: MOVB,AMOVDPTR,#TABKPMOVR3,#0KPIN2: MOVA,R3MOVC A,@A+DPTRCJNE A,B,KPIN3MOVA,R3LOOP: MOVR1,#0FEH;键盘动态显示 LOOP1: MOVA,R3ANLA,#0FHMOV DPTR,#TABMOVC A,@A+DPTRCLRP2.0CLRP2.1MOVP0,ASETB P2.0NOPCLRP2.0LOOP2: MOVA,R1;位选码MOVP0,ASETB P2.1MOVR5,#250LOOP3: DJNZ R5,LOOP3CLRP2.1SJMP LOOPKPIN3: INCR3CJNE A,#0FFH,KPIN2EXIT: RETTABKP: DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH,0EBHDB 0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,67H,0FFHTAB: DB77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH,5FHDB 79H,33H,7CH,3BH,1BHEND八.调试出现的问题及解决问题1:程序正常运行,但按键显示出现乱码解决:动态显示笔形码错误,并改正。

单片机调试实训报告

单片机调试实训报告

一、前言随着科技的飞速发展,单片机作为现代电子技术中不可或缺的核心部件,其在各个领域的应用日益广泛。

为了提高我们对单片机调试技能的掌握,我们开展了为期两周的单片机调试实训。

通过本次实训,我们不仅加深了对单片机基本原理的理解,还提高了实际操作能力和问题解决能力。

二、实训目的1. 熟悉单片机的硬件结构和工作原理。

2. 掌握单片机调试工具的使用方法。

3. 学会分析、解决单片机程序中的常见问题。

4. 提高动手实践能力和团队协作精神。

三、实训内容1. 单片机硬件电路搭建本次实训我们选择了51系列单片机作为调试对象,搭建了包括单片机、晶振、电源、复位电路、LED显示等基本硬件电路。

在搭建过程中,我们学习了电路原理图识读、焊接技术等基本技能。

2. 单片机程序编写与调试使用C语言进行单片机程序编写,实现了以下功能:- 控制LED灯闪烁。

- 通过按键实现LED灯亮灭切换。

- 使用定时器实现LED灯的呼吸灯效果。

- 通过串口通信实现单片机与PC之间的数据交互。

在编写程序过程中,我们学习了单片机寄存器配置、中断处理、定时器/计数器使用等编程技巧。

3. 单片机调试工具使用我们使用了Keil uVision软件进行单片机程序编译、烧录和调试。

通过学习,我们掌握了Keil软件的使用方法,包括项目管理、代码编辑、编译、调试等。

4. 调试过程中遇到的问题及解决方法在调试过程中,我们遇到了以下问题:- 程序编译错误:通过仔细检查代码和查阅相关资料,找出错误原因并进行修改。

- 硬件电路故障:通过检查电路连接和元器件质量,找出故障原因并进行修复。

- 程序运行不稳定:通过优化程序代码和调整硬件参数,提高程序运行稳定性。

四、实训心得1. 理论与实践相结合本次实训使我们将所学理论知识与实际操作相结合,加深了对单片机原理和调试技术的理解。

2. 培养动手实践能力在实训过程中,我们通过动手搭建电路、编写程序、调试程序等环节,提高了自己的动手实践能力。

单片机实验 带程序的

单片机实验  带程序的

五.实验步骤: 1. 连接电源线和串行口数据线; 2. 把P3.1接至P3.0孔,P1.0~P1.7分别接发光二极管 L1~L8孔。 3.打开DICE—5203 K实验开发系统的电源; 4. 启动计算机,打开桌面软件文件夹,选择MS51仿真 开发系统图标双击,进入软件编程界面; 5. 编制程序,调试、运行; 6. 从按键开关输入数字量,观察发光二极管的发光状 态,或从寄存器观察其对应数值。 六.思考题: 修改程序,使串行口工作于方式3或 2(考虑波特率)。
四、实验步骤 (一)定时/计数器T0延时实验 1、连接电源线和串行口数据线; 2、用插针将P1.0孔与发光二极管L1孔相连, P1.1孔与发光二极管L2孔相连; 3、打开DICE—5203 K实验开发系统的电源; 4、启动计算机,打开桌面软件文件夹,选择 MS51仿真开发系统图标双击,进入软件 编程界面; 5、编制程序,调试、运行; 6、观察发光二极管状态。
• void tim0(void) interrupt 1 using 1 • { EA=0; • i++; • j++; • if(i==20) • {P1_0=!P1_0; • i=0;} • if(j==100) • {P1_1=!P1_1; • j=0;} • TH0=(65536-50000)/256; • TL0=(65536-50000)%256; • EA=1; • }
ds-ms(int j) {uchar k; while(j--!=0) for(k=0,k<125,k++);}
void main (void) { uchar i,a; COM8255 =0x80; a =0x01; for(i=0,i<8,i++) {PB8255=a; ds-ms(500); a=a<<1; if(a==0)a=0x01; } }

单片机实验报告

单片机实验报告

单片机实验报告《单片机系统实验》实验报告院系:学号:姓名:2017年12月一、实验目的1.了解32位单片机(STM32系列)原理及其应用,熟悉单片机的资源,掌握单片机的最小系统设计及扩展技术,掌握单片机的编程语言。

2.通过本实验了解LCD液晶工作原理,能通过编程操作液晶的显示。

二、实验设备STM32实验系统一套,PC机一台。

三、实验原理(1)I/O口及定时器实验:STM32的GPIO口控制4个发光二极管,了解其硬件连接方式,学会使用STM32的一个定时器,掌握对定时器计时方式的编程。

编写程序循环点亮4个发光二极管,控制点亮时间为1秒钟闪烁。

(2)外部中断实验:掌握STM32单片机外部中断的用法,学会设置中断优先级,在实验(1)的基础上完成,如果有外部中断发生改变发光二极管的发光规律。

(如,仅其中2个灯亮,再次触发外部中断后,发光二极管重新变成4个灯循环点亮。

)(3)串行口通信实验:掌握STM32单片机与计算机之间的硬件连接方式,了解二者之间的传输协议,进行数据传输。

(4)LCD实验:掌握STM32单片机与液晶之间的硬件连接方式,单片机如何驱动液晶进行显示。

四、内容与步骤1.学会使用IAR或KEIL的编译链接调试环境,熟悉有关STM32使用到的库,并能顺利建立包含各种库文件的工程。

(2学时)2.I/O口实验:在建立工程的基础上能点亮发光二极管。

(2学时)3.定时器实验:循环定时(用定时器做)点亮4个灯,即每1秒闪烁点亮一个灯,循环往复(或叫跑马灯实验)。

(2学时)4.外部中断实验:按键作为触发外部中断的条件,中断发生时,改变发光二极管的点亮规律。

(2学时)5.串行口通信实验:编写串行口通信实验程序,能在计算机与STM32系统间进行ASCII码的传输。

(2学时)6.LCD实验:通过自行编写库文件和了解液晶显示字库,能在液晶上显示“北京航空航天大学机械工程及自动化学院”字样。

(6学时)五、关键代码1.I/O口及定时器实验/*通过定时器3中断函数实现跑马灯,现象为每个LED灯依次点亮1秒后熄灭*/void TIM3_IRQHandler(void){extern uint8_t LED_Status[5];if(TIM3->SR&0X0001)//溢出中断{if(LED_Status[1]==0){LED1_ON;LED2_OFF;LED3_OFF;LED4_OFF;LED_Status[1]=1;}else if(LED_Status[1]==1){LED1_OFF;LED2_ON;LED3_OFF;LED4_OFF;LED_Status[1]=2;}else if(LED_Status[1]==2){LED1_OFF;LED2_OFF;LED3_ON;LED4_OFF;LED_Status[1]=3;}else if(LED_Status[1]==3){LED1_OFF;LED2_OFF;LED3_OFF;LED4_ON;LED_Status[1]=0;}}TIM3->SR&=~(1<<0);//清除中断标志位}2.外部中断实验/*LED灯的发光规律有两种:一种是每个LED灯依次点亮1秒后熄灭,另一种是每次2个LED灯同时点亮,持续1秒后向前移动1个LED灯的位置。

工作报告之单片机数码管实验报告

工作报告之单片机数码管实验报告

单片机数码管实验报告【篇一:单片机实验报告——led数码管显示实验】《微机实验》报告led数码管显示实验指导教师:专业班级:姓名:学号:联系方式:一、任务要求实验目的:理解led七段数码管的显示控制原理,掌握数码管与mcu的接口技术,能够编写数码管显示驱动程序;熟悉接口程序调试方法。

实验内容:利用c8051f310单片机控制数码管显示器基本要求:利用末位数码管循环显示数字0-9,显示切换频率为1hz。

提高要求:在4位数码管显示器上依次显示当天时期和时间,显示格式如下: yyyy (年份)mm.dd(月份.日)hh.mm(小时.分钟)思考题:数码管采用动态驱动方式时刷新频率应如何选择?为什么?二、设计思路c8051f310单片机片上晶振为24.5mhz,采用8分频后为3.0625mhz ,输入时钟信号采用48个机器周期。

0到9对应的断码为:fch、60h、dah、f2h、66h、b6h、beh、e0h、feh、f6h 基础部分:由于只需要用末位数码管显示,不需要改变位码,所以只需要采用led的静态显示。

采用查表的方法,通过循环结构,每次循环查找数据表下一地址,循环十次后重新开始循环。

每次循环延时1s,采用定时器0定时方式1。

提高部分:四个数码管都要显示,所以采用led的动态显示。

由于数码管的位选由p0.7、p0.6控制,p0端口的其他引脚都没用到,所以对p0端口初始化赋00h,每次循环加40h、选中下一位,四次后十六进制溢出,p0端口变又为00h回到第一个数码管。

每位数码管显示一个段码后都延时1ms(否则数码管太亮,刺眼)采用定时器0定时方式1,依然采用查表法改变段码值。

通过循环: djnz r5,backmovr5,#250 djnz r4,back movr4,#8来控制每种模式的切换时间,我采用2s切换一次(8*250*1ms=2s)。

切换模式,可以采用改变查表法的偏移量来实现,没切换一次模式,偏移量加04h,三次后回到初始偏移量,来实现三种模式的循环显示。

单片机实验报告(学期全部实验)

单片机实验报告(学期全部实验)

单片机程序设计实验报告姓名:学号:专业班级:第二节课:实验一:1357,2468位置的灯交替闪烁一实验要求1357,2468位置的灯交替闪烁。

二硬件连接图与结果三原理简述程序直接控制LED各位置的灯亮灭,时间间隔简单的用了一个延时的语句。

四程序#include<reg51.h>main (){int i;P0=0XAA; //1357四个灯亮for (i=0;i<=25000;i++); //延时程序P0=0X55; //2468四个灯亮for (i=0;i<=25000;i++); //延时程序}五所遇问题与解决方式程序比较简单,没有遇到问题。

实验二:流水灯一实验要求流水灯,一个接一个的灯亮,亮到最后一个后,全部的灯亮,然后重头开始。

二硬件连接图与结果三原理简述程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转移到下一个灯,移位7次后全部的灯亮,最后定义整个循环。

时间间隔简单的用了一个延时的语句。

因为移位时是直接补0,发送低电平不亮,所以直接移位达到要求。

四程序//流水灯#include<reg51.h>main (){int i,j;while(1){P0=0X01; //第1个灯亮for (i=0;i<=30000;i++); //延时程序for(j=0;j<=7;j++) //移位循环程序{P0=P0<<1; //移位for (i=0;i<=30000;i++); //延时程序}P0=0xff; //全亮for (i=0;i<=30000;i++); //延时程序}}五所遇问题与解决方式程序比较简单,没有遇到问题。

实验三:跑马灯一实验要求一个接一个的灯亮,前面亮过的等依旧亮,直到最后一个灯,最后重新开始,循环。

二硬件连接图与结果三原理简述程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转移到下一个灯,移位7次后全部的灯亮,最后定义整个循环。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。

最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。

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

班级:12数控1 姓名:李嘉敏学号:2012984225
实验一查表实验
一、实验目的
1.掌握汇编语言编程软件的使用及调试方法
2.掌握查表指令MOVC的使用
3.熟悉整个实验流程实验步骤
二、实验内容
编写并调试一个查表程序,根据输入值不同查表得到不同值,比如求1-9的平方
三、实验设备
计算机、实验箱、keil uVision3软件、若干根连接电线、USB接线
四、实验步骤(过程)
1.将串口线与实验箱连接,将开关“kc”拨至上
2.查看仿真器的串口号
3.在keil中创建新项目
4.新建文件,添加源程序并保存
5.添加源代码文件到项目Source Group1中并设置好仿真驱动
6.编译检查
7.接好USB线以及其他接线,打开电源开关
8.按下“debug”进行调试
9.观看实验想象并记录数据
五、实验数据及结果(或者现象)
程序所得的结果是随着dptr的值的变化而r7的值也随之呈平方变化。

六、实验源程序
org 0000h
ljmp main
org 0030h
main: mov a, r7
mov dptr, #tab
mov a, @a+dptr
mov r7, a
tab: DB 00,01,04,09,16
DB 25,36,49,64,81
七、问题分析
1.问题:程序编译检查有错误执行不了。

解决方案:回头检查是源程序中
出现逻辑错误。

2.问题:实验箱的指示灯没有亮。

解决方案:检查各线路是否连接好。

八、思考题:
MOVC指令有几种格式?并写出来
答:两种。

分别是movc a,@a+dptr和movc a,@a+pc
实验二数据传送实验
一、实验目的
1.掌握MCS51单片机数据传送指令;
2.掌握MCS51单片机内部和外部数据存储空间的编程和调试方法
二、实验内容
编程实现单片机不同存储空间的数据传输
三、实验设备
keil uVision3软件、计算机
四、实验步骤(过程)
1.查看仿真器的串口号
2.在keil中创建新项目
3.新建文件,添加源程序并保存
4.添加源代码文件到项目Source Group1中并设置好仿真驱动
5.编译检查
6.按下“debug”进行调试
7.观看实验想象并记录数据
五、实验数据及结果(或者现象)
外部RAM的20h后八个地址存放的数据分别为0,3,8,9,57,43,63,
19
六、实验源程序
org 0000h
ljmp main
org 0030h
main: mov dptr,#tab
mov r0,#20h
mov r7,#8
loop2:clr a
movc a,@a+dptr
mov @r0,a
inc r0
inc dptr
djnz r7,loop2
mov r0,#20h
mov r7,#8
mov dptr,#0100h
loop1: mov a,@r0
movx @dptr,a
inc r0
inc dptr
djnz r7,loop1
here: ajmp here
tab:db 00,3,08,9,87,67,99,25
end
七、问题分析
因为电脑的读显结果为16进制,所以会与源程序中的十进制数进行自行转换。

八、思考题:
单片机从物理空间来说,有几个存储空间?从使用角度来讲,有几个空间?分别使用什么指令?
答:从物理空间来说,有四个存储空间,有256个RAN单元,使用数据传送指令、算数运算指令、逻辑运算指令;从使用角度来说,有三个空间,有128个RAN单元,使用移位类指令、控制转移类指令、位操作类指令。

实验三求极值实验
一、实验目的
1.掌握MCS51单片机跳转指令的使用
2. 掌握MCS51单片机循环程序的结构
二、实验内容
编程实现从N个数据里面找出最大值或者最小值
三、实验设备
keil uVision3软件、计算机
四、实验步骤(过程)
1.查看仿真器的串口号
2.在keil中创建新项目
3.新建文件,添加源程序并保存
4.添加源代码文件到项目Source Group1中并设置好仿真驱动
5.编译检查
6.按下“debug”进行调试
7.观看实验想象并记录数据
五、实验数据及结果(或者现象)
程序执行完后2bh地址存放的数据为tab中数据的最大数63 六、实验源程序
org 0000h
ljmp main
org 0030h
main: mov dptr,#tab
mov r0,#20h
mov r7,#8
loop2:clr a
movc a,@a+dptr
mov @r0,a
inc r0
inc dptr
djnz r7,loop2
mov r0,#20H
mov r7,#08H
mov a,@r0
dec r7
loop:inc r0
mov 2ah,@r0
cjne a,2h,chk
chk: jnc loop1
mov a,@r0
loop1:djnz r7,loop
mov 2bh,a
here: ajmp here
tab:db 00,3,08,9,87,67,99,25
end
七、问题分析
答:程序编译检查没有错误但执行不了,再次检查是否源程序出现逻辑错误
八、思考题:
利用DJNZ R1,LOOP指令实现循环,R1取几时循环次数最多?最多循环多少次?
答:255次;254次
实验四定时器实验
一、实验目的
掌握单片机内部定时器的应用
二、实验内容
编程实现每隔一段时间让A自动加1
或者编程实现输出方波
三、实验设备
keil uVision3软件、计算机
四、实验步骤(过程)
1.查看仿真器的串口号
2.在keil中创建新项目
3.新建文件,添加源程序并保存
4.添加源代码文件到项目Source Group1中并设置好仿真驱动
5.编译检查
6.按下“debug”进行调试
7.观看实验想象并记录数据
五、实验数据及结果(或者现象)
每个相应的设置时间,累加器便执行加1命令,数据随时间增加而逐渐增大六、实验源程序
org 0000h
ljmp main
org 0030h
main: mov tmod,#00h
mov th0,#0fch
mov tl0,#03h
setb tr1
loop:jbc tf1,loop1
ljmp loop
loop1:mov th0,#0fch
mov tl0,#03h
cpl p1.0
ljmp loop
end
七、问题分析
答:调试程序没有出现变化时要注意源程序的本身是否涉及外部RAN,若涉及则该程序不能执行。

八、思考题:
51单片机内部有几个定时器?定时器有几种工作方式?方式1最大定时时间?方式2最大定时时间?方式1和方式2有什么区别?
答:2个定时器。

4中工作方式。

方式1最大定时时间是131ms,方式2最大定时时间是255ms。

区别是方式1需要反复设置计数初值,而方式2具有重新加载计数初值的功能。

相关文档
最新文档