《c51单片机编程应用100例.docx》由会员分享,可在线阅读,更多相关《c51单片机编程应用100例.docx(199页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、*实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实实目录* 函 、数 I的吏孰 */43S用单片机控制第一个灯亮44:用单片机控制一个灯闪烁:认识单片机的工作频率45:将P1 口状态分别送入PO、P2、P3 :认识I/O 的引脚功能56:使用P3 口流水点亮8位LED57:通过对P3 口地址的操作流水点亮8位LED68:用不同数据类型控制灯闪烁时间79:用PO门、P! 口分别显示加法和减法运算结果810:用P0、P1 显示乘法运算结果911:用Pl、P0 口显示除法运算结果912:用自增运算控制P0 8位LED流水花样1013:用P0 口显示逻辑与运算结果1014:用P
2、0 口显示条件运算结果1115:用P0 显示按位异或运算结果1116:用P0显示左移运算结果1117:万能逻辑电路实验1118:用右移运算流水点亮P1 8位LED1219:用if语句控制P0 8位LED的流水方向1320:用swtich语句的控制P0 8位LED的点亮状态1321:用for语句控制蜂鸣器鸣笛次数1422: 用 while 语句控制 LED1623:用do-while语句控制P0 8位LED流水点亮1624:用字符型数组控制P0 8位LED流水点亮1725: 用P0 口显示字符串常量1826:用P0 口显示指针运算结果1927:用指针数组控制P0 8位LED流水点亮1928:用数
3、组的指针控制P0 n 8位LED流水点亮2029:用P0P1 口显示整型函数返回值2130:用有参函数控制P0 8位LED流水速度2231:用数组作函数参数控制流水花样2332:用指针作函数参数控制P0 8位LED流水点亮2333:用函数型指针控制P1 口灯花样2534:用指针数组作为函数的参数显示多个字符串2635:字符函数ctype.h应用举例2736:内部函数intrins.h应用举例2737:标准函数stdlib.h应用举例2838:字符串函数string.h应用举例2939:宏定义应用举例229实例40:宏定义应用举例230实例41:宏定义应用举例330* *断 定时器*中断、定时器
4、*中断、定时器*中定* *31实实实实实实实实实实实实实实实实实实实实实实42:用定时器TO查询方式P2 8位控制LED闪烁3143:用定时器T1查询方式控制单片机发出IKHz音频3144:将计数器TO计数的结果送P1 8位LED显示3245:用定时器TO的中断控制1位LED闪烁3346:用定时器TO的中断实现长时间定时3447:用定时器T1中断控制两个LED以不同周期闪烁3448:用计数器T1的中断控制蜂鸣器发出IKHz音频3649:用定时器TO的中断实现渴望主题曲的播放3650-1:输出50个矩形脉冲3950-2:计数器TO统计外部脉冲数4051-2:定时器TO的模式2测量正脉冲宽度405
5、2:用定时器TO控制输出高低宽度不同的矩形波4153:用外中断的中断方式进行数据采集4254-1:输出负脉宽为200微秒的方波4354-2:测量负脉冲宽度4355:方式控制流水灯循环点亮4456-1:数据发送程序4556-2:数据接收程序4757-1:数据发送程序4757-2:数据接收程序4958:单片机向PC发送数据5059:单片机接收PC发出的数据51管显示*数码管显示*数码管显示数码012345678666666666例列例列列例列例列实实实实实实实实实* *J显52用LED数码显示数字552用LED数码显示器循环显示数字952用数码管慢速动态扫描显示数字1234”53用LED数码显示器
6、伪静态显示数字123454用数码管显示动态检测结果54数码秒表设计56数码时钟设计58用LED数码管显示计数器TO的计数值62静态显示数字59”63*键盘控制*键盘控制* *键盘捽制* * * * * * * * * 1 ): JljlJ * * * * *实例69:无软件消抖的独立式键盘输入实验64实例70:软件消抖的独立式键盘输入实验64实例71: CPU控制的独立式键盘扫描实验65实例72:定时器中断控制的独立式键盘扫描实验68实例73:独立式键盘控制的4级变速流水灯71实例74:独立式键盘的按键功能扩展:以当四”73实例75:独立式键盘调时的数码时钟实验75实例76:独立式键盘控制步进
7、电机实验79实例77:矩阵式键盘按键值的数码管显示实验82/实例78:矩阵式键盘按键音85实例79:简易电子琴86实例80:矩阵式键盘实现的电子密码锁92* *液晶显示 LCD*液晶显示 LCD *液晶显示 LCD *液晶显示京*液晶显示LCD *液晶显示LCD *实实实实实实实实实实实实实实实实*/ 实例81:用CD显示字符,A96实例82:用LCD循环右移显示Welcome to China99实例83:用LCD显示适时检测结果102实例84:液晶时钟设计106些芯片的使用*24co2 .DS18B20 X5045 ADC0832 DAC0832 DS1302 i牢 */85:将数据OxO
8、f写入AT24C02再读出送P1 口显示11286:将按键次数写入AT24co2,再读出并用1602LCD显示11787:对12c总线上挂接多个AT24C02的读写操作12488:基于AT24co2的多机通信 读取程序12988:基于AT24co2的多机通信 写入程序13390: DS18B20温度检测及其液晶显示14491:将数据Oxaa写入X5045再读出送P1 口显示15392:将流水灯控制码写入X5045并读出送P1 口显示15793:对SPI总线上挂接多个X5045的读写操作16194:基于ADC0832的数字电压表16595:用DAC0832产生锯齿波电压17196:用P1 口显示
9、红外遥控器的按键值17197:用红外遥控器控制继电器17498:基于DS1302的日历时钟17799:单片机数据发送程序185100:电机转速表设计186模拟霍尔脉冲错误!未定义书签。函数 的使用 和 熟悉*yes*实例3:用单片机控制第一个灯亮#include 包含51单片机寄存器定义的头文件 void main(void)Pl=Oxfe; /Pl=llll 11106I即 P1.0 输出低电平 )实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include 包含单片机寄存器的头文件函数功能:延时一段时间void delay(void) 两个void意思分别为无需返回值,没有参数传递
10、 (unsigned int iJ定义无符号整数,最大取值范围65535for(i=0;i20000;i+) 做 20000 次空循环;什么也不做,等待个机器周期)函数功能:主函数(C语言规定必须有也只能有1个主函数)*/void main(void)while(l)无限循环(Pl=Oxfe;/Pl=llll 11106, PLO 输出低电平delay();延时一段时间Pl=Oxff;/Pl=llll 1111B, P1.0 输出高电平delay(); 延时一段时间 )实例5:将Pl 口状态分别送入PO、P2、P3 :认识I/O 的引脚功能# include包含单片机寄存器的头文件/* 函数功
11、能:主函数(C语言规定必须有也只能有1个主函数) */void main(void) (while(l)无限循环Pl=Oxff; / Pl=llll 1111B,熄灭 LEDPO=P1; /将Pl 口状态送入PO P2=P1;/将Pl 口状态送入P2 P3=P1;/将Pl 口状态送入P3 实例6:使用P3 口流水点亮8位LED# include包含单片机寄存器的头文件函数功能:延时一段时间void delay(void)(unsigned char ij;for(i=0;i250;i+) for(j=0;j250;j+)函数功能:王函数*/ void main(void)while(l)P3=
12、0xfe;第一个灯亮delay(); 调用延时函数P3=0xfd; 第二个灯亮 delay(); 调用延时函数P3=Oxfb;第三个灯亮delay(); 调用延时函数P3=0xf7J 第四个灯亮 delay(); 调用延时函数P3=0xef;第五个灯亮delay();调用延时函数P3=Oxdf; 第六个灯亮 delay(); 调用延时函数P3=0xbf;第七个灯亮delay();调用延时函数P3=0x7f;第八个灯亮delay();调用延时函数实例7:通过对P3 口地址的操作流水点亮8位LED# include 包含单片机寄存器的头文件sfr x=OxbO; P3 在存储器中的地址是bOH,通
13、过sfr可定义8051内核单片 机的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1 口的 操作函数功能:延时一段时间void delay(void)(unsigned char ij;for(i=0;i250;i+)for(j=0;j250;j+);利用循环等待若干机器周期,从而延时一段时间 *void main(void) while(l) (x=0xfe;第一个灯亮delay(); 调用延时函数x=Oxfd; 第二个灯亮delay()J 调用延时函数x=Oxfb; 第三个灯亮delay(); 调用延时函数x=Oxf7; 第四个灯亮delay(); 调用延时函数x=Oxef;第五个灯
14、亮delay(); 调用延时函数x=Oxdf; 第六个灯亮 delay(); 调用延时函数x=Oxbf;第七个灯亮delay()J 调用延时函数 x=0x7f;第八个灯亮delay(); 调用延时函数实例8:用不同数据类型控制灯闪烁时间#include 包含单片机寄存器的头文件函数功能:用整形数据延时一段时间void int_delay(void) 延时段较长的时间(unsigned int m; 定义无符号整形变量,双字节数据,值域为65535 for(m=0;m36000;m+);空操作)函数功能:用字符型数据延时一段时间void char_delay(void) 延时一段较短的时间uns
15、igned char i,j;定义无符号字符型变量,单字节数据,值域。255for(i=0;i200;i+)for(j=0;j180;j+); 空操作)函数功能:主函数void main(void)(unsigned char i;while(l)(for(i=0;i3;i+)(Pl=0xfe;PL0 的灯点亮i nt_de I ay(); 延时一段较长的时间Pl=Oxff;熄灭int_delay(); 延时一段较长的时间)for(i=0;i3;i+)Pl=Oxef;P1.4 口的灯点亮char_delay(); 延时一段较长的时间Pl=OxffJ熄灭ch a r_d e lay (); 延时
16、一段较长的时间 )实例9:用PO门、Pl 口分别显示加法和减法运算结果#includevoid main(void)(unsigned char m,n;m=43; 即十进制数 2x16+11=43n=60;即十进制数 3x16+12=60Pl=m+n; Pl=103=0110 0111B,结果 P1.3、Pl.4、P1.? 的灯被点亮P0=n-m; P0=17=00010001B,结果 P0.0、P0.4 的灯被熄灭实例10:用P0、P1 口显示乘法运算结果#include 包含单片机寄存器的头文件 void main(void)(unsigned char mzn;unsigned int
17、 s;m=64;n=71;s=m*n;s=64*71=4544,需要16位二进制数表示,高8位送Pl ,低8位送P0 由于 4544=17*256+192=H3*16*16*16+H2*16*16+Hl*16+H0两边同除以 256,可得 17+192/256=H3*16+H2+( Hl*16+H0) /256因此,高8位16进制数H3*16+H2必然等于17,即4544 除以256的商低8位16进制数Hl*16+H0必然等于192,即4544除以 256的余数Pl=s/256;高 8 位送 P! , Pl=17=llH=0001 000IB, P1.0 和 P1.4 口灭,其余亮P0=s%2
18、56; 低 8 位送 P0 ,P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7 灭,其余亮 实例11:用Pl、P0 口显示除法运算结果#include包含单片机寄存器的头文件void main(void)Pl=36/5;求整数P0=(36%5)*10)/5; 求小数while(l)无限循环防止程序“跑飞”实例12:用自增运算控制P0 8位LED流水花样#include包含单片机寄存器的头文件/* 函数功能:延时一段时间*/void delay(void)unsigned int i;for(i=0;i20000;i+)函数功能:主函数void main(void)(un
19、signed char i;for(i=0;i255;i+) 注意i的值不能超过255(P0=i; 将i的值送P0 delay。; 调用延时函数实例13:用P0 口显示逻辑与“运算结果#include包含单片机寄存器的头文件void main(void)(P0=(40)&(90xab);将逻辑运算结果送P0 while(l)设置无限循环,防止程序“跑飞”实例14:用P0 口显示条件运算结果# include包含单片机寄存器的头文件void main(void)(P0=(84)?8:4;将条件运算结果送 P0 ,P0=8=0000 1000B while(l);设置无限循环,防止程序“跑飞”实例
20、15:用P0 显示按位“异或“运算结果# include包含单片机寄存器的头文件void main(void)(P0=0xa2A0x3c;将条件运算结果送 P0 , P0=8=0000 1000B while(l);设置无限循环,防止程序“跑E”)实例16:用P0显示左移运算结果# include 包含单片机寄存器的头文件 void main(void)(PO=Ox3b2;将左移运算结果送 P0 ,P0=1110 1100B=0xec while(l); 无限循环,防止程序“跑飞”)实例17: ”万能逻辑电路”实验# include 包含单片机寄存器的头文件sbit F=P1M; 将 F 位定
21、义为 P1.4sbit X=P1A5;将 X 位定义为Pl.5sbit Y=P1A6;将 Y 位定义为Pl.6sbit Z=P1A7;将 Z 位定义为Pl.7void main(void)while(l)F=(X)&Y)|Z; 将逻辑运算结果赋给F)实例18:用右移运算流水点亮P1 8位LED#include 包含单片机寄存器的头文件 /* 函数功能:延时一段时间* /void delay(void)(unsigned int n;for(n=0;n30000;n+)函数功能:主函数*/void main(void)unsigned char i;while(l)(Pl=Oxff;delay(
22、);for(i=0;i8;i+)设置循环次数为8(P1=P11; 每次循环Pl的各二进位右移1位,高位补。 delay();调用延时函数实例19:用if语句控制P0 8位LED的流水方向#include 包含单片机寄存器的头文件sbit S1=P1A4;将 S! 位定义为 P1.4sbit S2=P1A5;将 S2 位定义为 P1.5/*函数功能:主函数*Ivoid main(void)(while(l)if(Sl=O) 如果按键S1按下PO=OxOf; /P0 口高四位 LED 点亮if(S2=O) 如果按键S2按下PO=OxfO; /P0 口低四位 LED 点亮实例20:用swtich语句
23、的控制P0 8位LED的点亮状态#include 包含单片机寄存器的头文件sbit S1=P1A4; 将 S! 位定义为 P1.4/*函数功能:延时一段时间*/void delay(void)unsigned int n;for(n=0;n10000;n+)/*函数功能:主函数*/void main(void)unsigned char i;i=0; 将i初始化为0 while(l)if(Sl=O) 如果S!键按下(delay(); 延时一段时间if(Sl=O)如果再次检测到S1键按下i+; i 自增 1if(i=9) 如果i=9,重新将其置为工 i=l;)switch(i) 使用多分支选择语
24、句case 1: PO=Oxfe; break;第一个LED亮case 2: PO=Oxfd; break;第二个LED亮case 3:P0=0xfb; break;第三个LED亮case 4:P0=0xf7; break;第四个LED亮case 5:P0=0xef; break;第五个LED亮case 6:P0=0xdf; break;第六个LED亮case 7:P0=0xbf; break;第七个ED亮case 8:P0=0x7f; break;第八个LED亮default:缺省值,关闭所有LEDPO=Oxff;实例21:用for语句控制蜂鸣器鸣笛次数#include 包含单片机寄存器的头
25、文件sbit sound=P3A7; 将 sound 位定义为 P3.7/* *函数功能:延时形成1600Hz音频*/ void delayl600(void)(unsigned char n;for(n=0;n100;n+)函数功能:延时形成800Hz音频* /void delay800(void)(unsigned char n;for(n=0;n200;n+)j/* 函数功能:主函数*Ivoid main(void)(unsigned int i;while(l)for(i=0;i830;i+)sound=0; /P3.7输出低电平delayl600();sound=l; P3.7输出高
26、电平delayl600();)for(i=0;i200;i+)(sound=0; P3.7输出低电平delay800();sound=l; P3.7输出高电平 delay800();实例22:用while语句控制LED#include 包含单片机寄存器的头文件 /* 函数功能:延时约 60ms (3*100*200=60000 u s) */ void delay60ms(void)(unsigned char m,n;for(m=0;m100;m+) for(n=0;n200;n+)/* 函数功能:主函数*/ void main(void)unsigned char i;while(l)无限
27、循环(i=0;将i初始化为0while(iOxff) 当i小于Oxff (255)时执行循环体 (P0=i;将i送P0 口显示delay60ms(); 延时i+;i 自增 1) 实例23:用do-while语句控制P0 8位LED流水点亮#include 包含单片机寄存器的头文件 /* 函数功能:延时约 60ms (3*100*200=60000 U s) */unsigned char m,n; for(m=0;m100;m+) for(n=0;n200;n+)函数功能:主函数void main(void)(do(PO=Oxfe;第一个 LED 亮delay60ms();PO=Oxfd;第二
28、个 LED 亮delay60ms();PO=Oxfb;第三个LED亮delay60ms;P0=0xf7;第四个LED亮delay60ms();PO=Oxef;第五个LED亮delay60ms();PO=Oxdf;第六个LED亮delay60ms();delay60ms();PO=Oxbf;第七个LED亮delay60ms();P0=0x7f;第八个LED亮delay60ms();while(l);无限循环,使8位LED循环流水点亮实例24:用字符型数组控制P0 8位LED流水点亮#include 包含单片机寄存器的头文件 /* 函数功能:延时约 60ms (3*100*200=60000 u
29、s)void delay60ms(void) unsigned char m,n;for(m=0;m100;m+)for(n=0;n200;n+) 函数功能:主函数void main(void)(unsigned char i;unsigned char code Tab =0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; 定义无符 号字符型数组while(l)for(i=0;i8;i+)PO=Tabi;依次引用数组元素,并将其送P0 口显示delay60ms();调用延时函数)实例25:用P0 口显示字符串常量#include 包含单片机寄存器的头文件/* 函
30、数功能:延时约 150ms (3*200*250=150 000 u s=150ms */ void delayl50ms(void)unsigned char m,n;for(m=0;m200;m+)for(n=0;n250;n+)/* 函数功能:主函数*/ void main(void)(unsigned char str=Now,Temperature is将字符串赋给字符型全部元素赋值unsigned char i;while(l)i=0; 将i初始化为,从第一个元素开始显示 while(st响!=。只要没有显示到结束标志、0 PO=stri;将第i个字符送到PO 口显示delayl5
31、0ms(); 调用 150ms 延时函数 i+;指向下个待显字符实例26:用P0 口显示指针运算结果#includevoid main(void)(unsigned char *pl,*p2; 定义无符号字符型指针变量pl,p2unsigned char i,j;定义无符号字符型数据i=25;给i赋初值25j=15;pl=&i;使指针变量指向i ,对指针初始化p2=&j;使指针变量指向j ,对指针初始化P0=*pl+*p2;pl+*p2 相于 i+j,所以 P0=25+15=40=0x28则P0=0010 10006I结果P0.3、P0.5引脚LED熄灭,其余点亮 while(l);无限循环,
32、防止程序“跑飞”实例27:用指针数组控制P0 8位LED流水点亮#include/* 函数功能:延时约 150ms (3*200*250=150 000 U s=150ms */ void delayl50ms(void)unsigned char m,n;for(m=0;m200;m+)for(n=0;n250;n+) 函数功能:主函数void main(void)unsigned char code Tab=0xfe/0xfd/0xfb/0xf7,0xef/0xdf/0xbfz0x7f;unsigned char *p =&Tab0/&Tabl,&Tab2/&Tab3/&Tab4,&Tab
33、5/ &Tab6,&Tab7;unsigned char i;定义无符号字符型数据while(l)for(i=0;i8;i+)PO=*pi;delayl50ms();)实例28:用数组的指针控制P0 8位LED流水点亮#include函数功能:延时约 150ms (3*200*250=150 000 H s=150ms void delayl50ms(void)unsigned char m,n;for(m=0;m200;m+)for(n=0;n250;n+)函数功能:主函数unsigned char i;unsigned char Tab =0xFF/0xFEz0xFD/0xFB/0xF7z
34、0xEF/0xDF/0xBF/0x7Fz0xBFz0xDFz0xEFz0xF7z0xFBz0xFDz0xFEz 0xFEz0xFCz0xFB,0xF0z0xE0z0xC0z0x80z0x00z 0xE7z0xDBz0xBDz0x7Ez0x3Cz0xl8z0x00z0x81z 0xC3z0xE7z0x7Ez0xBDz0xDBz0xE7z0xBDz0xDB; 流水灯控制码 unsigned char *p;定义无符号字符型指针p=Tab;将数组首地址存入指针pwhile(l) for(i=0;i32;i+) 共32个流水灯控制码 PO=*(p+i); (p+i)的值等于 aidelayl50ms(
35、); 调用 150ms 延时函数 ) ) 实例29:用P0、P1 口显示整型函数返回值#include/*函数功能:计算两个无符号整数的和*/unsigned int sum(int azint b)(unsigned int s;s=a+b;return (s);函数功能:王函数* /void main(void)(unsigned z;z=sum(2008z2009);Pl=z/256;取得z的高8位P0=z%256;取得z的低8位while(l)实例30:用有参函数控制P0 8位LED流水速度#include函数功能:延时一段时间void delay(unsigned char x)(unsigned char m,n;for(m=0;mx;m+) for(n=0;n200;n+)函数功能:王函数* /void main(void)(unsigned char