51单片机实例34-模拟开关灯
- 格式:pdf
- 大小:143.95 KB
- 文档页数:2
51单片机点亮一盏LED灯的原理解析单片机是指一种集成了微处理器核、存储器和外设接口的制作技术、封装技术等多种技术的集成电路芯片。
其中,51单片机是一种以Intel公司的80C51为核心的单片机。
点亮一盏LED灯是单片机入门的基础实验,通过这个实验可以学习到单片机的基本原理和操作方法。
点亮一盏LED灯的实验原理是通过单片机的I/O口控制LED的亮灭。
I/O口是单片机用于与外部设备进行数据交换的通道,可以通过它控制外部的电子元件。
LED是一种基本的显示元件,用来指示设备的运行状态。
在51单片机中,I/O口分为P0、P1、P2、P3四个8位I/O口,每一位可以控制一个LED。
其中P0口用来与外部设备进行数据交换,P1口是输入/输出口,P2口和P3口是专用输入/输出口。
首先,我们需要连接单片机与LED灯。
将单片机的VCC端连接到LED灯正极,将单片机的GND端连接到LED灯负极。
然后,选择一个合适的I/O口,将单片机的I/O引脚与LED的另一端连接。
接下来,我们需要编写程序控制LED的亮灭。
首先,需要包含头文件。
例如,在Keil C编译器中,我们需要使用“#include <reg52.h>”来包含51单片机的寄存器定义。
然后,我们需要定义LED的连接位置和状态。
例如,我们可以使用“sbit LED = P1^0;”来定义LED连接到P1口的第0位。
接着,我们需要编写主函数。
在主函数中,我们可以使用赋值语句来控制LED的亮灭。
例如,我们可以使用“LED = 1;”使LED亮起,使用“LED = 0;”使LED熄灭。
我们可以使用延时函数来控制LED的亮灭时间。
例如,我们可以使用“delay(1000);”使程序暂停1000毫秒。
综上所述,51单片机点亮一盏LED灯的原理是通过单片机的I/O口控制LED的亮灭,并通过编写程序来实现。
这个实验是单片机入门的基础实验,可以帮助初学者了解单片机的基本原理和操作方法。
51单片机控制LED灯程序设计首先,我们需要明确要使用到的硬件资源和引脚连接情况。
假设我们使用的是STC89C51单片机,LED灯的正极连接到单片机的P1口,负极通过电阻连接到地。
接下来,我们需要了解一些基本的汇编指令和编程规范。
在编写51单片机程序时,需要使用到一些特定的寄存器和指令。
首先是P1寄存器,它用来控制P1口的输出和输入状态。
然后是MOV指令,这是一个用来将数据从一个寄存器复制到另一个寄存器的指令。
最后是一个延时函数,可以利用循环来实现延时。
首先,我们需要初始化P1口为输出状态。
在51单片机中,IO口可以被配置为输入(1)或输出(0)。
我们可以使用MOV指令将0赋值给P1寄存器,将其配置为输出。
此外,我们还需要一个简单的延时函数,来控制LED灯的亮灭时间。
下面是一个基本的51单片机控制LED灯的程序:```assemblyORG0;程序的起始地址MOVP1,;初始化P1口为输出状态LOOP:;主循环MOVP1,;将P1的状态置为0,LED灯灭ACALLDELAY;调用延时函数,延时一段时间MOVP1,;将P1的状态置为1,LED灯亮ACALLDELAY;调用延时函数,延时一段时间JMPLOOP;无限循环DELAY:;延时函数MOVR3,;初始化循环计数器为250LOOP1:MOVR2,;初始化循环计数器为250LOOP2:MOVR1,;初始化循环计数器为250LOOP3:DJNZR1,LOOP3;内层循环DJNZR2,LOOP2;中层循环DJNZR3,LOOP1;外层循环RET;返回主程序```以上是一个简单的51单片机控制LED灯的汇编程序。
程序中通过不断切换P1口的状态来实现LED灯的亮灭。
同时,通过调用延时函数来实现亮灭的时间间隔。
在主循环中,LED灯会亮和灭各一段时间,然后无限循环。
为了将以上汇编程序烧录到单片机中,需要将其汇编为二进制文件。
通常可以使用Keil C等开发工具进行汇编和烧录操作。
目录目录 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:用指针数组作为函数的参数显示多个字符串46实例35:字符函数ctype.h应用举例48实例36:内部函数intrins.h应用举例48实例37:标准函数stdlib.h应用举例50实例38:字符串函数string.h应用举例 51实例39:宏定义应用举例2 52实例40:宏定义应用举例2 53实例41:宏定义应用举例3 53中断、定时器54实例42:用定时器T0查询方式P2口8位控制LED闪烁54 实例43:用定时器T1查询方式控制单片机发出1KHz音频 55 实例44:将计数器T0计数的结果送P1口8位LED显示56 实例45:用定时器T0的中断控制1位LED闪烁58实例46:用定时器T0的中断实现长时间定时59实例47:用定时器T1中断控制两个LED以不同周期闪烁61 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频63实例49:用定时器T0的中断实现"渴望"主题曲的播放64 实例50-1:输出50个矩形脉冲69实例50-2:计数器T0统计外部脉冲数71实例51-2:定时器T0的模式2测量正脉冲宽度71实例52:用定时器T0控制输出高低宽度不同的矩形波73 实例53:用外中断0的中断方式进行数据采集75实例54-1:输出负脉宽为200微秒的方波76实例54-2:测量负脉冲宽度77实例55:方式0控制流水灯循环点亮78实例56-1:数据发送程序81实例56-2:数据接收程序83实例57-1:数据发送程序84实例57-2:数据接收程序87实例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:矩阵式键盘实现的电子密码锁168液晶显示LCD 175实例81:用LCD显示字符'A' 175实例82:用LCD循环右移显示"Welcome to China" 181 实例83:用LCD显示适时检测结果188实例84:液晶时钟设计196一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控207实例85:将数据"0x0f"写入AT24C02再读出送P1口显示207实例86:将按键次数写入AT24C02,再读出并用1602LCD显示216实例87:对I2C总线上挂接多个AT24C02的读写操作 230实例88:基于AT24C02的多机通信读取程序241实例88:基于AT24C02的多机通信写入程序249实例90:DS18B20温度检测及其液晶显示 271实例91:将数据"0xaa"写入X5045再读出送P1口显示288实例92:将流水灯控制码写入X5045并读出送P1口显示295实例93:对SPI总线上挂接多个X5045的读写操作303实例94:基于ADC0832的数字电压表 311实例95:用DAC0832产生锯齿波电压 323实例96:用P1口显示红外遥控器的按键值324实例97:用红外遥控器控制继电器 328实例98:基于DS1302的日历时钟 333实例99:单片机数据发送程序351实例100:电机转速表设计 354//模拟霍尔脉冲363函数的使用和熟悉实例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; //将数组首地址存入指针p while(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 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;。
单片机原理实验指导书毕业论文第一章单片机系统板说明一、概述单片机实验开发系统是一种多功能、高配置、高品质的MCS-51单片机教学与开发设备。
适用于大学本科单片机教学、课程设计和毕业设计。
该系统采用模块化设计思想,减小了系统面积,同时增加了可靠性,使得单片机实验开发系统能满足从简单的数字电路实验到复杂的数字系统设计实验,并能一直延伸到综合电子设计等创新性实验项目。
该系统采用集成稳压电源供电,使电源系统的稳定性大大提高,同时又具备完备的保护措施。
为适应市场上多种单片机器件的应用,该系统采用“母板+单片机板”双层结构,通过更换不同型号单片机板,可实验不同的单片机,适应了各院校不同的教学需求。
二、单片机板简介本实验系统因为自带了MCS-51单片机系统,因此没有配置其他单片机板,但可以根据教学需要随时配置。
单片机板置于母板的上方,单片机板的电源由母板供给,每一块单片机板上都引出所有I/O接口,可以很方便的完成所有实验。
因此使得单片机板可与母板配合形成一个独立的实验系统。
1、主要技术参数(1)MSC-51单片机板板上配有ATMEL公司的A T89S51芯片。
AT89S51资源:32个I/O口;封装DIP40。
AT89S51开发软件:KEIL C51。
2、MSC-51单片机结构(1)单片机板中央放置一块可插拔的DIP封装的AT89S51芯片。
(2)单片机板左上侧有一个十针插口,用于下载程序。
(3)单片机板的四周是所有I/O引脚的插孔,旁边标有I/0引脚的脚引。
(4)单片机板与母板配合使用时,可形成—个完整的实验系统。
三、母板简介主要技术参数(1)实验系统电源实验系统内置了集成稳压电源,使整个电源具有短路保护、过流保护功能,提高了实验的稳定性。
主板的右上角为电源总开关,当把220V交流电源线插入主板后,打开电源开关,主板得电工作。
为适用多种需要,配置了+5V,+12V,—5V电压供主板和外设需要,通过右上角的插针排和插孔输出到外设。
51单片机模拟交通灯利用51 单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30 秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3 秒黄灯亮2 秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码仿真图程序源代码如下:作者:胡琴联系qq:1257394091 网站:51hei 本程序已经通过软件仿真以及在自己搭建的硬件上测试通过0000hajmp mainorg 000bhajmpinti0org 0030hmain:mov tmod,#01h mov ie,#82h mov th0,#4ch mov tl0,#00h mov sp,#60h mov 31h,#30 ;东西绿灯初值30 秒mov 32h,#30 ;南北红灯初值30 秒clr4fh ;清标志位clr p1.1 ;开东西绿灯clr p1.5 ;开南北红灯setb tr0 ;启动T0loop:lcall display ;调用显示子程序lcall key ;调用应急按键判断ajmp loopinti0:push psw clr ea mov th0,#4ch mov tl0,#00h inc 35h mov a,35h cjne a,#20,out ;判1 秒是否到时mov 35h,#00 jb 4fh,yi ;判别标志位dec 31h ;东西时间每秒减1 dec 32h ;南北时间每秒减1 mov a,31h cjne a,#05,out ;判是否到25 秒setb p2.0 ;到25 秒关时间显示setb p2.1 setb p1.1 ;东西绿灯闪灭3 秒lcall del500ms clr p1.1 lcall del500ms setb p1.1 lcall del500ms clr p1.1 lcall del500ms setb p1.1 lcall del500ms clr p1.1 lcall del500ms setb p1.1 ;灭东西绿灯sjmp erout:setb ea pop pswreti er:clr p1.2 ;东西黄灯亮2 秒mov 33h,#4 ;延时2 秒loop1:lcall del500ms djnz 33h,loop1 setb p1.2 ;2 秒后灭东西黄灯clr p2.0 ;5 秒后开时间显示clr p2.1 mov 31h,#20 ;东西时间赋20 秒初值mov 32h,#20 ;南北时间赋20 秒初值setb 4fh setb p1.5 ;关南北红灯clr p1.0 ;点亮东西红灯clr p1.6 ;点。
基于51单片机的模拟交通灯/*----------------------------------------------- 注:P1 口连接至LED 用于显示红绿灯,P0 口接数码管段码,用于显示时间;两个74HC573 控制段码和位码。
段码接P20,位码接P21------------------------------------------------*/#include#define uchar unsigned char#define uint unsigned intsbit DUAN=P2;sbit WEI=P2;/*-------- ---------------------------------------- 全局变量------------------------------------------------*/bit red,green,yellow,turnred;//定义红绿黄灯标志位code unsigned char tab[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79, 0x71,0x00} ; //共阴数码管0-9uchar shi,ge;/*------------------------------------------------------------------------------------------------*/void delay(uint t){while(t--);}/*------------------------------------------------ 主程序------------------------------------------------*/main() {TMOD |=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;//开中断ET0=1;TR0=1;//开定时器P1=0xfc;//红灯亮red =1;while(1) {WEI=1;P0=0xfe;WEI=0;DUAN=1;P0=shi;//显示十位DUAN=0;delay(300);WEI=1;P0=0xfd;WEI=0;DUAN=1;P0=ge;//显示十位DUAN=0;delay(300); }}/*------------------------------------------------ 定时器0 中断函数------------------------------------------------*/void tim(void) interrupt 1{static uchar second=60,count;TH0=(65535- 50000)/256;TL0=(65535-50000)%256;count++;if (count==20) { count=0; second--;// 秒减1if(second==0) { if(red) { red=0;yellow=1; second=5; P1=0xF3;//黄灯亮5 秒} else if(yellow && !turnred) { yellow=0;green=1; second=50; P1=0xCF;//绿灯亮50 秒} else if(green) { yellow=1;green=0; second=5; P1=0xF3;//黄灯亮5 秒turnred=1; } else if(yellow && turnred) { red=1;yellow=0; P1=0xFC;//红灯亮60 秒second=60; turnred=0; } }shi=tab[second/10]; ge=tab[second%10]; }}tips:感谢大家。
《单片机原理及应用》实验指导书(C语言)《单片机原理及应用》实验指导书(C语言)某某大学物电学院微机教研室某某2022前言由于单片机具有高可靠性、超小型、低价格、容易产品化等特点,在仪器仪表智能化、实时工业控制、实时数据采集、智能终端、通信设备、导航系统、家用电器等控制应用领域,具有十分广泛的用途。
由于目前在国内单片机应用中,MCS-51系列单片机仍然是一种主流单片机,所以本实验指导书为学习MCS-51单片机的学生,配合《单片机原理及应用》课程的教学,结合本学院自制单片机教学实验板编写了这本实验指导书。
《单片机原理应用及》是一门实践性很强的课程,提高教学质量的一个重要环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习接口电路和外设与计算机的连接,或者软硬兼施地研制单片机应用系统,不通过加强动手是不能获得预期效果的。
本实验指导书提供多个实验的指导性材料,有些实验还有一些有一定难度的选做项目,可以根据课时的安排和教学要求进行取舍。
为了达到某些实验的目的,书中提供的参考程序与实际应用中的程序会有些差别,所以不一定是最优的。
由于时间紧迫,需要赶课程进度与实验时间的同步,加上编者学识有限,如有不妥之处,欢迎读者批评指正。
实验须知1.实验前必须阅读教科书的有关部分和本实验指导书,了解实验目的、内容、步骤,做好实验前的准备,编写好实验中要求自编或修改的程序;完成实验前要求完成的准备工作后方可以上机实验,否则不得上机操作。
2.各种电源的电压和极性不能接错,严禁带电接线和接插元器件。
通电前须经过指导教师检查认可后方能通电。
3.不准随意拨弄各种与实验无关的旋钮和开关,凡与本次实验无关的任何设备都禁止动用和摸弄,注意安全。
4.严禁用手触摸实验系统印制电路板和元器件的引脚,防止静电击穿芯片。
5.实验中若损坏仪器或元器件,应及时向指导教师报告。
6.在实验室内保持安静和卫生,不得随意走动和喧哗,集中精力完成实验。
7.实验完成后,关掉电源,及时整理实验台桌面,保持环境整洁。
51单片机按键控制花样灯时间:2012-09-10 13:50:11 来源:51hei 作者:/***************************************************** 本程序实现用按键控制花样灯。
** 当K1按下时,灯从0xfe向左跑一遍;** 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置;** 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。
* * 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。
** 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。
*******************************************************/*************************************************连接方法:P0接独立按键JP5;P2接LED灯接口JP1 ************************************************************/#include <reg52.h> //头文件,函数声明#include <intrins.h>//定义按键所在位sbit K1=P0^0;sbit K2=P0^1;sbit K3=P0^2;sbit K4=P0^3;sbit K5=P0^4;unsigned char led;unsigned char j;void delayms(unsigned char ms) // 1ms标准延时{while(ms--){for(j=0;j<110;j++); //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确}}void main(){ //P2=led;unsigned int i;while(1){/********************************************** 当K1按下时,灯从0xfe向左跑一遍; **********************************************/if(K1==0)delayms(10); //消除键盘抖动if(K1==0){led=0xfe;for(i=0;i<7;i++) //i可以去8的倍数,表示本电路执行多少次{//led=0x7f; // P端口的初定义要在循环外面,不然会使效果错乱P2=led; //由于这里已经初设一个灯,所以for里面要加上这一个delayms(100); //起初这里设置500MS,使按键每按一下灯彩走一个,不能达到要求。
51单片机从零开始基于protues和keil uv4的开关控制首先是keil uv4的程序由于是入门篇第一讲,我将如何建立工程给大家稍微说一下点击project-new uvision project建立新的工程在此我们可以选择工程的存放目录选择好目录后在文件名处写上工程名,工程名支持中文和英文。
(后缀无需写,程序会自动补充)我们会遇到这样的界面,由于本教程是针对51系列单片机的,所有我们下拉选择atmel的at89c51作为最初的选择,后续的如at89c52.at89c516等都是一样的他们是51的同类或者说更高的版本选择at89c51后系统会提示你是否需要历程(额英语真心不好,大致是这意思)我们选择否后自己进行编程新建文件保存文件名(注意,用c语音编程需要在文件名后加.c 如led.c)下面我们双击左边的source group会见到这样的选项,意思是选择将文件添加至工程我们双击led.c即可添加至工程文件里。
(注:多次点击会出现如上提示,意味已添加的不能再次添加,我们关闭即可)关于keil的准备工作完成下面开始编程以下是第一个例程,关于单片机通过开关控制led亮灭#include<reg51.h>sbit a=P0^0;//定义led灯的接口为P0^0 等号前为自由定义的自变量(注意不能用关键字定义)sbit key=P0^1;//定义开关的接口为P0^1void main(){while(1)//无限循环,采用扫描模式,不断扫描P0^1口,即开关是否闭合{if(key==0)//当开关闭合时()a=0;//led点亮注:led低电平点亮=0意味低电平elsea=1;//led熄灭}}。
1 • 实验任务如图4.1.1所示:在端口上接一个发光二极管 L1,使L1在不停地一亮一灭, 亮一灭的时间间隔为秒。
2. 电路原理图图 4.1.13. 系统板上硬件连线 把“单片机系统”区域中的端口用导线连接到“八路发光二极管指示模块”区 域中的L1端口上4. 程序设计内容(1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要 求的闪烁时间间隔为秒,相对于微秒来说,相差太大,所以我们在执行 某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是 如何设计呢下面具体介绍其原理:1 •闪烁灯13FO OJADQ FO 1 /AD] FO.2/AD2FCi 3j*AOTi PO 4/AE>4FtJ.6fAO& i^U.7/AD7 五尿5¥ 尸二 7/Jk 1 J5 尸 NG/-A 1 ■* J -i/JL U P2 /IfA1 J RZ W 1 1 g3劇 in P3 L/A91 F3 G/AHF-Ji CJ/I2CDI rTZK Gpj 3/1H T1 P^JS/T 1£/暫冠理监居.■V 11111111 PPP沪厂JLH 甘r3Hb如图4.1.1所示的石英晶体为12MHz因此,1个机器周期为1微秒机器周期微秒= ___________ ___________ MOV R6,#20 2 个2L ______ D1: MOVR7,#248 2 个2 2+ 2X 248= 498 20X =— DJNZ R7,$ 2 个2X 248 (498DJNZ R6,D1 2 个2X 20= 40 10002因此,上面的延时程序时间为。
由以上可知,当R6= 10、R7= 248时,延时5ms R6= 20、R7= 248时,延时10ms,以此为基本的计时单位。
如本实验要求秒=200ms 10m X R5=200ms贝U R5= 20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当端口输出高电平,即二1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当端口输出低电平,即二0时,发光二极管L1亮;我们可以使用SETB指令使端口输出高电平,使用CLR 指令使端口输出低电平。
引言:51单片机是一种广泛应用于嵌入式系统的微控制器,具有低功耗、易编程、性能稳定等特点。
而继电器则是一种常用的电气开关设备,可以实现对电路的远程控制。
本文将探讨如何使用51单片机控制继电器,介绍电路连接方式、编程实现方法以及常见应用案例。
概述:51单片机控制继电器是一种常见的嵌入式系统应用。
通过合理的电路连接和编程实现,可以实现对继电器的远程控制,从而控制电路的通断状态。
本文将从五个方面对51单片机控制继电器进行详细介绍。
正文:一、电路连接方式1.电源连接a.正确选择电源电压和电源类型b.连接稳压电路2.51单片机引脚连接a.确定控制继电器的引脚b.连接引脚到51单片机3.继电器连接方式a.根据继电器类型选择合适的连接方式b.连接继电器到电路二、编程实现方法1.了解51单片机的编程语言a.学习C语言b.掌握51单片机的特定指令2.基本控制指令a.设置引脚输入输出状态b.控制引脚高低电平3.继电器控制程序设计a.编写继电器控制函数b.调用函数实现对继电器的控制4.通信接口实现a.添加通信模块b.编程实现通信接口5.控制逻辑设计a.利用条件语句实现控制逻辑b.调试程序并提高效率三、常见应用案例1.家居自动化a.控制电灯开关b.控制窗帘的打开和关闭2.工业控制a.控制机器设备的启停b.监控温度、湿度等参数3.安防系统a.控制门禁系统b.控制报警器的开启4.智能农业a.控制灌溉系统b.控制温室内环境5.物联网应用a.控制智能家电b.实现远程监控和控制总结:51单片机控制继电器是一种常见的嵌入式系统应用,通过适当的电路连接和编程实现,可以实现对继电器的远程控制。
本文从电路连接方式、编程实现方法和常见应用案例等方面进行了详细介绍,希望能对读者在实际应用中提供一定的帮助和指导。
同时,读者在使用过程中应注意安全问题,合理使用继电器,确保电路的稳定运行。
引言:51单片机作为一种常用的微控制器,具有体积小、功耗低、性能稳定等特点,被广泛应用于各种控制系统中。
51单片机C语言编程100例1. 前言在学习嵌入式系统开发中,单片机是必不可少的一个组成部分。
而在单片机的编程语言中,C语言因其易学易用、灵活性高等特点而备受青睐。
本文将介绍51单片机C语言编程的100个实例,旨在帮助读者更加深入地理解和掌握这一领域的知识。
2. 闪烁LED灯实例1:使用51单片机编程控制一个LED灯的闪烁,实现简单的开关控制。
3. 延时程序实例2:编写一个延时程序,用于控制LED灯的延时亮灭,实现不同频率的闪烁效果。
4. 数码管显示实例3:通过编写程序,使用数码管显示数字0-9,实现简单的计数功能。
5. 矩阵键盘输入实例4:通过编程实现对矩阵键盘的输入检测和处理,实现对不同按键的响应。
6. PWM输出实例5:使用51单片机的PWM输出功能,控制LED灯的亮度调节。
7. 温度传感器读取实例6:通过温度传感器读取模块,实现温度的检测和显示。
8. 模拟信号采集实例7:通过编程实现对模拟信号的采集和处理,实现对外部信号的监测和控制。
9. 串口通信实例8:使用51单片机的串口通信功能,实现单片机与计算机之间的数据传输。
10. 蜂鸣器控制实例9:通过编程控制蜂鸣器的开关,实现不同频率的声音发声。
11. 数字口输入检测实例10:通过编程实现对数字口输入状态的检测和处理,实现对外部信号的监测和控制。
12. 定时器中断实例11:使用51单片机的定时器中断功能,实现定时任务的执行和控制。
13. PWM输出调制实例12:使用数字口和定时器实现PWM波形的调制和输出控制。
14. 蓝牙通信实例13:通过蓝牙模块实现51单片机与手机之间的数据通信,实现简单的远程控制。
15. 温湿度传感器读取实例14:通过温湿度传感器读取模块,实现温湿度的检测和显示。
16. 步进电机控制实例15:通过编程控制步进电机的转动和方向,实现简单的运动控制。
17. 超声波测距实例16:通过超声波测距模块,实现对距离的检测和显示。
18. 电机驱动控制实例17:通过编程和电机驱动模块,实现电机的转动和速度控制。
51单片机流水灯程序摘要:51单片机流水灯程序是一种基本的嵌入式软件设计实例,通过控制多个LED灯的开关状态和时间间隔,实现流水灯效果。
本文将介绍51单片机的基本原理和流水灯程序的设计方法,并给出代码实现。
一、引言51单片机是一种常见的嵌入式微控制器,广泛应用于电子产品和工业控制领域。
流水灯是单片机学习者最常接触的实例之一,通过控制多个LED灯的点亮和熄灭顺序,可以实现各种不同的流水灯效果。
二、51单片机基本原理51单片机是基于哈佛结构的8位微控制器,具有强大的计算和控制能力,并且具备多种IO口用以连接外部设备。
51单片机的核心是8051核心,通过内部的计数器和时钟控制器,可以实现对程序的精确控制。
在51单片机中,IO口可以配置为输入模式或输出模式,并且可以通过编程控制其电平状态。
因此,通过对多个IO口的控制,可以实现流水灯的效果。
三、流水灯程序设计1. 硬件准备在开始编程之前,需要准备以下硬件设备:- 51单片机开发板- 8个LED灯- 连接线2. 软件开发环境51单片机的软件开发可以使用多种集成开发环境,如 Keil C51、SDCC 等。
本文以 Keil C51 为例进行说明。
3. 程序设计步骤流水灯程序的设计步骤如下:(1)配置IO口为输出模式;(2)设置计时器和时钟控制器;(3)编写循环程序,控制LED灯的开关和时间间隔;(4)下载程序并运行。
4. 程序示例下面是一个简单的51单片机流水灯程序示例:```c#include <reg51.h>void main(){// 配置P1口为输出模式 P1 = 0x00;while (1){// 点亮第一个LED P1 = 0x01;// 延时delay();// 点亮第二个LED P1 = 0x02;// 延时delay();// 点亮第三个LEDP1 = 0x04;// 延时delay();// 点亮第四个LED P1 = 0x08;// 延时delay();// 点亮第五个LED P1 = 0x10;// 延时delay();// 点亮第六个LED P1 = 0x20;// 延时delay();// 点亮第七个LEDP1 = 0x40;// 延时delay();// 点亮第八个LED P1 = 0x80;// 延时delay();}}void delay(){unsigned int i,j;for(i=0;i<1000;i++) {for(j=0;j<1000;j++); }}```在上述程序中,我们首先通过 `P1 = 0x00` 将P1口配置为输出模式。
51单⽚机实例(含详细代码说明)1.闪烁灯1.实验任务如图4.1.1所⽰:在端⼝上接⼀个发光⼆极管L1,使L1在不停地⼀亮⼀灭,⼀亮⼀灭的时间间隔为秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单⽚机系统”区域中的端⼝⽤导线连接到“⼋路发光⼆极管指⽰模块”区域中的L1端⼝上。
4.程序设计内容(1).延时程序的设计⽅法作为单⽚机的指令的执⾏的时间是很短,数量⼤微秒级,因此,我们要求的闪烁时间间隔为秒,相对于微秒来说,相差太⼤,所以我们在执⾏某⼀指令时,插⼊延时程序,来达到我们的要求,但这样的延时程序是如何设计呢下⾯具体介绍其原理:如图4.1.1所⽰的⽯英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上⾯的延时程序时间为。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求秒=200ms,10ms×R5=200ms,则R5=20,延时⼦程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所⽰,当端⼝输出⾼电平,即=1时,根据发光⼆极管的单向导电性可知,这时发光⼆极管L1熄灭;当端⼝输出低电平,即=0时,发光⼆极管L1亮;我们可以使⽤SETB 指令使端⼝输出⾼电平,使⽤CLR 指令使端⼝输出低电平。
5.程序框图如图4.1.2所⽰图4.1.26.汇编源程序ORG 0START: CLRLCALL DELAYSETBLCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时⼦程序,延时秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语⾔源程序#include <>sbit L1=P1^0;void delay02s(void)4.2.14.2.14.2.24.3.14.3.14.3.20F0F4.4.14.4.14.4.24.5.1 4.5.20F0F0F0F7f7f7f7f4.6.14.6.2实验任务如图13所⽰,利⽤AT89S51单⽚机的P0端⼝的-连接到⼀个共阴数码管的a-h的笔段上,数码管的公共端接地。
基于51单⽚机的红绿灯实现(使⽤普中科技开发板)C语⾔基础⽐较薄弱,红绿灯的倒计时和切换上,⽤了三个if()嵌套,总感觉应该有更好的⽅案,如果你恰巧知道,请教教我,在此谢过。
以下是程序部分://红绿灯设计:利⽤定时器实现LED灯亮灭,数码管倒计时结束后切换led灯//P2⼝控制led灯,38译码器选择数码管,P0⼝控制数码管显⽰//定时器初始化设置,定时器溢出⼀次为10ms,设置⼀个变量a=99,a从99-->0,正好100次,也就是1s。
#include"reg52.h"typedef unsigned int uint; //对数据类型进⾏声明定义typedef unsigned char uchar;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit LED0=P2^7; //红灯sbit LED1=P2^6; //绿灯sbit LED2=P2^5; //黄灯uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显⽰0~F的值uchar DisplayData[2]; //创建⼀个数组,⽤于存放倒计时的⼗位和个位uchar a=99,flag=0,sec=15; //a:100次等于1秒(配合定时器使⽤),flag:对应三种灯 sec:倒计时//延时函数void delay(uchar i){while(i--);}//数码管显⽰,这⾥只需要使⽤两个数码管//通过138译码器选择对应的数码管void Digdisplay(){uchar i;for(i=0;i<=1;i++){switch(i){case(0):LSA=0;LSB=0;LSC=0;break;case(1):LSA=1;LSB=0;LSC=0;break;}P0=DisplayData[i]; //将当前的时间传递给P0,并显⽰出来delay(100);P0=0x00; //消隐}}//将当前的时间和smgduan[]内已保存的16进制值对应,接着会通过Digdisplay()显⽰void Datapros(){DisplayData[0]=smgduan[sec%10];DisplayData[1]=smgduan[sec/10];}//定时器初始化void TimerInit(){TMOD=0x01; //选择定时器0TH0=0Xd8; //10毫秒TL0=0Xf0;EA=1;ET0=1;TR0=1;}void red() //红灯倒计时{if(flag==0) //flag初始值为0,从红灯开始亮(红-->绿-->黄) {LED2=1; //黄灯灭LED0=0; //红亮if(a==0) //a=0,⼀秒过去,倒计时sec-1{a=99; //重置a,开始下⼀秒sec--; //倒计时sec-1if(sec==0) //sec=0,红灯结束,绿灯开始{flag=1; //绿灯的flagsec=15; //给绿灯定时}}}}void green() //绿灯{if(flag==1){LED0=1;LED1=0;if(a==0){a=99;sec--;if(sec==0){flag=3;sec=3;}}}}void yellow() //黄灯{if(flag==3){LED2=0;LED1=1;if(a==0){a=99;sec--;if(sec==0){flag=0;sec=15;}}}}void Timer() interrupt 1 //中断{TH0=0Xd8; //10毫秒TL0=0Xf0;a--; //a的初始值为100,TH0和TL0溢出⼀次,a-1,a=0时,正好⼀秒 red();green();yellow();}void main(){TimerInit();while(1){Datapros();Digdisplay();}}。
51单片机简单程序实例
51单片机是一种常用的微控制器,下面我将给出一个简单的LED闪烁程序作为示例。
c.
#include <reg51.h>。
void delay() {。
int i, j;
for (i = 0; i < 500; i++)。
for (j = 0; j < 500; j++);
}。
void main() {。
while (1) {。
P1 = 0x00; // 关闭LED.
delay();
P1 = 0xFF; // 打开LED.
delay();
}。
}。
这是一个使用C语言编写的简单的51单片机程序。
程序的功能是让单片机控制开发板上的一个LED灯以一定的频率闪烁。
程序的主要部分是一个无限循环(`while(1)`),在循环中LED先被关闭然后延时一段时间,再被打开然后再延时一段时间,如此循环。
在这个示例中,我们使用了`P1`端口来控制LED的开关,
`0x00`表示关闭LED,`0xFF`表示打开LED。
`delay`函数用来产生时间延迟,以控制LED闪烁的频率。
这只是一个非常简单的示例,51单片机的功能远不止于此。
它可以用来控制各种外围设备,比如数码管、液晶显示屏、电机等,也可以用来实现各种功能,比如定时器、计数器、通信接口等。
希望这个简单的示例能够帮助你初步了解51单片机的编程。