51单片机C语言编程100例.doc
目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0、P2、P3口认识I/O口的引脚功能4实例6使用P3口流水点亮8位LED4实例7通过对P3口地址的操作流水点亮8位LED5实例8用不同数据类型控制灯闪烁时间6实例9用P0口、P1 口分别显示加法和减法运算结果8实例10用P0、P1口显示乘法运算结果8实例11用P1、P0口显示除法运算结果9实例12用自增运算控制P0口8位LED流水花样9实例13用P0口显示逻辑与运算结果9实例14用P0口显示条件运算结果10实例15用P0口显示按位异或运算结果10实例16用P0显示左移运算结果10实例17万能逻辑电路实验11实例18用右移运算流水点亮P1口8位LED11实例19用if语句控制P0口8位LED的流水方向12实例20用swtich语句的控制P0口8位LED的点亮状态12实例21用for语句控制蜂鸣器鸣笛次数14实例22用while语句控制LED15实例23用do-while语句控制P0口8位LED流水点亮15实例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应用举例26实例37标准函数stdlib.h应用举例27实例38字符串函数string.h应用举例28实例39宏定义应用举例228实例40宏定义应用举例229实例41宏定义应用举例329实例42用定时器T0查询方式P2口8位控制LED闪烁30实例43用定时器T1查询方式控制单片机发出1KHz音频30实例44将计数器T0计数的结果送P1口8位LED显示31实例45用定时器T0的中断控制1位LED闪烁32实例46用定时器T0的中断实现长时间定时32实例47用定时器T1中断控制两个LED以不同周期闪烁33实例48用计数器T1的中断控制蜂鸣器发出1KHz音频34实例49用定时器T0的中断实现渴望主题曲的播放35实例50-1输出50个矩形脉冲38实例50-2计数器T0统计外部脉冲数39实例51-2定时器T0的模式2测量正脉冲宽度39实例52用定时器T0控制输出高低宽度不同的矩形波40实例53用外中断0的中断方式进行数据采集41实例54-1输出负脉宽为200微秒的方波42实例54-2测量负脉冲宽度42实例55方式0控制流水灯循环点亮43实例56-1数据发送程序44实例56-2数据接收程序45实例57-1数据发送程序46实例57-2数据接收程序48实例58单片机向PC发送数据48实例59单片机接收PC发出的数据50实例60用LED数码显示数字551实例61用LED数码显示器循环显示数字0951实例62用数码管慢速动态扫描显示数字123452实例63用LED数码显示器伪静态显示数字123452实例64用数码管显示动态检测结果53实例65数码秒表设计55实例66数码时钟设计57实例67用LED数码管显示计数器T0的计数值60实例68静态显示数字“59”62实例69无软件消抖的独立式键盘输入实验62实例70软件消抖的独立式键盘输入实验62实例71CPU控制的独立式键盘扫描实验63实例72定时器中断控制的独立式键盘扫描实验66实例73独立式键盘控制的4级变速流水灯70实例74独立式键盘的按键功能扩展以一当四72实例75独立式键盘调时的数码时钟实验73实例76独立式键盘控制步进电机实验78实例77矩阵式键盘按键值的数码管显示实验80实例78矩阵式键盘按键音83实例79简易电子琴85实例80矩阵式键盘实现的电子密码锁91实例81用LCD显示字符A94实例82用LCD循环右移显示Welcome to China97实例83用LCD显示适时检测结果100实例84液晶时钟设计104实例85将数据0 x0f写入AT24C02再读出送P1口显示110实例86将按键次数写入AT24C02,再读出并用1602LCD显示115实例87对I2C总线上挂接多个AT24C02的读写操作122实例88基于AT24C02的多机通信 读取程序127实例88基于AT24C02的多机通信 写入程序131实例90DS18B20温度检测及其液晶显示142实例91将数据0 xaa写入X5045再读出送P1口显示151实例92将流水灯控制码写入X5045并读出送P1口显示155实例93对SPI总线上挂接多个X5045的读写操作158实例94基于ADC0832的数字电压表163实例95用DAC0832产生锯齿波电压169实例96用P1口显示红外遥控器的按键值169实例97用红外遥控器控制继电器172实例98基于DS1302的日历时钟174实例99单片机数据发送程序183实例100电机转速表设计184模拟霍尔脉冲189/*函数的使用和熟悉*/实例3用单片机控制第一个灯亮includereg51.h 包含51单片机寄存器定义的头文件void mainvoid while1 无限循环P10 xfe; P11111 1110B,即P1.0输出低电平 实例4用单片机控制一个灯闪烁认识单片机的工作频率includereg51.h 包含单片机寄存器的头文件/函数功能延时一段时间*/void delayvoid 两个void意思分别为无需返回值,没有参数传递 unsigned int i; 定义无符号整数,最大取值范围65535 fori0;i20000;i 做20000次空循环 ; 什么也不做,等待一个机器周期/*函数功能主函数 (C语言规定必须有也只能有1个主函数)/void mainvoid while1 无限循环 P10 xfe; P11111 1110B, P1.0输出低电平 delay; 延时一段时间 P10 xff; P11111 1111B, P1.0输出高电平 delay; 延时一段时间 实例5将 P1口状态分别送入P0、P2、P3口认识I/O口的引脚功能includereg51.h 包含单片机寄存器的头文件/*函数功能主函数 (C语言规定必须有也只能有1个主函数)/void mainvoid while1 无限循环 P10 xff; P11111 1111, 熄灭LED P0P1; 将 P1口状态送入P0口P2P1; 将 P1口状态送入P2口 P3P1; 将 P1口状态送入P3口 实例6使用P3口流水点亮8位LED includereg51.h 包含单片机寄存器的头文件/函数功能延时一段时间*/void delayvoid unsigned char i,j; fori0;i250;i forj0;j250;j ;/*函数功能主函数 /void mainvoid while1 P30 xfe; 第一个灯亮 delay; 调用延时函数 P30 xfd; 第二个灯亮 delay; 调用延时函数P30 xfb; 第三个灯亮 delay; 调用延时函数P30 xf7; 第四个灯亮 delay; 调用延时函数P30 xef; 第五个灯亮 delay; 调用延时函数P30 xdf; 第六个灯亮 delay; 调用延时函数P30 xbf; 第七个灯亮 delay; 调用延时函数P30 x7f; 第八个灯亮 delay; 调用延时函数 实例7通过对P3口地址的操作流水点亮8位LEDincludereg51.h 包含单片机寄存器的头文件sfr x0 xb0; P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机 的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/函数功能延时一段时间*/void delayvoid unsigned char i,j; fori0;i250;i forj0;j250;j ; 利用循环等待若干机器周期,从而延时一段时间 /*函数功能主函数 /void mainvoid while1 x0 xfe; 第一个灯亮 delay; 调用延时函数 x0 xfd; 第二个灯亮 delay; 调用延时函数 x0 xfb; 第三个灯亮 delay; 调用延时函数 x0 xf7; 第四个灯亮 delay; 调用延时函数x0 xef; 第五个灯亮 delay; 调用延时函数x0 xdf; 第六个灯亮 delay; 调用延时函数x0 xbf; 第七个灯亮 delay; 调用延时函数x0 x7f; 第八个灯亮 delay; 调用延时函数 实例8用不同数据类型控制灯闪烁时间includereg51.h 包含单片机寄存器的头文件/函数功能用整形数据延时一段时间/void int_delayvoid 延时一段较长的时间 unsigned int m; 定义无符号整形变量,双字节数据,值域为065535 form0;m36000;m ; 空操作 /函数功能用字符型数据延时一段时间/void char_delayvoid 延时一段较短的时间 unsigned char i,j; 定义无符号字符型变量,单字节数据,值域0255fori0;i200;i forj0;j180;j ; 空操作/函数功能主函数/void mainvoid unsigned char i; while1 fori0;i3;i P10 xfe; P1.0口的灯点亮 int_delay; 延时一段较长的时间 P10 xff; 熄灭 int_delay; 延时一段较长的时间 fori0;i3;i P10 xef; P1.4口的灯点亮 char_delay; 延时一段较长的时间 P10 xff; 熄灭 char_delay; 延时一段较长的时间 实例9用P0口、P1口分别显示加法和减法运算结果includereg51.hvoid mainvoid unsigned char m,n; m43; 即十进制数2x161143 n60; 即十进制数3x161260 P1mn; P11030110 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0n-m; P0170001 0001,结果P0.0、P0.4的灯被熄灭 实例10用P0、P1口显示乘法运算结果includereg51.h 包含单片机寄存器的头文件void mainvoid unsigned char m,n; unsigned int s; m64; n71; sm*n; s64*714544,需要16位二进制数表示,高8位送P1口,低8位送P0口 由于454417*256192H3*16*16*16H2*16*16H1*16H0两边同除以256,可得17192/256H3*16H2(H1*16H0)/256因此,高8位16进制数H3*16H2必然等于17,即4544除以256的商低8位16进制数H1*16H0必然等于192,即4544除以256的余数 P1s/256; 高8位送P1口 ,P11711H0001 0001B, P1.0和P1.4口灭,其余亮 P0s256; 低8位送P0口 , P3192c0H1100 0000B,P3.1,P3.6,P3.7口灭,其余亮实例11用P1、P0口显示除法运算结果includereg51.h 包含单片机寄存器的头文件void mainvoid P136/5; 求整数 P0365*10/5; 求小数 while1 ; 无限循环防止程序“跑飞” 实例12用自增运算控制P0口8位LED流水花样includereg51.h 包含单片机寄存器的头文件/函数功能延时一段时间/void delayvoid unsigned int i; fori0;i20000;i ;/函数功能主函数/void mainvoid unsigned char i; fori0;i255;i 注意i的值不能超过255 P0i; 将i的值送P0口 delay; 调用延时函数实例13用P0口显示逻辑与运算结果includereg51.h 包含单片机寄存器的头文件void mainvoid P04090 xab;将逻辑运算结果送P0口 while1 ; 设置无限循环,防止程序“跑飞”实例14用P0口显示条件运算结果includereg51.h 包含单片机寄存器的头文件void mainvoid P08484;将条件运算结果送P0口,P080000 1000B while1 ; 设置无限循环,防止程序“跑飞”实例15用P0口显示按位异或运算结果includereg51.h 包含单片机寄存器的头文件void mainvoid P00 xa20 x3c;将条件运算结果送P0口,P080000 1000B while1 ; 设置无限循环,防止程序“跑飞”实例16用P0显示左移运算结果includereg51.h 包含单片机寄存器的头文件void mainvoid P00 x3b2; 将左移运算结果送P0口,P01110 1100B0 xec while1 ; 无限循环,防止程序“跑飞”实例17万能逻辑电路实验includereg51.h 包含单片机寄存器的头文件sbit FP14; 将F位定义为 P1.4sbit XP15; 将X位定义为 P1.5sbit YP16; 将Y位定义为 P1.6sbit ZP17; 将Z位定义为 P1.7void mainvoid while1 FX 将逻辑运算结果赋给F ; 实例18用右移运算流水点亮P1口8位LEDincludereg51.h 包含单片机寄存器的头文件/*函数功能延时一段时间*/void delayvoid unsigned int n; forn0;n30000;n ;/*函数功能主函数*/void mainvoid unsigned char i; while1 P10 xff;delay;fori0;i8;i设置循环次数为8 P1P11; 每次循环P1的各二进位右移1位,高位补0delay; 调用延时函数 实例19用if语句控制P0口8位LED的流水方向includereg51.h 包含单片机寄存器的头文件sbit S1P14; 将S1位定义为P1.4sbit S2P15; 将S2位定义为P1.5/*函数功能主函数*/void mainvoid while1 ifS10 如果按键S1按下 P00 x0f; P0口高四位LED点亮 ifS20 如果按键S2按下 P00 xf0; P0口低四位LED点亮 实例20用swtich语句的控制P0口8位LED的点亮状态includereg51.h 包含单片机寄存器的头文件sbit S1P14; 将S1位定义为P1.4/*函数功能延时一段时间*/void delayvoid unsigned int n; forn0;n10000;n ;/*函数功能主函数*/void mainvoid unsigned char i;i0; 将i初始化为0while1 ifS10 如果S1键按下 delay; 延时一段时间 ifS10 如果再次检测到S1键按下 i; i自增1 ifi9 如果i9,重新将其置为1 i1; switchi 使用多分支选择语句 case 1 P00 xfe; 第一个LED亮break;case 2 P00 xfd; 第二个LED亮 break;case 3P00 xfb; 第三个LED亮 break;case 4P00 xf7; 第四个LED亮 break;case 5P00 xef; 第五个LED亮 break;case 6P00 xdf; 第六个LED亮 break;case 7P00 xbf; 第七个LED亮 break;case 8P00 x7f; 第八个LED亮 break;default 缺省值,关闭所有LED P00 xff; 实例21用for语句控制蜂鸣器鸣笛次数includereg51.h 包含单片机寄存器的头文件sbit soundP37; 将sound位定义为P3.7/函数功能延时形成1600Hz音频/void delay1600void unsigned char n; forn0;n100;n ;/函数功能延时形成800Hz音频/void delay800void unsigned char n; forn0;n200;n ;/函数功能主函数/void mainvoid unsigned int i;while1 fori0;i830;i sound0; P3.7输出低电平 delay1600; sound1; P3.7输出高电平 delay1600; fori0;i200;i sound0; P3.7输出低电平 delay800; sound1; P3.7输出高电平 delay800; 实例22用while语句控制LEDincludereg51.h 包含单片机寄存器的头文件/函数功能延时约60ms 3*100*20060000s/void delay60msvoid unsigned char m,n; form0;m100;m forn0;n200;n ;/函数功能主函数/void mainvoid unsigned char i;while1 无限循环 i0; 将i初始化为0 whilei0 xff 当i小于0 xff(255时执行循环体 P0i; 将i送P0口显示 delay60ms; 延时 i; i自增1 实例23用do-while语句控制P0口8位LED流水点亮includereg51.h 包含单片机寄存器的头文件/函数功能延时约60ms 3*100*20060000s/void delay60msvoid unsigned char m,n; form0;m100;m forn0;n200;n ;/函数功能主函数/void mainvoid do P00 xfe; 第一个LED亮delay60ms; P00 xfd; 第二个LED亮delay60ms;P00 xfb; 第三个LED亮delay60ms;P00 xf7; 第四个LED亮delay60ms;P00 xef; 第五个LED亮delay60ms;P00 xdf; 第六个LED亮delay60ms;delay60ms;P00 xbf; 第七个LED亮delay60ms;P00 x7f; 第八个LED亮 delay60ms; while1; 无限循环,使8位LED循环流水点亮实例24用字符型数组控制P0口8位LED流水点亮includereg51.h 包含单片机寄存器的头文件/函数功能延时约60ms 3*100*20060000s/void delay60msvoid unsigned char m,n; form0;m100;m forn0;n200;n ;/函数功能主函数/void mainvoid unsigned char i; unsigned char code Tab 0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; 定义无符号字符型数组 while1 fori0;i8;i P0Tabi;依次引用数组元素,并将其送P0口显示 delay60ms;调用延时函数 实例25 用P0口显示字符串常量includereg51.h 包含单片机寄存器的头文件/*函数功能延时约150ms 3*200*250150 000s150ms*/void delay150msvoid unsigned char m,n; form0;m200;m forn0;n250;n ;/*函数功能主函数*/void mainvoid unsigned char strNow,Temperature is ; 将字符串赋给字符型全部元素赋值 unsigned char i; wh