100个51单片机项目
单片机汇编语言经典一百例

51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。
实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。
实际应用例如:定时报警器。
程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。
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显示。
51单片机写的项目

51单片机写的项目
7. 电子门锁:使用51单片机和密码输入模块,设计一个电子门锁系统,可以通过输入正 确的密码来开启门锁。
8. 智能灌溉系统:利用51单片机和湿度传感器,设计一个智能灌溉系统,可以根据土壤 湿度自动控制灌溉设备的开关。
51单片机写的项目
51单片机是一种经典的单片机型号,广泛应用于嵌入式系统和电子设备中。以下是一些 常见的基于51单片机的项目示例:
1. 温度监测系统:使用51单片机和温度传感器,设计一个温度监测系统,可以实时监测 环境温度,并将数据显示在液晶显示屏上。
2. 电子琴:利用51单片机的IO口和蜂鸣器,设计一个简单的电子琴,可以发出不同音调 的声音,通过按键控制。
3. 智能家居控制系统:使用51单片机和各种传感器,设计一个智能家居控制系统,可以 实现对家居设备(如灯光、窗帘、空调等)的远程控制和自动化控制。
51单片机写的项目
4. 智能车辆:利用51单片机和各种传感器(如外线传感器、超声波传感器等),设计 一个智能车辆,可以实现避障、跟随等功能。
5. 电子时钟:使用51单片机和数码管,设计一个电子时钟,可以显示当前的时间,并具 备闹钟功能。
这些项目只是一些常见的示例,基于51单片机的项目种类繁多,可以根据实际需求和兴 趣进行创新和扩展。
51单片机C语言编程100例-单片机c语言编程

51单片机C语言编程100例-单片机c语言编程51单片机C语言编程100例在嵌入式系统领域,单片机是常用的硬件平台之一。
而C语言作为一种高级编程语言,能够为单片机编程提供更高的效率和便利性。
本文将介绍51单片机C语言编程的100个实例,帮助读者了解并掌握单片机的基本编程技巧和应用方法。
一、LED灯控制1. 实例介绍:通过控制51单片机的IO口输出,实现对LED灯的亮灭控制。
2. 实例代码:```#include <reg51.h>sbit LED = P1^0; // 定义P1口的第0位为LEDvoid main(){while(1){LED = 0; // LED灯亮delay(1000); //延时1秒LED = 1; // LED灯灭delay(1000); //延时1秒}}```二、数码管显示1. 实例介绍:使用数码管显示数字0-9,并实现数码管的动态显示效果。
2. 实例代码:```#include <reg51.h>unsigned char code DispTab[] ={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82};sbit WeiDu = P1^2;sbit DUAN = P1^0;void delay(unsigned int t){unsigned int i;while(t--)for(i=0;i<125;i++);}void main(){unsigned int i;while(1){P0 = DispTab[i]; // 显示数字iDUAN = 1; //点亮段码DUAN = 0; //关闭段码P0 = ~(0x01 << i); // 选择数码管的位 WeiDu = 0; // 打开选通位WeiDu = 1; // 关闭选通位delay(100); // 延时100msi++;if(i > 9) i = 0;}}```三、外部中断1. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
100个51单片机项目

D1-基于单片机的数字电压表设计D2-基于单片机的智能电压表设计(温度检测器)D3-基于单片机的LED流水灯系统设计D4-基于单片机的智能船模设计D5-基于单片机的电梯控制模型设计D6-基于单片机的水位控制系统设计D7-基于单片机的水位控制系统设计(STC89—51型)D8-基于单片机的多路数据采集系统设计D9-基于单片机的抢答器设计D10-基于单片机的数字温度计设计D11-基于单片机的智能小车设计D12-基于单片机的数字温度计设计D13-基于单片机的遥控器设计D14-基于单片机的串行通信发射机设计D15-基于单片机的简易智能电动车设计D16-基于单片机的太阳能热水器控制器设计>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<D17-基于单片机的太阳能热水器控制器设计D18-MCS-51单片机温度控制系统的设计D19-直流电动机的转速检测与脉宽调速D20-基于单片机的智能机器人的设计D21-基于单片机的简易无线竞赛系统的设计D22-基于单片机的车辆闯红灯监控系统设计(89C51)D23-基于单片机控制的井下瓦斯监控系统设计D24-基于单片机的煤气泄漏检测报警装置设计D25-基于单片机的井式渗碳炉控制系统设计D26-基于单片机的蔬菜大棚温湿度智能控制系统设计D27-基于单片机的电子钟设计D28-基于单片机的电力线载波节电群控设计D29-基于单片机的液位控制器设计(8051)D30-基于单片机的串行通信发射机设计(版本2)D31-基于单片机的智能八路抢答器设计(A T89C2051)D32-基于单片机的水位监控器设计(STC12C2052AD)D33-基于单片机的点阵电子显示屏设计(版1)D34-基于单片机的智能温度控制系统设计D35-基于单片机的智能时钟控制器设计D36-基于单片机的智能温控系统设计(版本1)D37-基于单片机的智能寻迹避障小车设计D38-基于单片机的家用太阳能热水器控制器设计D39-基于单片机的新型抢答计分器设计D40-基于单片机的热敏电阻测温系统设计>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<D41-基于单片机的林火监测系统-飞艇姿态控制系统设计D42-基于单片机的人性化时钟控制器设计D43-基于单片机的智能型电话远程遥控器设计D44-基于单片机的远程通讯控制器设计D45-基于单片机的温度控制器设计D46-基于单片机的智能水位控制器设计D47-基于单片机的水位控制系统设计(版本1)D48-基于单片机的智能电动小车设计D49-基于单片机的数码电子时钟设计D50-基于单片机的数控直流电源设计D51-基于单片机的交通灯控制器设计D52-基于单片机的数字温度计设计(STC89C51)D53-基于单片机的智能小车设计D54-基于单片机的温度控制器设计>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<D55-基于单片机的串行通信发射机设计(版本3)D56-基于单片机的温度控制系统设计(版本1)D57-基于单片机的交通灯控制系统设计D58-基于单片机的电子万年历设计D59-基于单片机的水位控制器设计D60-基于单片机的水位控制系统设计(版本2)D61-基于单片机的数据采集器设计D62-基于单片机的水位控制系统设计(版本3)D63-基于单片机的电梯控制系统设计D64-基于单片机的智能温控系统设计(版本2)D65-基于单片机的温度控制系统设计(版本2)D66-基于单片机的数据采集与传输系统设计D67-基于单片机的交通灯控制系统设计(版本1)D68-基于单片机的交通灯控制系统设计(版本2)D69-基于单片机的红外防盗报警器设计D70-基于单片机的花卉温室控温系统设计D71-基于单片机的焊机温度控制系统设计(89C51)(版式一) D72-基于单片机的焊机温度控制系统设计(版式二)D73-基于单片机的路灯控制器设计D74-基于单片机技术的水位控制器设计(8051)D75-基于单片机的车床刀架控制系统设计(MCS-51)D76-基于单片机的电机智能综合保护装置设计D77-基于单片机的水位控制器设计(STC89C51)D78-基于单片机的水位控制器设计(STC89C51+水泵)D79-基于单片机技术的自动停车器的设计D80-基于ARM的嵌入式图形用户界面设计>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<D81-基于单片机的太阳能热水器控制器设计(版本3)D82-基于单片机的太阳能热水器控制器设计(版本4)D83-基于单片机的智能型矿用磁力启动器设计(PIC16F877A单片机)D84-基于单片机的无氧退火炉温控系统设计(8031)D85-基于单片机的电厂锅炉过热蒸汽温度监测系统设计(MCS-51)D86-基于单片机的摩托车里程表研制D87-基于PIC16F84单片机的IC卡智能水表设计D88-基于单片机的自动车库门的设计D89-基于单片机的自动滴灌控制系统的设计D90-基于单片机的预付费电度表设计D91-基于单片机的智能电子秤设计D92-基于单片机的太阳能热水器智能控制器设计D93-基于单片机的油井巡视定位系统设计D94-基于单片机的照明控制系统D95-基于单片机的水位测试系统中数据采集电路设计D96-基于单片机的锅炉液位控制系统设计D97-基于单片机的洗衣机设计D98-基于单片机的锅炉汽包水位控制系统设计D99-基于单片机的多功能秒表设计D100-基于单片机的GSM网数据传输设计与实现D101-锅炉燃烧微机DDC控制系统(含组态)D102-在单片机上实现USB移动存储。
51单片机实训100例1

(1)LED灯闪烁#include <reg52.h>#define uchar unsigned char #define uint unsigned int sbit LED = P1^0;void delayms(uint x){uchar i;while(x--){for(i=120;i>0;i--);}}void main( ){while(1){LED = ~LED;delayms(500);}}(2)流水灯#include <reg52.h>#include <intrins.h>#define uchar unsigned char #define uint unsigned int void delayms(uint x){uchar i;while(x--){for(i=120;i>0;i--);}}void main( ){P0 = 0xFE;while(1){P0 = _crol_(P0,1);delayms(150);}}(3)花样流水灯#include <reg52.h>#define uchar unsigned char#define uint unsigned intucharcodePattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0xf5,0xf6,0xfe,0x54,0x56,0x76,0xd7,0x49,0xa9,0xe4 ,0xc6};void delayms(uint x){uchar t;while(x--){for(t=120;t>0;t--);}}void main( ){uchar i;while(1){for(i=136;i>0;i--){P0=Pattern_P0[i];delayms(150);}}}(4)交通模拟灯#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0;sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3;sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count = 0;Operation_Type = 1;void delayms(uint x){uchar t;while(x--){for(t=120;t>0;t--);}}void Traffic_lignt( ){switch(Operation_Type){case 1:RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;delayms(2000);Operation_Type = 2;break;case 2:delayms(200);YELLOW_A=~YELLOW_A;if(++Flash_Count !=10)return;Flash_Count=0;Operation_Type = 3;break;case 3:RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;delayms(2000);Operation_Type = 4;break;case 4:delayms(200);YELLOW_B=~YELLOW_B;if(++Flash_Count !=10)return;Flash_Count=0;Operation_Type = 1;break;}}void main( ){while(1){Traffic_lignt( );}}(5)单体数码管显示#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x82,0xf8,0x80,0x90,0xff };void delayms(uint x){uchar t;while(x--)for(t=120;t>0;t--);}void main( ){uchar i=0;P0=0;while(1){P0=duan[i];i=(i+1)%10;/*显示0-9*/delayms(700);}}(6)八个数码管显示#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delayms(uint x){uchar t;while(x--){for(t=120;t>0;t--);}}void main( ){uchar k, m=0x80;P0=0xff;P2=0x00;while(1){for(k=0;k<8;k++){m=_crol_(m,1);P2=m;P0=duan[k+1];delayms(2);}}}(7)八个数码管显示#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 }; uchar code wei[]={0x01;0x02;0x04;0x08;0x10;0x20;0x40;0x80}void delayms(uint x){uchar t;while(x--){for(t=120;t>0;t--);}}void main( ){uchar k,m;while(1){for(k=0;k<8;k++){for(m=0;m<8;m++){P2=wei[k];P0=duan[m];delayms(2);}}P2=0x00;delayms(1000);}}(9)独立按键控制led灯移动#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint x){uchar i;while(x--){for(i=120;i>0;i--);}void Move_LED( ){if((P1 &= 0x10)==0) P0 = _cror_(P0,1);else if((P1 &= 0x20)==0) P0 = _crol_(P0,1);else if((P1 &= 0x40)==0) P2 = _cror_(P2,1);else if((P1 &= 0x80)==0) P2 = _crol_(P2,1); }void main( ){uchar Key=0xff;P0=0xfe;P1=0xfe;P2=0xfe;while(1){if(Key != P1){Key=P1;Move_LED( );delayms(10);}}}(10)独立按键控制led#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit LED1 = P0^0;sbit LED2 = P0^1;sbit LED3 = P0^2;sbit LED4 = P0^3;sbit K1 = P1^0;sbit K2 = P1^1;sbit K3 = P1^2;sbit K4 = P1^3;void delayms(uint x){uchar t;while(x--){for(t=120;t>0;t--);}}void main( ){while(1){LED1 = K1;LED2 = K2;if(K3==0){while(K3==0){LED3=~LED3;}}if(K4==0){while(K4==0){LED4=~LED4;}}delayms(10);}}(11)独立按键控制led#include <reg52.h>sbit S1 = P1^0;sbit S2 = P1^1;sbit LED1 = P0^0;sbit LED2 = P0^1;void main( ){while(1){LED1 = S1;LED2 = S2;}}(12)单体数码管检测矩阵键盘#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit BEEP = P3^7;ucharcodeduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x 00};uchar Pre_KeyNO = 0x0f, KeyNO = 0x0f;void delayms(uint ms){uchar t;while(ms--){for(t=0;t<120;t++);}}void Keys_Scan( ){uchar Tmp;P1 = 0x0f;delayms(1);Tmp = P1 ^ 0x0f;switch(Tmp){case 1: KeyNO = 0; break;case 2: KeyNO = 1; break;case 4: KeyNO = 2; break;case 8: KeyNO = 3; break;default: KeyNO = 16;}P1 = 0xf0;delayms(1);Tmp = P1 >> 4 ^ 0x0f;switch(Tmp){case 1: KeyNO += 0; break;case 2: KeyNO += 4; break;case 4: KeyNO += 8; break;case 8: KeyNO += 12;}}void Beep( ){uchar i;for(i=0;i<100;i++){delayms(1);BEEP = ~BEEP;}BEEP = 1;}void main( ){P0 = 0x00;while(1){P1 = 0xf0;if(P1 != 0xf0)Keys_Scan( );if(Pre_KeyNO != KeyNO){P0 = ~duan[KeyNO];Beep( );Pre_KeyNO = KeyNO;}delayms(100);}}(13)按键控制led亮灭#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit K1 = P1^0;sbit LED= P2^4;void delayms(uint ms){uchar t;while(ms--){for(t=0;t<120;t++);}}void main( ){while(1){if(K1==0){while(K1==0);LED = ~LED;}}}(14)数码管显示按键码值#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar DSY_Buffer[3];void delayms(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}void main( ){uchar i,m,Num;while(1){m = 0xfe;Num = P1;DSY_Buffer[0] = Num/100;DSY_Buffer[1] = Num/10%10;DSY_Buffer[2] = Num%10;for(i=0;i<3;i++){m = _crol_(m,1);P2 = m;P0 = duan[DSY_Buffer[i]];delayms(10);}}}(15)按键控制蜂鸣器#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit SPK = P1^0;sbit K1 = P1^7;void Alarm(uchar t){uchar i,j;for(i=0;i<200;i++){SPK = ~SPK;for(j=0;j<t;j++);}}void main( ){while(1){if(K1==1){Alarm(90);Alarm(120);}}}(16)按键控制蜂鸣器#include <reg52.h>#define uchar unsigned char #define uint unsigned int sbit BEEP = P3^7;sbit K1 = P1^4;sbit K2 = P1^5;sbit K3 = P1^6;sbit K4 = P1^7;void delayms(uint x){uchar t;while(x--){for(t=0;t<120;t++);}}void Play(uchar t){uchar i;for(i=0;i<100;i++){BEEP = ~BEEP;delayms(t);}BEEP = 0;}void main( ){while(1){if(K1==0) Play(1);if(K2==0) Play(2);if(K3==0) Play(3);if(K4==0) Play(4);}}(17)定时器控制led#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit LED = P0^0;uchar T_Count = 0;void main( ){TMOD = 0x00;TH0 = (8192-5000)/32;TL0 = (8192-5000)%32;IE = 0x82;TR0 = 1;while(1);}void LED_Flash( ) interrupt 1{TH0 = (8192-5000)/32;TL0 = (8192-5000)%32;if(++T_Count == 100){LED = !LED;T_Count = 0;}}(20)八个数码管依次显示0~7#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delayms(uint x){uchar t;while(x--)for(t=0;t<120;t++);}void main( ){uchar i,wei=0xfe;while(1){for(i=0;i<8;i++){P0=~duan[i]; //发送数字段码P1=wei; //发送位码delayms(300);wei=_crol_(wei,1);}}}(21)按键控制led#include<reg51.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint x){uchar i;while(x--) for(i=0;i<120;i++);}void main( ){uchar k, t, Key_State;while(1){t=P1;if(t!=0xff){delayms(10);if(t!=P1) continue;//取得4位按键值,由模式XXXX1111(X中有一位为0,其他均为1)//变为模式0000XXXX(X中有一位为1,其他均为0)Key_State=~t>>4;k=0;//检查1所在位置,累加获取按键号kwhile(Key_State!=0){k++;Key_State>>=1;}//根据按键号k进行4种处理switch(k){case 1: if(P0==0x00)P0=0xff;P0<<=1;delayms(200);break;case 2: P0=0xf0;break;case 3: P0=0x0f;break;case 4: P0=0xff;}}}}(22)K1-K4 控制数码管加减演示#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//段码uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //待显示的3位缓冲uchar Num_Buffer[]={0,0,0};//按键代码,按键计数uchar Key_Code,Key_Counts=0;//延时void delayms(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//显示函数void Show_Counts_ON_DSY( ){uchar i,j=0x01;Num_Buffer[2]=Key_Counts/100;Num_Buffer[1]=Key_Counts/10%10;Num_Buffer[0]=Key_Counts%10;for(i=0;i<3;i++){j=_cror_(j,1);P0=0xff;P0=duan[Num_Buffer[i]];P2=j;delayms(1);}}//主程序void main( ){uchar i;P0=0xff;P1=0xff;P2=0x00;Key_Code=0xff;while(1){Show_Counts_ON_DSY( );P1=0xff;Key_Code=P1;//有键按下时,数码管刷新显示30次,该行代码同时起到延时作用if(Key_Code!=0xff)for(i=0;i<30;i++) Show_Counts_ON_DSY( );switch(Key_Code){case 0xfe: if(Key_Counts<255) Key_Counts++;break;case 0xfd: if(Key_Counts>0) Key_Counts--;break;case 0xfb: Key_Counts=0;}Key_Code=0xff;}}(24)流水灯#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid main( ){uchar T_Count=0;P2=0xfe;TMOD=0x01; //定时器0工作方式1TH0=(65536-40000)/256; //40ms定时TL0=(65536-40000)%256;TR0=1; //启动定时器while(1){if(TF0==1){TF0=0;TH0=(65536-40000)/256; //恢复初值TL0=(65536-40000)%256;if(++T_Count==5){P2=_crol_(P2,1);T_Count=0;}}}}(25)定时器控制4个LED滚动闪烁#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit B1=P0^0;sbit G1=P0^1;sbit R1=P0^2;sbit Y1=P0^3;uint i, j, k;void main( ){i=j=k=0;P0=0xff;TMOD=0x02; //定时器0工作方式2TH0=256-200; //200us定时TL0=256-200;IE=0x82;TR0=1; //启动定时器while(1);}void LED_Flash_and_Scroll( ) interrupt 1{if(++k<35)return; //定时中断若干次后执行闪烁k=0;switch(i){case 0: B1=~B1;break;case 1: G1=~G1;break;case 2: R1=~R1;break;case 3: Y1=~Y1;break;default:i=0;}if(++j<300)return; //每次闪烁持续一段时间j=0;P0=0xff; //关闭显示i++; //切换到下一个LED}(26)T0控制LED实现二进制计数#include<reg51.h>void main( ){TMOD=0x05; //定时器0为计数器,工作方式1,最大计数值65535 TH0=0; //初值为0TL0=0;TR0=1; //启动定时器while(1){P1=TH0;P2=TL0;}}(27)TIMER0与TIMER1控制条形LED/* 名称:TIMER0与TIMER1控制条形LED说明:定时器T0定时控制上一组条形LED,滚动速度较快定时器T1定时控制下一组条形LED,滚动速度较慢*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar tc0=0,tc1=0;//主程序void main( ){P0=0xfe;P2=0xfe;TMOD=0x11; //定时器0、定时器1均工作于方式1TH0=(65536-15000)/256; //定时器0:15msTL0=(65536-15000)%256;TH1=(65536-50000)/256; //定时器1:50msTL1=(65536-50000)%256;IE=0x8a;TR0=1; //启动定时器TR1=1;while(1);}//T0中断函数void Time0( ) interrupt 1{TH0=(65536-15000)/256; //恢复定时器0初值TL0=(65536-15000)%256;if(++tc0==10) //150ms转换状态{tc0=0;P0=_crol_(P0,1);}}//T1中断函数void Time1( ) interrupt 3{TH0=(65536-50000)/256; //恢复定时器1初值TL0=(65536-50000)%256;if(++tc1==10) //500ms转换状态{tc1=0;P2=_crol_(P2,1);}}(28)用计数器中断实现100以内的按键计数P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。
51单片机C语言编程100例

51单片机C语言编程100例1. 引言51单片机是一款常用于嵌入式系统的微控制器,其强大的功能和广泛的应用使得掌握51单片机C语言编程成为许多电子工程师和学习者的首选。
本文将介绍并讲解51单片机C语言编程的100个例子,帮助读者逐步掌握编程技巧和开发经验。
2. 闪烁LED灯第一个例子是闪烁LED灯。
我们将通过C语言编写程序,控制51单片机上的一个LED灯以固定的频率闪烁,展示基本的输入输出操作。
通过学习这个例子,读者可以了解到C语言与单片机的交互方式。
3. 数码管计数器第二个例子是数码管计数器。
我们将使用C语言编写程序,通过按键操作控制数码管上的数字进行计数。
这个例子展示了如何使用中断和定时器来实现交互功能和多任务处理。
4. PWM波控制第三个例子是PWM波控制。
我们将使用C语言编程,通过调整占空比来控制51单片机上的PWM波输出。
这个例子展示了如何利用51单片机的定时器和中断模式来生成模拟信号。
5. 温度采集与显示第四个例子是温度采集与显示。
我们将利用51单片机内置的ADC模块,通过连接温度传感器来实现温度采集,并将采集到的数据在液晶屏上显示。
这个例子展示了如何使用模拟到数字转换和外部模块的接口技术。
6. 蓝牙通信控制第五个例子是蓝牙通信控制。
我们将利用51单片机的串口功能和蓝牙模块,实现与蓝牙设备之间的通信和控制。
通过学习这个例子,读者可以熟悉串口通信和外部设备的接口编程。
7. 距离测量与报警第六个例子是距离测量与报警。
我们将使用超声波传感器和蜂鸣器,通过C语言编程实现距离的测量和报警功能。
这个例子展示了如何使用外部传感器和控制器进行物理量的检测和反馈。
8. 数字音乐播放器第七个例子是数字音乐播放器。
我们将使用51单片机的PWM功能和SD卡模块,通过C语言编程实现音乐的播放和控制。
这个例子展示了如何使用定时器和外部存储设备进行数据的读取和解码。
9. 图形液晶显示第八个例子是图形液晶显示。
我们将利用51单片机的并行接口和图形液晶屏,通过C语言编程实现图形和字符的显示功能。
51单片机C语言编程100例

51单片机C语言编程100例目录实例3:用单片机控制第一个灯亮 ...................................... 3 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 ................ 3 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能...... 4 实例6:使用P3口流水点亮8位LED.................................... 4 实例7:通过对P3口地址的操作流水点亮8位LED........................ 5 实例8:用不同数据类型控制灯闪烁时间 ................................ 6 实例9:用P0口、P1 口分别显示加法和减法运算结果 .. (8)实例10:用P0、P1口显示乘法运算结果 ................................ 8 实例11:用P1、P0口显示除法运算结果 ................................ 9 实例12:用自增运算控制P0口8位LED流水花样 ........................ 9 实例13:用P0口显示逻辑\与\运算结果 (10)实例14:用P0口显示条件运算结果 ................................... 10 实例15:用P0口显示按位\异或\运算结果 ............................. 10 实例16:用P0显示左移运算结果 ..................................... 10 实例17:\万能逻辑电路\实验 ........................................ 11 实例18:用右移运算流水点亮P1口8位LED............................ 11 实例19:用if语句控制P0口8位LED的流水方向 ...................... 12 实例20:用swtich语句的控制P0口8位LED的点亮状态 ................ 12 实例21:用for语句控制蜂鸣器鸣笛次数 .............................. 14 实例22:用while语句控制LED.......................................15 实例23:用do-while语句控制P0口8位LED流水点亮 .................. 16 实例24:用字符型数组控制P0口8位LED流水点亮 ..................... 16 实例25:用P0口显示字符串常量 .................................... 17 实例26:用P0 口显示指针运算结果................................... 18 实例27:用指针数组控制P0口8位LED流水点亮 ....................... 18 实例28:用数组的指针控制P0 口8 位LED流水点亮 .................... 19 实例29:用P0 、P1口显示整型函数返回值 ............................ 20 实例30:用有参函数控制P0口8位LED流水速度 ....................... 21 实例31:用数组作函数参数控制流水花样 .............................. 22 实例32:用指针作函数参数控制P0口8位LED流水点亮 ................. 23 实例33:用函数型指针控制P1口灯花样 ............................... 24 实例34:用指针数组作为函数的参数显示多个字符串 .................... 25 实例35:字符函数ctype.h应用举例 .................................. 26 实例36:内部函数intrins.h应用举例 ................................ 27 实例37:标准函数stdlib.h应用举例 (27)实例38:字符串函数string.h应用举例 ............................... 28 实例39:宏定义应用举例2........................................... 28 实例40:宏定义应用举例 2........................................... 29 实例41:宏定义应用举例3. (29)实例42:用定时器T0查询方式P2口8位控制LED闪烁 .................. 30 实例43:用定时器T1查询方式控制单片机发出1KHz音频 ................ 31 实例44:将计数器T0计数的结果送P1口8位LED显示 (31)实例45:用定时器T0的中断控制1位LED闪烁.........................32实例46:用定时器T0的中断实现长时间定时...........................33实例47:用定时器T1中断控制两个LED以不同周期闪烁.................34实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频..................35实例49:用定时器T0的中断实现\渴望\主题曲的播放...................35实例50-1:输出50个矩形脉冲.......................................38实例50-2:计数器T0统计外部脉冲数 (39)实例51-2:定时器T0的模式2测量正脉冲宽度.........................40实例52:用定时器T0控制输出高低宽度不同的矩形波...................40实例53:用外中断0的中断方式进行数据采集..........................41实例54-1:输出负脉宽为200微秒的方波..............................42实例54-2:测量负脉冲宽度..........................................43实例55:方式0控制流水灯循环点亮..................................44实例56-1:数据发送程序 (45)实例56-2:数据接收程序............................................46实例57-1:数据发送程序............................................47实例57-2:数据接收程序............................................48实例58:单片机向PC发送数据 (49)实例59:单片机接收PC发出的数据...................................50实例60:用LED数码显示数字5.......................................51实例61:用LED数码显示器循环显示数字0~9...........................51实例62:用数码管慢速动态扫描显示数字\........................52实例63:用LED数码显示器伪静态显示数字1234........................53实例64:用数码管显示动态检测结果. (54)实例65:数码秒表设计..............................................56实例66:数码时钟设计..............................................57实例67:用LED数码管显示计数器T0的计数值.........................61实例68:静态显示数字“59”........................................62实例69:无软件消抖的独立式键盘输入实验............................63实例70:软件消抖的独立式键盘输入实验..............................63实例71:CPU控制的独立式键盘扫描实验...............................64实例72:定时器中断控制的独立式键盘扫描实验........................67实例73:独立式键盘控制的4级变速流水灯............................70实例74:独立式键盘的按键功能扩展:\以一当四\......................72实例75:独立式键盘调时的数码时钟实验..............................74实例76:独立式键盘控制步进电机实验.. (78)实例77:矩阵式键盘按键值的数码管显示实验..........................81实例78:矩阵式键盘按键音..........................................84实例79:简易电子琴................................................85实例80:矩阵式键盘实现的电子密码锁................................91实例81:用LCD显示字符'A'.. (95)实例82:用LCD循环右移显示\......................98实例83:用LCD显示适时检测结果...................................102实例84:液晶时钟设计 (106)实例85:将数据\写入AT24C02再读出送P1口显示................112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示............116实例87:对I2C总线上挂接多个AT24C02的读写操作...................124实例88:基于AT24C02的多机通信读取程序.........................129实例88:基于AT24C02的多机通信写入程序..........................133实例90:DS18B20温度检测及其液晶显示..............................144实例91:将数据\写入X5045再读出送P1口显示..................153实例92:将流水灯控制码写入X5045并读出送P1口显示................157实例93:对SPI总线上挂接多个X5045的读写操作.....................161实例94:基于ADC0832的数字电压表.................................165实例95:用DAC0832产生锯齿波电压.................................171实例96:用P1口显示红外遥控器的按键值............................172实例97:用红外遥控器控制继电器...................................174实例98:基于DS1302的日历时钟....................................177实例99:单片机数据发送程序.......................................186实例100:电机转速表设计..........................................187模拟霍尔脉冲......................................................192/某函数的使用和熟悉某///实例3:用单片机控制第一个灯亮#include //包含51单片机寄存器定义的头文件 void main(void) while(1) //无限循环P1=0某fe; //P1=1111 1110B,即P1.0输出低电平 }//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include //包含单片机寄存器的头文件 /某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:延时一段时间某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void delay(void) //两个void意思分别为无需返回值,没有参数传递unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环;//什么也不做,等待一个机器周期}/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数(C语言规定必须有也只能有1个主函数)某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(void)while(1) //无限循环P1=0某fe; //P1=1111 1110B, P1.0输出低电平 delay(; //延时一段时间P1=0某ff; //P1=1111 1111B, P1.0输出高电平 delay(; //延时一段时间 } }//实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include //包含单片机寄存器的头文件/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数(C语言规定必须有也只能有1个主函数)某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void main(void)while(1) //无限循环P1=0某ff; // P1=1111 1111, 熄灭LED P0=P1; // 将 P1口状态送入P0口 P2=P1; // 将 P1口状态送入P2口 P3=P1; // 将 P1口状态送入P3口 } }//实例6:使用P3口流水点亮8位LED#include //包含单片机寄存器的头文件 /某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:延时一段时间某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void delay(void)unsigned char i,j; for(i=0;i<250;i++)for(j=0;j<250;j++) ; }/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(void)while(1)P3=0某fe; //第一个灯亮 delay(; //调用延时函数 P3=0某fd; //第二个灯亮 delay(; //调用延时函数 P3=0某fb; //第三个灯亮 delay(; //调用延时函数 P3=0某f7; //第四个灯亮 delay(; //调用延时函数P3=0某ef; //第五个灯亮 delay(; //调用延时函数 P3=0某df; //第六个灯亮 delay(; //调用延时函数 P3=0某bf; //第七个灯亮 delay(; //调用延时函数 P3=0某7f; //第八个灯亮delay(; //调用延时函数 } }//实例7:通过对P3口地址的操作流水点亮8位LED#include //包含单片机寄存器的头文件sfr 某=0某b0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址某的操作也就是对P1口的操作/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
D1-基于单片机的数字电压表设计
D2-基于单片机的智能电压表设计(温度检测器)
D3-基于单片机的LED流水灯系统设计
D4-基于单片机的智能船模设计
D5-基于单片机的电梯控制模型设计
D6-基于单片机的水位控制系统设计
D7-基于单片机的水位控制系统设计(STC89—51型)
D8-基于单片机的多路数据采集系统设计
D9-基于单片机的抢答器设计
D10-基于单片机的数字温度计设计
D11-基于单片机的智能小车设计
D12-基于单片机的数字温度计设计
D13-基于单片机的遥控器设计
D14-基于单片机的串行通信发射机设计
D15-基于单片机的简易智能电动车设计
D16-基于单片机的太阳能热水器控制器设计
>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<
D17-基于单片机的太阳能热水器控制器设计
D18-MCS-51单片机温度控制系统的设计
D19-直流电动机的转速检测与脉宽调速
D20-基于单片机的智能机器人的设计
D21-基于单片机的简易无线竞赛系统的设计
D22-基于单片机的车辆闯红灯监控系统设计(89C51)
D23-基于单片机控制的井下瓦斯监控系统设计
D24-基于单片机的煤气泄漏检测报警装置设计
D25-基于单片机的井式渗碳炉控制系统设计
D26-基于单片机的蔬菜大棚温湿度智能控制系统设计
D27-基于单片机的电子钟设计
D28-基于单片机的电力线载波节电群控设计
D29-基于单片机的液位控制器设计(8051)
D30-基于单片机的串行通信发射机设计(版本2)
D31-基于单片机的智能八路抢答器设计(A T89C2051)
D32-基于单片机的水位监控器设计(STC12C2052AD)
D33-基于单片机的点阵电子显示屏设计(版1)
D34-基于单片机的智能温度控制系统设计
D35-基于单片机的智能时钟控制器设计
D36-基于单片机的智能温控系统设计(版本1)
D37-基于单片机的智能寻迹避障小车设计
D38-基于单片机的家用太阳能热水器控制器设计
D39-基于单片机的新型抢答计分器设计
D40-基于单片机的热敏电阻测温系统设计
>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<
D41-基于单片机的林火监测系统-飞艇姿态控制系统设计D42-基于单片机的人性化时钟控制器设计
D43-基于单片机的智能型电话远程遥控器设计
D44-基于单片机的远程通讯控制器设计
D45-基于单片机的温度控制器设计
D46-基于单片机的智能水位控制器设计
D47-基于单片机的水位控制系统设计(版本1)
D48-基于单片机的智能电动小车设计
D49-基于单片机的数码电子时钟设计
D50-基于单片机的数控直流电源设计
D51-基于单片机的交通灯控制器设计
D52-基于单片机的数字温度计设计(STC89C51)
D53-基于单片机的智能小车设计
D54-基于单片机的温度控制器设计>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<
D55-基于单片机的串行通信发射机设计(版本3)
D56-基于单片机的温度控制系统设计(版本1)
D57-基于单片机的交通灯控制系统设计
D58-基于单片机的电子万年历设计
D59-基于单片机的水位控制器设计
D60-基于单片机的水位控制系统设计(版本2)
D61-基于单片机的数据采集器设计
D62-基于单片机的水位控制系统设计(版本3)
D63-基于单片机的电梯控制系统设计
D64-基于单片机的智能温控系统设计(版本2)
D65-基于单片机的温度控制系统设计(版本2)
D66-基于单片机的数据采集与传输系统设计
D67-基于单片机的交通灯控制系统设计(版本1)
D68-基于单片机的交通灯控制系统设计(版本2)
D69-基于单片机的红外防盗报警器设计
D70-基于单片机的花卉温室控温系统设计
D71-基于单片机的焊机温度控制系统设计(89C51)(版式一) D72-基于单片机的焊机温度控制系统设计(版式二)
D73-基于单片机的路灯控制器设计
D74-基于单片机技术的水位控制器设计(8051)
D75-基于单片机的车床刀架控制系统设计(MCS-51)
D76-基于单片机的电机智能综合保护装置设计
D77-基于单片机的水位控制器设计(STC89C51)
D78-基于单片机的水位控制器设计(STC89C51+水泵)
D79-基于单片机技术的自动停车器的设计
D80-基于ARM的嵌入式图形用户界面设计>>>>>>>>>>>>>>>>>憋疯的分割线<<<<<<<<<<<<<<<<<
D81-基于单片机的太阳能热水器控制器设计(版本3)
D82-基于单片机的太阳能热水器控制器设计(版本4)
D83-基于单片机的智能型矿用磁力启动器设计(PIC16F877A单片机)D84-基于单片机的无氧退火炉温控系统设计(8031)
D85-基于单片机的电厂锅炉过热蒸汽温度监测系统设计(MCS-51)
D86-基于单片机的摩托车里程表研制
D87-基于PIC16F84单片机的IC卡智能水表设计
D88-基于单片机的自动车库门的设计
D89-基于单片机的自动滴灌控制系统的设计
D90-基于单片机的预付费电度表设计
D91-基于单片机的智能电子秤设计
D92-基于单片机的太阳能热水器智能控制器设计
D93-基于单片机的油井巡视定位系统设计
D94-基于单片机的照明控制系统
D95-基于单片机的水位测试系统中数据采集电路设计
D96-基于单片机的锅炉液位控制系统设计
D97-基于单片机的洗衣机设计
D98-基于单片机的锅炉汽包水位控制系统设计
D99-基于单片机的多功能秒表设计
D100-基于单片机的GSM网数据传输设计与实现
D101-锅炉燃烧微机DDC控制系统(含组态)
D102-在单片机上实现USB移动存储。