单片机总汇编语言经典一百例
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显示 ..................31word 完美整理版范文范例学习指导实例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:用数码管慢速动态扫描显示数字"1234" ........................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循环右移显示 "Welcome to China" ......................98 实例83:用 LCD显示适时检测结果................................... 102 实例84:液晶时钟设计 (106)word 完美整理版范文范例学习指导实例85:将数据"0x0f" 写入 AT24C02再读出送 P1口显示 (112)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (116)实例87:对 I2C 总线上挂接多个AT24C02的读写操作 (124)实例88:基于 AT24C02的多机通信读取程序 (129)实例88:基于 AT24C02的多机通信写入程序 (133)实例90:DS18B20温度检测及其液晶显示 (144)实例91:将数据"0xaa" 写入 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<reg51.h> // 包含51 单片机寄存器定义的头文件void main(void){while(1) // 无限循环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个主函数)word 完美整理版范文范例学习指导********************************************************/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 1111, 熄灭 LEDP0=P1; // 将P1 口状态送入P0口P2=P1; // 将P1 口状态送入P2口P3=P1; // 将P1 口状态送入P3口}}// 实例 6:使用 P3 口流水点亮8 位LED#include<reg51.h> // 包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void)word 完美整理版范文范例学习指导{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 口的操作/****************************************word 完美整理版范文范例学习指导函数功能:延时一段时间*****************************************/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> // 包含单片机寄存器的头文件word 完美整理版范文范例学习指导函数功能:用整形数据延时一段时间******************************************************/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(); // 延时一段较长的时间}}word 完美整理版// 实例 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 0111, 结果P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001, 结果P0.0、P0.4 的灯被熄灭}// 实例 10:用 P0、P1口显示乘法运算结果#include<reg51.h> // 包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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=1100 0000B,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 位,高位补0 delay(); // 调用延时函数}}}// 实例 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 输出低电平word 完美整理版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}}}word 完美整理版// 实例 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流水点亮word 完美整理版#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++);}word 完美整理版/*************************************************函数功能:主函数*************************************************/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,p2unsigned 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流水点亮word 完美整理版#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=150ms*************************************************/void delay150ms(void){unsigned char m,n;word 完美整理版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);}/*************************************************函数功能:主函数word 完美整理版*************************************************/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)}// 慢速流水点亮LEDword 完美整理版for(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)word 完美整理版{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 位控制码{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显示delay();}}}// 实例 38:字符串函数string.h 应用举例#include<reg51.h> // 包含51 单片机寄存器定义的头文件#include<string.h> // 包含函数 isalpha ()声明的头文件void main(void){unsigned char str1[ ]="Now, The temperature is :";unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); // 比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); // 防止程序“跑飞”}// 实例 39:宏定义应用举例 2。
单片机编程100例
单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用分歧数据类型控制灯闪烁时间#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++){int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){char_delay(); //延时一段较长的时间} P1=0xff; //熄灭 char_delay(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包括51单片机寄存器界说的头文件void main(void){}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包括单片机寄存器的头文件/函数功能:延时一段时间/void delay(void) //两个void意思分别为无需返回值, 没有参数传递 {unsigned int i; //界说无符号整数, 最年夜取值范围65535 for(i=0;i<20000;i++) //做20000次空循环; //什么也不做, 等候一个机器周期}/ 函数功能:主函数(C语言规定必需有也只能有1个主函数)/ void main(void){while(1) //无限循环{delay(); //延时一段时间delay(); //延时一段时间}}*实例6:将 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口}}*实例7:用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的灯被熄灭 }*实例8:用P0、P1口显示乘法运算结果#include<reg51.h> //包括单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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口灭, 其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包括单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止法式“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包括单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环, 防止法式“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包括单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口, P0=8=0000 1000B while(1); //设置无限循环, 防止法式“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包括单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口, P0=8=0000 1000B while(1); //设置无限循环, 防止法式“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包括单片机寄存器的头文件 voidmain(void){P0=0x3b<<2;//将左移运算结果送P0口, P0=1110 1100B=0xec while(1); //无限循环, 防止法式“跑飞”}*实例17:"万能逻辑电路"实验#include<reg51.h> //包括单片机寄存器的头文件void 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位, 高位补0 delay(); //调用延时函数}}}*实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包括单片机寄存器的头文件/函数功能:主函数/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> //包括单片机寄存器的头文件/函数功能:延时一段时间/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; case5:P0=0xef; //第五个LED亮 break; case 6:P0=0xdf; //第六个LED亮 break; case 7:P0=0xbf; //第七个LED亮 break;case 8:P0=0x7f; //第八个LED亮 break; default: //缺省值, 关闭所有LED P0=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 codeTab[ ]={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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned charp[ ]={&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=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 i;unsigned charTab[ ]={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 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 codeTab[]={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 byDS18B20";//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); //将指针数组名作实际参数传递}#include<reg51.h> //包括51单片机寄存器界说的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算, 若'_'是英文字母, P3=0xf0 }}#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(); //调用延时函数}}#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显示delay();}}}#include<reg51.h> //包括51单片机寄存器界说的头文件#include<string.h> //包括函数isalpha()声明的头文件void main(void){unsigned char str1[ ]="Now, The temperature is :"; unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比力两个字符串, 并将结果存入i if(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止法式“跑飞”}*实例39:宏界说应用举例2#include<reg51.h> //包括51单片机寄存器界说的头文件# define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏界说, a 和b为形参 void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参, 宏展开时, 实参将替代宏界说中的形参while(1);}*实例40:宏界说应用举例2#include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0; //将P3.0引脚置低电平, LED点亮P3_1=0; //将P3.0引脚置低电平, LED点亮P3_2=0; //将P3.0引脚置低电平, LED点亮P3_3=0; //将P3.0引脚置低电平, LED点亮P3_4=1; //将P3.4引脚置高电平, LED熄灭}P3_5=1; //将P3.5引脚置高电平, LED熄灭 P3_6=1; //将P3.7引脚置高电平, LED熄灭 P3_7=1; //将P3.7引脚置高电平, LED 熄灭 while(1) ;*实例41:宏界说应用举例3#include<reg51.h> //包括51单片机寄存器界说的头文件#define MAX 100 //将MAX宏界说为字符串100void main(void){#if MAX>80 //如果字符串100年夜于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则, P3口高四位LED点亮#endif //结束本次编译}/ 中断、按时器中断、按时器中断、按时器中断、按时器 /*实例42:用按时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包括51单片机寄存器界说的头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //按时器T0中断允许 TMOD=0x01; //使用按时器T0的模式1TH0=(65536-46083)/256; //按时器T0的高8位赋初值TL0=(65536-46083)%256; //按时器T0的高8位赋初值TR0=1; //启动按时器T0TF0=0;P2=0xff;while(1)//无限循环等候查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //按时器T0的高8位赋初值TL0=(65536-46083)%256; //按时器T0的高8位赋初值 }}/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //按时器T0中断允许 TMOD=0x10; //使用按时器T1的模式1TH1=(65536-921)/256; //按时器T1的高8位赋初值TL1=(65536-921)%256; //按时器T1的高8位赋初值TR1=1; //启动按时器T1TF1=0;while(1)//无限循环等候查询{while(TF1==0);TF1=0;TH1=(65536-921)/256; //按时器T0的高8位赋初值TL1=(65536-921)%256; //按时器T0的高8位赋初值 }}/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //按时器T0中断允许 TMOD=0x02; //使用按时器T0的模式2TH0=256-156; //按时器T0的高8位赋初值TL0=256-156; //按时器T0的高8位赋初值TR0=1; //启动按时器T0while(1)//无限循环等候查询{while(TF0==0) //如果未计满就等候{if(S==0) //按键S按下接地, 电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后, 将TF0清0}}*实例45:用按时器T0的中断控制1位LED闪烁#include<reg51.h> // 包括51单片机寄存器界说的头文件/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //按时器T0中断允许TMOD=0x01; //使用按时器T0的模式2TH0=(65536-46083)/256; //按时器T0的高8位赋初值TL0=(65536-46083)%256; //按时器T0的高8位赋初值TR0=1; //启动按时器T0while(1)//无限循环等候中断;}/ 函数功能:按时器T0的中断服务法式/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为按时器T0的中断编号;0暗示使用第0组工作寄存器TH0=(65536-46083)/256; //按时器T0的高8位重新赋初值TL0=(65536-46083)%256; //按时器T0的高8位重新赋初值}*实例46:用按时器T0的中断实现长时间按时#include<reg51.h> // 包括51单片机寄存器界说的头文件unsigned char Countor; //设置全局变量, 贮存按时器T0中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //按时器T0中断允许TMOD=0x01; //使用按时器T0的模式2TH0=(65536-46083)/256; //按时器T0的高8位赋初值TL0=(65536-46083)%256; //按时器T0的高8位赋初值TR0=1; //启动按时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等候中断;/ 函数功能:按时器T0的中断服务法式/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为按时器T0的中断编号;0暗示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次, 即计时满1s{Countor=0; //将Countor清0, 重新从0开始计数}TH0=(65536-46083)/256; //按时器T0的高8位重新赋初值TL0=(65536-46083)%256; //按时器T0的高8位重新赋初值}*实例47:用按时器T1中断控制两个LED以分歧周期闪烁#include<reg51.h> // 包括51单片机寄存器界说的头文件unsigned char Countor1; //设置全局变量, 贮存按时器T1中断次数unsigned char Countor2; //设置全局变量, 贮存按时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //按时器T1中断允许TMOD=0x10; //使用按时器T1的模式1TH1=(65536-46083)/256; //按时器T1的高8位赋初值TL1=(65536-46083)%256; //按时器T1的高8位赋初值TR1=1; //启动按时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等候中断;}/ 函数功能:按时器T1的中断服务法式/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为按时器T1的中断编号;0暗示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次, 即计时满100ms{D1=~D1; //按位取反把持, 将P2.0引脚输出电平取反Countor1=0; //将Countor1清0, 重新从0开始计数}if(Countor2==8) //若累计满8次, 即计时满400ms{D2=~D2; //按位取反把持, 将P2.1引脚输出电平取反Countor2=0; //将Countor1清0, 重新从0开始计数}TH1=(65536-46083)/256; //按时器T1的高8位重新赋初值TL1=(65536-46083)%256; //按时器T1的高8位重新赋初值}*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频#include<reg51.h> // 包括51单片机寄存器界说的头文件/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //按时器T1中断允许TMOD=0x10; //TMOD=0001 000B, 使用按时器T1的模式1TH1=(65536-921)/256; //按时器T1的高8位赋初值TL1=(65536-921)%256; //按时器T1的高8位赋初值TR1=1; //启动按时器T1while(1)//无限循环等候中断;}/ 函数功能:按时器T1的中断服务法式/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 {sound=~sound;TH1=(65536-921)/256; //按时器T1的高8位重新赋初值TL1=(65536-921)%256; //按时器T1的高8位重新赋初值}*实例49:用按时器T0的中断实现"渴望"主题曲的播放#include<reg51.h> //包括51单片机寄存器界说的头文件unsigned int C; //贮存按时器的按时常数//以下是C调高音的音频宏界说#define l_dao 262 //将“l_dao”宏界说为高音“1”的频率262Hz #define l_re 286 //将“l_re”宏界说为高音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏界说为高音“3”的。
单片机汇编语言经典一百例
单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。
在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。
本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。
1. 点亮LED灯```ORG 0x0000 ; 程序起始地址MOV P1, #0xAA ; P1口输出高电平,LED灯点亮END ; 程序结束```2. LED流水灯效果```ORG 0x0000 ; 程序起始地址MOV P1, #0x01 ; P1口输出低电平,第一个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x02 ; P1口输出低电平,第二个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x04 ; P1口输出低电平,第三个LED点亮CALL DELAY ; 调用延时函数MOV P1, #0x08 ; P1口输出低电平,第四个LED点亮CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```3. 数码管动态扫描显示```ORG 0x0000 ; 程序起始地址CLR P0.0 ; P0.0口输出低电平,选择第一个数码管MOV P2, #0x7E ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.1 ; P0.1口输出低电平,选择第二个数码管MOV P2, #0x30 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.2 ; P0.2口输出低电平,选择第三个数码管MOV P2, #0x6D ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数CLR P0.3 ; P0.3口输出低电平,选择第四个数码管MOV P2, #0x79 ; 将数码管对应的值存放到P2口CALL DELAY ; 调用延时函数…DELAY: ; 延时函数MOV R0, #100 ; 设置延时时间DELAY_LOOP:DJNZ R0, DELAY_LOOP ; 循环减一RET ; 返回END ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。
单片机编程100例
单片机编程实例100例大全单片机编程实例*实例1:使用P3口流水点亮8位LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时一段时间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(); //调用延时函数} / /}*实例2:通过对P3口地址的操作流水点亮8位LED#include<> //包含单片机寄存器的头文件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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#include<> //包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/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; //口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //口的灯点亮char_delay(); //延时一段较长的时间} P1=0xff; //熄灭 char_delay(); //延时一段较长的时间 } }*实例4:用单片机控制第一个灯亮#include<> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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,输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B,输出高电平delay(); //延时一段时间}}*实例6:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<> //包含单片机寄存器的头文件/ 函数功能:主函数(C语言规定必须有也只能有1个主函数) / void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}*实例7:用P0口、P1 口分别显示加法和减法运算结果 #include<> void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果、、口的灯被点亮 P0=n-m; //P0=17=0001 0001B,结果、的灯被熄灭 }*实例8:用P0、P1口显示乘法运算结果#include<> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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, 和口灭,其余亮P0=s%256; //低8位送P0口 , P3=192=c0H=1100 0000B,,,口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制P0口8位LED流水花样#include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=(8>4)8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1) ; //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<> //包含单片机寄存器的头文件 void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为sbit X=P1^5; //将X位定义为sbit Y=P1^6; //将Y位定义为sbit Z=P1^7; //将Z位定义为void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}*实例18:用右移运算流水点亮P1口8位LED #include<> //包含单片机寄存器的头文件/函数功能:延时一段时间/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位,高位补0 delay(); //调用延时函数}}}*实例19:用if语句控制P0口8位LED的流水方向 #include<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为sbit S2=P1^5; //将S2位定义为/函数功能:主函数/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<> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为/函数功能:延时一段时间/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,重新将其置为1 i=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: //缺省值,关闭所有LED P0=0xff; }*实例21:用for语句控制蜂鸣器鸣笛次数#include<> //包含单片机寄存器的头文件 sbit sound=P3^7; //将sound位定义为 / 函数功能:延时形成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; //输出低电平 delay1600(); sound=1; //输出高电平 delay1600(); }for(i=0;i<200;i++){sound=0; //输出低电平 delay800(); sound=1; //输出高电平 delay800(); }}}*实例22:用while语句控制LED#include<> //包含单片机寄存器的头文件 / 函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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<> //包含单片机寄存器的头文件/函数功能:延时约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 codeTab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示delay60ms();//调用延时函数}}}*实例25:用P0口显示字符串常量#include<> //包含单片机寄存器的头文件/函数功能:延时约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<>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,结果、引脚LED熄灭,其余点亮 while(1) ; //无限循环,防止程序“跑飞”}*实例27:用指针数组控制P0口8位LED流水点亮 #include<> /函数功能:延时约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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned charp[ ]={&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<> /函数功能:延时约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 i;unsigned charTab[ ]={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<>/ 函数功能:计算两个无符号整数的和/ 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<> / 函数功能:延时一段时间/ 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<>/函数功能:延时约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<> /函数功能:延时约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<> //包含51单片机寄存器定义的头文件unsigned char codeTab[]={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<> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested byDS18B20";//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:字符函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> void main(void){while(1){P3=isalpha('_')0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}*实例36:内部函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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:标准函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数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显示delay();}}}*实例38:字符串函数应用举例#include<> //包含51单片机寄存器定义的头文件 #include<> //包含函数isalpha()声明的头文件 void main(void){unsigned char str1[ ]="Now, The temperature is :";unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}*实例39:宏定义应用举例2#include<> //包含51单片机寄存器定义的头文件# define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏定义,a和b 为形参 void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}*实例40:宏定义应用举例2#include<>#include<>void main(void){P3_0=0; //将引脚置低电平,LED点亮P3_1=0; //将引脚置低电平,LED点亮P3_2=0; //将引脚置低电平,LED点亮P3_3=0; //将引脚置低电平,LED点亮P3_4=1; //将引脚置高电平,LED熄灭}P3_5=1; //将引脚置高电平,LED熄灭 P3_6=1; //将引脚置高电平,LED熄灭 P3_7=1; //将引脚置高电平,LED熄灭 while(1) ;*实例41:宏定义应用举例3#include<> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值 }*实例43:用定时器T1查询方式控制单片机发出1KHz音频#include<> // 包含51单片机寄存器定义的头文件 sbitsound=P3^7; //将sound位定义为引脚/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值 }*实例44:将计数器T0计数的结果送P1口8位LED显示 #include<> // 包含51单片机寄存器定义的头文件 sbit S=P3^4; //将S位定义为引脚/ 函数功能:主函数/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}*实例45:用定时器T0的中断控制1位LED闪烁 #include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例46:用定时器T0的中断实现长时间定时#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚sbit D2=P2^1; //将D2位定义为引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将引脚输出电平取反 Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将引脚输出电平取反 Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 #include<> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 {sound=~sound;TH1=(65536-921)/256; //定时器T1的高8位重新赋初值TL1=(65536-921)%256; //定时器T1的高8位重新赋初值}*实例49:用定时器T0的中断实现"渴望"主题曲的播放 #include<> //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为unsigned int C; //储存定时器的定时常数//以下是C调低音的音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz #define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz #define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz #define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz //以下是C调中音的音频宏定义#define dao 523 //将“dao”宏定义为中音“1”的频率523Hz#define re 587 //将“re”宏定义为中音“2”的频率587Hz#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz#define sao 784 //将“sao”宏定义为中音“5”的频率784Hz#define la 880 //将“la”宏定义为中音“6”的频率880Hz#define xi 987 //将“xi”宏定义为中音“7”的频率523H //以下是C调高音的音频宏定义#define h_dao 1046 //将“h_dao”宏定义为高音“1”的频率1046Hz #define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz #define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz #define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率1567Hz #define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz #define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率1975Hz /函数功能:1个延时单位,延时200ms/void delay()。
51单片机C语言编程100例
目录实例3:用单片机控制第一个灯亮 (5)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (7)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例10:用P0、P1口显示乘法运算结果 (15)实例11:用P1、P0口显示除法运算结果 (16)实例12:用自增运算控制P0口8位LED流水花样 (16)实例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流水点亮 (31)实例25:用P0口显示字符串常量 (32)实例26:用P0 口显示指针运算结果 (34)实例27:用指针数组控制P0口8位LED流水点亮 (34)实例28:用数组的指针控制P0 口8 位LED流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (38)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (41)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (45)实例34:用指针数组作为函数的参数显示多个字符串 (47)实例35:字符函数ctype.h应用举例 (49)实例36:内部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (65)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (66)实例50-1:输出50个矩形脉冲 (72)实例50-2:计数器T0统计外部脉冲数 (73)实例51-2:定时器T0的模式2测量正脉冲宽度 (74)实例52:用定时器T0控制输出高低宽度不同的矩形波 (76)实例53:用外中断0的中断方式进行数据采集 (78)实例54-1:输出负脉宽为200微秒的方波 (79)实例54-2:测量负脉冲宽度 (80)实例55:方式0控制流水灯循环点亮 (82)实例56-1:数据发送程序 (84)实例56-2:数据接收程序 (86)实例57-1:数据发送程序 (88)实例57-2:数据接收程序 (90)实例58:单片机向PC发送数据 (92)实例59:单片机接收PC发出的数据 (94)实例60:用LED数码显示数字5 (96)实例61:用LED数码显示器循环显示数字0~9 (96)实例62:用数码管慢速动态扫描显示数字"1234" (98)实例63:用LED数码显示器伪静态显示数字1234 (99)实例64:用数码管显示动态检测结果 (101)实例65:数码秒表设计 (105)实例66:数码时钟设计 (108)实例67:用LED数码管显示计数器T0的计数值 (115)实例68:静态显示数字“59” (118)实例69:无软件消抖的独立式键盘输入实验 (118)实例70:软件消抖的独立式键盘输入实验 (119)实例71:CPU控制的独立式键盘扫描实验 (121)实例72:定时器中断控制的独立式键盘扫描实验 (127)实例73:独立式键盘控制的4级变速流水灯 (134)实例74:独立式键盘的按键功能扩展:"以一当四" (138)实例75:独立式键盘调时的数码时钟实验 (141)实例76:独立式键盘控制步进电机实验 (149)实例77:矩阵式键盘按键值的数码管显示实验 (154)实例78:矩阵式键盘按键音 (160)实例79:简易电子琴 (164)实例80:矩阵式键盘实现的电子密码锁 (176)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (189)实例83:用LCD显示适时检测结果 (196)实例84:液晶时钟设计 (204)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (216)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (224)实例87:对I2C总线上挂接多个AT24C02的读写操作 (239)实例88:基于AT24C02的多机通信读取程序 (250)实例88:基于AT24C02的多机通信写入程序 (258)实例90:DS18B20温度检测及其液晶显示 (280)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (298)实例92:将流水灯控制码写入X5045并读出送P1口显示 (305)实例93:对SPI总线上挂接多个X5045的读写操作 (313)实例94:基于ADC0832的数字电压表 (321)实例95:用DAC0832产生锯齿波电压 (333)实例96:用P1口显示红外遥控器的按键值 (334)实例97:用红外遥控器控制继电器 (339)实例98:基于DS1302的日历时钟 (344)实例99:单片机数据发送程序 (362)实例100:电机转速表设计 (365)模拟霍尔脉冲 (375)/*函数的使用和熟悉*///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环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 1111, 熄灭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~255for(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 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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=1100 0000B,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 1000Bwhile(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位,高位补0 delay(); //调用延时函数}}//实例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,p2unsigned 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=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 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 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 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)。
单片机C语言代码手册 含100多个经典C程序
单片机C语言代码手册1.LED灯点亮一个LED#include<reg51.h>void main(){while(1){P0=0x01;P2=0x7d;}}流水灯闪烁#include<reg52.h>sbit LED=P0^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){LED=0;delay(60);LED=1;delay(10);}流水灯_左移#include<reg52.h>#include<intrins.h>unsigned char aa;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){aa=0xfe;while(1){P0=aa;delay(1000);aa=_crol_(aa,1);}}跑马灯#include<reg51.h>#include <intrins.h>void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}void main(){unsigned char LED;LED = 0xfe; //11111110P2 = LED;while(1){delayms(250);LED = _crol_(LED,1); //循环右移1位,点亮下一个LED P2 = LED;}}用循环移位指令实现LED流水灯效果#include <reg51.h>#include <intrins.h>void delayms(unsigned char i) //延时子程序{unsigned char j;while(i--){for(j=0;j<120;j++);}}void main(){unsigned char LED;LED = 0xfe; //0xfe = 1111 1110while(1){P2 = LED;delayms(250);LED = LED << 1; / /循环右移1位,点亮下一个LED "<<"为左移位if(LED == 0x00 ){LED = 0xfe; // 0xfe = 1111 1110}}}左右跑马灯#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}char LED;void main(){unsigned char i;while (1){LED = 0xfe;for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED << 1; //左移LED = LED | 0x01; //移位后,后面的位为高电平if(LED == 0x7f)break; //提前退出FOR 循环}for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED >> 1; // 右移LED = LED | 0x80; // 移位后,后面的位为高电平}}}LED作二进制加法#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}void main(){unsigned char Num = 0xff;while (1){P2 = Num;delay(1000);Num--;}}LED闪烁-定时器#include<reg52.h>#include<intrins.h>unsigned char num,aa=0xfe;void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1){if(num==1){num=0;P2=aa;aa=_crol_(aa,1);}}}void T0_time()interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}2.数码管0-9显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){int cnt=0;while(1){P0=0x02;P2=num[cnt];if(++cnt>9)cnt=0;delay2ms(2500);}}95显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char s[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};main(){unsigned char num=95;unsigned char cnt=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay2ms(1);}}138片选实现动态显示#include <reg51.h>#include <intrins.h>sbit LS138A = P2^2; //定义LS138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义LS138译码器的输入B脚由P2.3控制sbit LS138C = P2^4; //定义LS138译码器的输入C脚由P2.4控制void delay(unsigned int i); //函数声名char cnt;unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void main(){unsigned int i,j=1 ;unsigned int led[10];cnt=0;while(1) //进入循环状态{if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=Disp_Tab[j%10000/1000]|0x80;led[1]=Disp_Tab[j%1000/100]|0x80;led[2]=Disp_Tab[j%100/10]|0x80;led[3]=Disp_Tab[j%10]|0x80;led[4]=Disp_Tab[j%10000/1000]; //千位led[5]=Disp_Tab[j%1000/100]; //百位带小数点led[6]=Disp_Tab[j%100/10]; //十位led[7]=Disp_Tab[j%10]; //个位for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = led[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}单片机直接片选实现动态显示#include <reg51.h>#include <intrins.h>void delay(unsigned int i); //函数声名char DelayCNT; //定义变量unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//段码控制unsigned char code dispbit[8]= //共阴数码管1-8个{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表法void main(){unsigned int i,LedNumV al=1 ; //变量定义unsigned int LedOut[10]; //变量定义DelayCNT=0;while(1){if(++DelayCNT>=20) //控制数字变化速度{DelayCNT=0; //20个扫描周期清零一次++LedNumV al; //每隔20个扫描周期加一次}LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]|0x80;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];LedOut[4]=Disp_Tab[LedNumV al%10000/1000]; //千位LedOut[5]=Disp_Tab[LedNumV al%1000/100]|0x80; //百位小数LedOut[6]=Disp_Tab[LedNumV al%100/10]; //十位LedOut[7]=Disp_Tab[LedNumV al%10]; //个位for( i=0; i<9; i++){P0 = LedOut[i];P1 = dispbit[i]; //使用查表法进行位选switch(i) //使用switch 语句控制位选{case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;}delay(150); //扫描间隔时太长会数码管会有闪烁感}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}动态-静态LED#include <reg51.h>#include <intrins.h>sbit LED8_1=P1^1; //J14接在P1.1上void delay(unsigned int i); //函数声名char DelayCNT;char LED;void main(){LED = 0x01;DelayCNT=0;while(1){if(++DelayCNT>=10) //点亮动静LED灯速度控制{DelayCNT=0;LED = LED << 1; //左移if(LED==0) LED = 1; //移位后,后面的位为高电平}P0 =LED;LED8_1=0;delay(1000); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}数码管_138动态显示#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;uchar code led[8];void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}uchar code table[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){while(1) //进入循环状态{uint cnt,j;LS138A=1;LS138B=1;LS138C=1;if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=table[j%10000/1000];led[1]=table[j%1000/100];led[2]=table[j%100/10];led[3]=table[j%10];led[4]=table[j%10000/1000]; //千位led[5]=table[j%1000/100]; //百位带小数点led[6]=table[j%100/10]; //十位led[7]=table[j%10]; //个位}}数码管_依次显示0-F#include<reg52.h>unsigned char code table[]= //共阳数码管{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char cnt;while(1)for(cnt=0;cnt<16;cnt++){P0= table[cnt];delay(100);}}数码管_直选动态显示#include<reg52.h>unsigned char code dispiaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code table[]={0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char m;while(1){for(m=0;m<8;m++){P0=table[m];P1=dispiaybit[m];delay(1);}}}数码管秒表#include<reg52.h>void delay(int xms){unsigned int cnt;for(cnt=0;cnt<xms*50;cnt++);}unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void main(){unsigned char num=0;unsigned char cnt=0;unsigned char hour=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay(4);if(cnt>=250){num++;cnt=0;}}}一位静态显示#include <reg51.h>#include <intrins.h>#define NOP() _nop_() //定义空指令void delay(unsigned int i); //函数声名unsigned char code LED7Code[] = //共阳极{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};void main(){unsigned int LedNumV al=1 ,C ; //定义变量while(1){if (++C>= 300){LedNumV al++ ; //每隔300个扫描周期加一次C =0; //每隔300个扫描清零} //将字模送到P0口显示P0 = LED7Code[LedNumV al%10]&0x7f;//LED7 0x7f为小数点共阴和共阳此处不一样;delay(150); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}3.蜂鸣器嘀嘀#include <reg52.h>sbit buzz = P3^4;main(){TMOD = 0x01;TH0 = -(1000/256);TL0 =- (1000%256);EA = 1;ET0 = 1;TR0 = 1;for(;;){} }void T0_irq(void) interrupt 1 using 1{TH0 = -(300/256);TL0 =- (300%256);buzz = ~buzz;}PZ_蜂鸣器#include<reg52.h>sbit beep=P1^5;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){beep=1;delay(1);beep=0;delay(1);}八月桂花本例采用89C52, 晶振为11.0592MHZ关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; #include <REG52.H>#include <INTRINS.H>sbit Beep = P1^5 ;unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] = //格式为: 频率常数, 节拍常数,频率常数, 节拍常数, {0x18, 0x30, 0x1C , 0x10,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--);各位可编译一下看看汇编结果就知道了!}void main(){ unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD|=0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1){a: p=music_tab[i];if(p==0x00){ i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab[i++], n=music_tab[i++];} //取频率常数和节拍常数TR0=1; //开定时器1while(n!=0)Beep=~Beep,delay(m); //等待节拍完成,通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1}}5.继电器按键控制继电器#include <reg51.h>sbit RELAY = P1^4; //定义继电器对应单片机管脚sbit K1 = P2^7; //定义按钮对应单片机管脚void main(){if (!K1)RELAY = 0; //按钮按下开启继电器else RELAY = 1; //按钮松开关闭继电器}4.按键模拟开关#include <reg52.H>sbit K1=P3^0;sbit L1=P2^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){while(1){if(K1==0){delay(100);if(K1==0){L1=~L1;while(!K1);}}}}按键键状态显示#include <reg51.h>#include <intrins.h>sbit BEEP = P1^5;sbit RELAY= P1^4;sbit K1 = P0^0;sbit K2 = P0^1;sbit K3 = P0^2;sbit K4 = P0^3;sbit K5 = P0^4;sbit K6 = P0^5;void beep();main(){while(1){P2 = 0xff;if(K1==0)P2 = 0xfe;if(K2 == 0)P2 = 0xfd;if(!K3)P2 = 0xfb;if(!K4)P2 = 0xf7;if(!K5 )beep(); //喇叭发声RELAY = 1;if (!K6 )RELAY = 0; //通过了反相器}}void beep(){unsigned char i , j;for (i=0;i<100;i++){BEEP=!BEEP; //BEEP取反for (j = 0 ; j<250 ; j++) //需要产生方波_nop_();}BEEP=1; //关闭蜂鸣器}按键移位#include <reg51.h>#include <intrins.h>void delayms(unsigned char ms);void proc_key(unsigned char key_v);void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}sbit K1 = P0^0; //对应按钮K1sbit K2 = P0^1; //对应按钮K2void main(){unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1){key_s = scan_key();if(key_s != key_v){delayms(10);key_s = scan_key();if(key_s != key_v){key_v = key_s;proc_key(key_v);}}}}unsigned char scan_key(){unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;}void proc_key(unsigned char key_v){if((key_v & 0x01) == 0){P2 = _cror_(P2,1);}else if((key_v & 0x02) == 0){P2 = _crol_(P2, 1);}}6.定时器/中断蜂铃器_timer1#include < reg51.h >#include <intrins.h>sbit Beep = P1^5;unsigned int USE_C ;void main(){TMOD=0x10; //定时/计数器1工作于方式1TH0=0x4C;TL0=0x00; //50ms定时常数EA=1; //开总中断ET1=1; //允许定时/计数器1 中断TR1=1; //启动定时/计数器1 中断while(1);}void Time1(void) interrupt 3{TH1=0x4c; //50ms定时TL1=0x00;if (++USE_C == 20) //每隔1秒发声{ Beep = ~Beep;USE_C = 0;}}中断0计数_1位数码管显示#include < reg51.h >#include <intrins.h>unsigned int LedNumV al;// 此表为LED 的字模/ 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };void main(void){// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){P0=Disp_Tab[LedNumV al%10];}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}中断0计数_4位数码管显示试验4位数码管上显示外部中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al = 0 ,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}display(){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}void main(void){P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){display();}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}INT0+INT1#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al_1,LedNumV al_2,LedOut[8]; unsigned char code Disp_Tab[] =/ /共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(void){ unsigned char i;P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EX0=1;// IT1=0; //低电平触发IT1=1; //下降沿触发EX1=1;EA=1;while(1){LedOut[0]=Disp_Tab[LedNumV al_1%10000/1000];LedOut[1]=Disp_Tab[LedNumV al_1%1000/100]|0x80;//0x7f小数点LedOut[2]=Disp_Tab[LedNumV al_1%100/10];LedOut[3]=Disp_Tab[LedNumV al_1%10];LedOut[4]=Disp_Tab[LedNumV al_2%10000/1000];LedOut[5]=Disp_Tab[LedNumV al_2%1000/100];LedOut[6]=Disp_Tab[LedNumV al_2%100/10];LedOut[7]=Disp_Tab[LedNumV al_2%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}INT0中断函数void counter0(void) interrupt 0{EX0=0;delay(100);LedNumV al_1++;EX0=1;}INT1中断函数void counter1(void) interrupt 2{EX1=0;delay(100);LedNumV al_2++;EX1=1;}T0_数码管#include<reg51.h>char num;unsigned char Led [10] ={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-45872)/256;TL0=(65536-45872)%256;while(1);}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==200){num=0;P0 = 0x1e;P2 = Led[1];}}TIMEER0试验数码管上显示定时器中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2; //定义138管脚sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };系统初始化void system_Ini(){TMOD|= 0x11;TH1=0x1C; //12.000MTL1=0x18;IE = 0x8A;TR1 = 1;}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(){system_Ini() ;while(1){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}[ t1 (1ms)中断] 中断void T1zd(void) interrupt 3 //3定时器1的中断号{TH1 = 0x1c; //12.000TL1 = 0x18;LedNumV al++;}定时器#include"reg51.h"bit SecFlag = 0;code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0= 0xf8; //中断返回TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //中断定时初始化{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0//中断允许控制E:enable// 1 00 0 0 0 1 0}void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) //计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}}}定时器_按键#include"reg51.h"bit SecFlag = 0;sbit TIMESTOP_K = P1^0;void Delay2ms(unsigned int DelayTime) //软件延时{unsigned int Count;for(Count = 0;Count < DelayTime*50;Count++);}code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0 = 0xf8;TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //硬件延时{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0E:enable //中断允许控制// 1 00 0 0 0 1 0 }void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) // 计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}//按键工作,让走时停止,StopFlag = 1if(TIMESTOP_K == 0){Delay2ms(5);while(TIMESTOP_K == 0);StopFlag = ~ StopFlag;}}}7.LED点阵显示数字LED点阵实验(流动显示1 2 3 4 5 6 7 8 9)#include<reg51.h>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code digittab[18][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中};unsigned int timecount;unsigned char cnta;unsigned char cntb;void main(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1; //开启定时0ET0=1;EA=1; //开启中断cntb=0;while(1){ ;}}void t0(void) interrupt 1 using 0{TH0=(65536-3000)/256; //定时器高位装载数据TL0=(65536-3000)%256; //定时器低位装载数据if(cntb<18) //红色{P1=0xFF;P2=tab[cnta];P0=digittab[cntb][cnta];}else //绿色{P2=0xFF;P1=tab[cnta];P0=digittab[cntb-18][cnta];}if(++cnta>=8) cnta=0;if(++timecount>=333){timecount=0;if(++cntb>=36)cntb=0;}}滚动LED点阵实验(左右上下流动显示)#include <REG51.H>unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay1(void){unsigned char i,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){unsigned char i,j;while(1){for(j=0;j<3;j++) //from left to right 3 time{for(i=0;i<8;i++){P2=taba[i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from right to left 3 time{for(i=0;i<8;i++){P2=taba[7-i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from top to bottom 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[7-i];delay1();}}for(j=0;j<3;j++) //from bottom to top 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[i];delay1();}}}}8.1602液晶静态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN1988"; //12 uchar code table2[]="TEL 134********"; //15 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void main(){R=0;init();for(num=0;num<12;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table2[num]);delay(20);}while(1);}动态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN"; //8 uchar code table2[]="134********"; //11 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80+0x10);}void main(){R=0;init();for(num=0;num<8;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x53);for(num=0;num<11;num++){write_data(table2[num]);delay(20);}for(num=0;num<16;num++){write_com(0x18);delay(20);}while(1);}滚动显示1、从左到右逐字显示,闪动二次,清屏。
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口的操作/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某。
经典单片机编程100例
经典单片机编程100例单片机是指具有微处理器内核、存储器和输入输出设备的集成电路芯片。
它广泛应用于各种电子设备中,例如家用电器、汽车电子、工业自动化等领域。
单片机编程是指通过给单片机内部写入特定的指令,使其按照程序逻辑完成特定的功能。
本文将介绍经典的单片机编程实例,帮助读者更好地理解和掌握单片机编程的基本原理和技巧。
1. LED闪烁程序在单片机编程中,最简单的实例之一就是控制LED灯的闪烁。
通过设置相应的IO口为输出模式,并在循环中对该IO口进行高低电平的切换,可以实现LED的闪烁效果。
以下是一个基本的LED闪烁程序示例:```c#include <reg51.h>sbit LED = P1^0;void delay(unsigned int t){while(t--);}void main(){while(1){LED = 0; // 点亮LEDdelay(50000);LED = 1; // 熄灭LEDdelay(50000);}}```上述代码中,通过设置P1口的第0位为1或者0,控制LED的亮灭状态,并在两个状态之间加入适当的延时,从而实现LED的闪烁。
2. 按键控制LED开关在单片机编程中,常常需要通过外部输入设备来控制其他设备的状态。
例如,通过按下按钮来控制LED的开关。
以下是一个简单的按键控制LED开关的程序示例:```c#include <reg51.h>sbit LED = P1^0;sbit Key = P0^0;void delay(unsigned int t){while(t--);}void main(){while(1){if(Key==0) // 如果按键被按下{LED = ~LED; // 取反LED的状态delay(50000); // 延时一段时间,防止按键抖动 while(Key==0); // 等待按键释放}}}```上述代码中,通过检测P0口的第0位,判断是否有按键按下。
单片机编程100例
单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#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(); //延时一段时间}}*实例6:将 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口}}*实例7:用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的灯被熄灭 } *实例8:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例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: //缺省值,关闭所有LED P0=0xff; }*实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件 sbitsound=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 codeTab[ ]={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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned charp[ ]={&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=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 i;unsigned charTab[ ]={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 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 codeTab[]={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 byDS18B20";//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<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<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显示delay();}}}*实例38:字符串函数string.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<string.h> //包含函数isalpha()声明的头文件 void main(void){unsigned char str1[ ]="Now, The temperature is :"; unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}*实例39:宏定义应用举例2#include<reg51.h> //包含51单片机寄存器定义的头文件# define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏定义,a和b 为形参 void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}*实例40:宏定义应用举例2#include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0; //将P3.0引脚置低电平,LED点亮P3_1=0; //将P3.0引脚置低电平,LED点亮P3_2=0; //将P3.0引脚置低电平,LED点亮P3_3=0; //将P3.0引脚置低电平,LED点亮P3_4=1; //将P3.4引脚置高电平,LED熄灭P3_5=1; //将P3.5引脚置高电平,LED熄灭 P3_6=1; //将P3.7引脚置高电平,LED熄灭 P3_7=1; //将P3.7引脚置高电平,LED熄灭while(1) ;*实例41:宏定义应用举例3#include<reg51.h> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void)// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值 }}*实例43:用定时器T1查询方式控制单片机发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值 }}*实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h> // 包含51单片机寄存器定义的头文件 sbit S=P3^4; //将S位定义为P3.4引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁 #include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/ 函数功能:主函数{EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例46:用定时器T0的中断实现长时间定时#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚sbit D2=P2^1; //将D2位定义为P2.1引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反 Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将P2.1引脚输出电平取反 Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 {sound=~sound;TH1=(65536-921)/256; //定时器T1的高8位重新赋初值TL1=(65536-921)%256; //定时器T1的高8位重新赋初值}*实例49:用定时器T0的中断实现"渴望"主题曲的播放#include<reg51.h> //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7unsigned int C; //储存定时器的定时常数//以下是C调低音的音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz #define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz #define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz #define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz //以下是C调中音的音频宏定义#define dao 523 //将“dao”宏定义为中音“1”的频率523Hz#define re 587 //将“re”宏定义为中音“2”的频率587Hz#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz。
51单片机C语言编程100例
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单片机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:用数码管慢速动态扫描显示数字"1234" (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循环右移显示"Welcome to China" (98)实例83:用LCD显示适时检测结果 (102)实例84:液晶时钟设计 (106)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (112)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (116)实例87:对I2C总线上挂接多个AT24C02的读写操作 (124)实例88:基于AT24C02的多机通信读取程序 (129)实例88:基于AT24C02的多机通信写入程序 (133)实例90:DS18B20温度检测及其液晶显示 (144)实例91:将数据"0xaa"写入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<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环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 1111, 熄灭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 0111,结果P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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=1100 0000B,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 1000Bwhile(1); //设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000Bwhile(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位,高位补0 delay(); //调用延时函数}}}//实例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,p2unsigned 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=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 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 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 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显示delay();}}}//实例38:字符串函数string.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<string.h> //包含函数isalpha()声明的头文件void main(void){unsigned char str1[ ]="Now, The temperature is :";unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}//实例39:宏定义应用举例2#include<reg51.h> //包含51单片机寄存器定义的头文件# define F(a,b) (a)+(a)*(b)/256+(b) //带参数的宏定义,a和b为形参void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}//实例40:宏定义应用举例2#include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0; //将P3.0引脚置低电平,LED点亮P3_1=0; //将P3.0引脚置低电平,LED点亮P3_2=0; //将P3.0引脚置低电平,LED点亮P3_3=0; //将P3.0引脚置低电平,LED点亮P3_4=1; //将P3.4引脚置高电平,LED熄灭P3_5=1; //将P3.5引脚置高电平,LED熄灭P3_6=1; //将P3.7引脚置高电平,LED熄灭P3_7=1; //将P3.7引脚置高电平,LED熄灭while(1);}//实例41:宏定义应用举例3#include<reg51.h> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/*中断、定时器*///实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/**************************************************************函数功能:主函数**************************************************************/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值}}//实例43:用定时器T1查询方式控制单片机发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/**************************************************************函数功能:主函数**************************************************************/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}//实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚/**************************************************************函数功能:主函数**************************************************************/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}//实例45:用定时器T0的中断控制1位LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/**************************************************************函数功能:定时器T0的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值。
(完整word版)单片机汇编语言经典一百例
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 微秒。
51单片机C语言编程100例.doc
; //无限循环防止程序“跑飞”
}
//
#include<reg51.h> //包含单片机寄存器的头文件
/******************************************************
函数功能:延时一段时间
******************************************************/
sbit F=P1^4; //将F位定义为 P1.4
sbit X=P1^5; //将X位定义为 P1.5
sbit Y=P1^6; //将Y位定义为 P1.6
sbit Z=P1^7; //将Z位定义为 P1.7
void main(void)
{
while(1)
{
F=((~X)&Y)|Z; //将逻辑运算结果赋给F
; //利用循环等待若干机器周期,从而延时一段时间
}
/*****************************************
函数功能:主函数
******************************************/
void main(void)
{
while(1)
{
x=0xfe; //第一个灯亮
}
//
#include<reg51.h> //包含单片机寄存器的头文件
void main(void)
{
unsigned char m,n;
unsigned int s;
m=64;
n=71;
s=m*n; //s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口
51单片机C语言编程100例
目录实例3:用单片机控制第一个灯亮 (5)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (7)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例10:用P0、P1口显示乘法运算结果 (15)实例11:用P1、P0口显示除法运算结果 (16)实例12:用自增运算控制P0口8位LED流水花样 (16)实例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流水点亮 (31)实例25:用P0口显示字符串常量 (32)实例26:用P0 口显示指针运算结果 (34)实例27:用指针数组控制P0口8位LED流水点亮 (34)实例28:用数组的指针控制P0 口8 位LED流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (38)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (41)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (45)实例34:用指针数组作为函数的参数显示多个字符串 (47)实例35:字符函数ctype.h应用举例 (49)实例36:部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (65)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (66)实例50-1:输出50个矩形脉冲 (72)实例50-2:计数器T0统计外部脉冲数 (73)实例51-2:定时器T0的模式2测量正脉冲宽度 (74)实例52:用定时器T0控制输出高低宽度不同的矩形波 (76)实例53:用外中断0的中断方式进行数据采集 (78)实例54-1:输出负脉宽为200微秒的方波 (79)实例54-2:测量负脉冲宽度 (80)实例55:方式0控制流水灯循环点亮 (82)实例56-1:数据发送程序 (84)实例56-2:数据接收程序 (86)实例57-1:数据发送程序 (88)实例57-2:数据接收程序 (90)实例58:单片机向PC发送数据 (92)实例59:单片机接收PC发出的数据 (94)实例60:用LED数码显示数字5 (96)实例61:用LED数码显示器循环显示数字0~9 (96)实例62:用数码管慢速动态扫描显示数字"1234" (98)实例63:用LED数码显示器伪静态显示数字1234 (99)实例64:用数码管显示动态检测结果 (101)实例65:数码秒表设计 (105)实例66:数码时钟设计 (108)实例67:用LED数码管显示计数器T0的计数值 (115)实例68:静态显示数字“59” (118)实例69:无软件消抖的独立式键盘输入实验 (118)实例70:软件消抖的独立式键盘输入实验 (119)实例71:CPU控制的独立式键盘扫描实验 (121)实例72:定时器中断控制的独立式键盘扫描实验 (127)实例73:独立式键盘控制的4级变速流水灯 (134)实例74:独立式键盘的按键功能扩展:"以一当四" (138)实例75:独立式键盘调时的数码时钟实验 (141)实例76:独立式键盘控制步进电机实验 (149)实例77:矩阵式键盘按键值的数码管显示实验 (154)实例78:矩阵式键盘按键音 (160)实例79:简易电子琴 (164)实例80:矩阵式键盘实现的电子密码锁 (176)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (189)实例83:用LCD显示适时检测结果 (196)实例84:液晶时钟设计 (204)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (216)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (224)实例87:对I2C总线上挂接多个AT24C02的读写操作 (239)实例88:基于AT24C02的多机通信读取程序 (250)实例88:基于AT24C02的多机通信写入程序 (258)实例90:DS18B20温度检测及其液晶显示 (280)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (298)实例92:将流水灯控制码写入X5045并读出送P1口显示 (305)实例93:对SPI总线上挂接多个X5045的读写操作 (313)实例94:基于ADC0832的数字电压表 (321)实例95:用DAC0832产生锯齿波电压 (333)实例96:用P1口显示红外遥控器的按键值 (334)实例97:用红外遥控器控制继电器 (339)实例98:基于DS1302的日历时钟 (344)实例99:单片机数据发送程序 (362)实例100:电机转速表设计 (365)模拟霍尔脉冲 (375)/*函数的使用和熟悉*///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环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 1111, 熄灭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~255for(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 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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=1100 0000B,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 1000Bwhile(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位,高位补0 delay(); //调用延时函数}}//实例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,p2unsigned 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=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 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 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 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)。
单片机编程100例.doc
单片机编程实例100例大全单片机编程实例*实例1:使用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(); //调用延时函数} / /}*实例2:通过对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(); //调用延时函数}}*实例3:用不同数据类型控制灯闪烁时间#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(); //延时一段较长的时间 } } *实例4:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#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(); //延时一段时间}}*实例6:将 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口}}*实例7:用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的灯被熄灭 } *实例8:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;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口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5) 10)/5; //求小数while(1); //无限循环防止程序“跑飞”}*实例10:用自增运算控制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(); //调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果 #include<reg51.h> //包含单片机寄存器的头文件 void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件 voidmain(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++)//设置循环次数为8P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}}*实例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: //缺省值,关闭所有LED P0=0xff; }*实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件 sbitsound=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 codeTab[ ]={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 codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned charp[ ]={&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=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 i;unsigned charTab[ ]={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 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 codeTab[]={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 byDS18B20";//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<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<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显示delay();}}}*实例38:字符串函数string.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<string.h> //包含函数isalpha()声明的头文件 void main(void){unsigned char str1[ ]="Now, The temperature is :"; unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}*实例39:宏定义应用举例2#include<reg51.h> //包含51单片机寄存器定义的头文件# define F(a,b) (a)+(a) (b)/256+(b) //带参数的宏定义,a和b 为形参 void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}*实例40:宏定义应用举例2#include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0; //将P3.0引脚置低电平,LED点亮P3_1=0; //将P3.0引脚置低电平,LED点亮P3_2=0; //将P3.0引脚置低电平,LED点亮P3_3=0; //将P3.0引脚置低电平,LED点亮P3_4=1; //将P3.4引脚置高电平,LED熄灭P3_5=1; //将P3.5引脚置高电平,LED熄灭 P3_6=1; //将P3.7引脚置高电平,LED熄灭 P3_7=1; //将P3.7引脚置高电平,LED熄灭while(1) ;*实例41:宏定义应用举例3#include<reg51.h> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/ 中断、定时器中断、定时器中断、定时器中断、定时器 /*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/函数功能:主函数/ void main(void)// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值 }}*实例43:用定时器T1查询方式控制单片机发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值 }}*实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h> // 包含51单片机寄存器定义的头文件 sbit S=P3^4; //将S位定义为P3.4引脚/ 函数功能:主函数{// EA=1; //开总中断// ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁 #include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/ 函数功能:主函数{EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例46:用定时器T0的中断实现长时间定时#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T0的中断服务程序/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}*实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚sbit D2=P2^1; //将D2位定义为P2.1引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反 Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将P2.1引脚输出电平取反 Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}*实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/ 函数功能:主函数/ void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1while(1)//无限循环等待中断;}/ 函数功能:定时器T1的中断服务程序/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 {sound=~sound;TH1=(65536-921)/256; //定时器T1的高8位重新赋初值TL1=(65536-921)%256; //定时器T1的高8位重新赋初值}*实例49:用定时器T0的中断实现"渴望"主题曲的播放#include<reg51.h> //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7unsigned int C; //储存定时器的定时常数//以下是C调低音的音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz #define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz #define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz #define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz //以下是C调中音的音频宏定义#define dao 523 //将“dao”宏定义为中音“1”的频率523Hz#define re 587 //将“re”宏定义为中音“2”的频率587Hz#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz。
单片机C语言代码手册 含100多个经典C程序
单片机C语言代码手册1.LED灯点亮一个LED#include<reg51.h>void main(){while(1){P0=0x01;P2=0x7d;}}流水灯闪烁#include<reg52.h>sbit LED=P0^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){LED=0;delay(60);LED=1;delay(10);}流水灯_左移#include<reg52.h>#include<intrins.h>unsigned char aa;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){aa=0xfe;while(1){P0=aa;delay(1000);aa=_crol_(aa,1);}}跑马灯#include<reg51.h>#include <intrins.h>void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}void main(){unsigned char LED;LED = 0xfe; //11111110P2 = LED;while(1){delayms(250);LED = _crol_(LED,1); //循环右移1位,点亮下一个LED P2 = LED;}}用循环移位指令实现LED流水灯效果#include <reg51.h>#include <intrins.h>void delayms(unsigned char i) //延时子程序{unsigned char j;while(i--){for(j=0;j<120;j++);}}void main(){unsigned char LED;LED = 0xfe; //0xfe = 1111 1110while(1){P2 = LED;delayms(250);LED = LED << 1; / /循环右移1位,点亮下一个LED "<<"为左移位if(LED == 0x00 ){LED = 0xfe; // 0xfe = 1111 1110}}}左右跑马灯#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}char LED;void main(){unsigned char i;while (1){LED = 0xfe;for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED << 1; //左移LED = LED | 0x01; //移位后,后面的位为高电平if(LED == 0x7f)break; //提前退出FOR 循环}for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED >> 1; // 右移LED = LED | 0x80; // 移位后,后面的位为高电平}}}LED作二进制加法#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}void main(){unsigned char Num = 0xff;while (1){P2 = Num;delay(1000);Num--;}}LED闪烁-定时器#include<reg52.h>#include<intrins.h>unsigned char num,aa=0xfe;void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1){if(num==1){num=0;P2=aa;aa=_crol_(aa,1);}}}void T0_time()interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}2.数码管0-9显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){int cnt=0;while(1){P0=0x02;P2=num[cnt];if(++cnt>9)cnt=0;delay2ms(2500);}}95显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char s[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};main(){unsigned char num=95;unsigned char cnt=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay2ms(1);}}138片选实现动态显示#include <reg51.h>#include <intrins.h>sbit LS138A = P2^2; //定义LS138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义LS138译码器的输入B脚由P2.3控制sbit LS138C = P2^4; //定义LS138译码器的输入C脚由P2.4控制void delay(unsigned int i); //函数声名char cnt;unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void main(){unsigned int i,j=1 ;unsigned int led[10];cnt=0;while(1) //进入循环状态{if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=Disp_Tab[j%10000/1000]|0x80;led[1]=Disp_Tab[j%1000/100]|0x80;led[2]=Disp_Tab[j%100/10]|0x80;led[3]=Disp_Tab[j%10]|0x80;led[4]=Disp_Tab[j%10000/1000]; //千位led[5]=Disp_Tab[j%1000/100]; //百位带小数点led[6]=Disp_Tab[j%100/10]; //十位led[7]=Disp_Tab[j%10]; //个位for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = led[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}单片机直接片选实现动态显示#include <reg51.h>#include <intrins.h>void delay(unsigned int i); //函数声名char DelayCNT; //定义变量unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//段码控制unsigned char code dispbit[8]= //共阴数码管1-8个{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表法void main(){unsigned int i,LedNumV al=1 ; //变量定义unsigned int LedOut[10]; //变量定义DelayCNT=0;while(1){if(++DelayCNT>=20) //控制数字变化速度{DelayCNT=0; //20个扫描周期清零一次++LedNumV al; //每隔20个扫描周期加一次}LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]|0x80;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];LedOut[4]=Disp_Tab[LedNumV al%10000/1000]; //千位LedOut[5]=Disp_Tab[LedNumV al%1000/100]|0x80; //百位小数LedOut[6]=Disp_Tab[LedNumV al%100/10]; //十位LedOut[7]=Disp_Tab[LedNumV al%10]; //个位for( i=0; i<9; i++){P0 = LedOut[i];P1 = dispbit[i]; //使用查表法进行位选switch(i) //使用switch 语句控制位选{case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;}delay(150); //扫描间隔时太长会数码管会有闪烁感}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}动态-静态LED#include <reg51.h>#include <intrins.h>sbit LED8_1=P1^1; //J14接在P1.1上void delay(unsigned int i); //函数声名char DelayCNT;char LED;void main(){LED = 0x01;DelayCNT=0;while(1){if(++DelayCNT>=10) //点亮动静LED灯速度控制{DelayCNT=0;LED = LED << 1; //左移if(LED==0) LED = 1; //移位后,后面的位为高电平}P0 =LED;LED8_1=0;delay(1000); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}数码管_138动态显示#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;uchar code led[8];void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}uchar code table[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){while(1) //进入循环状态{uint cnt,j;LS138A=1;LS138B=1;LS138C=1;if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=table[j%10000/1000];led[1]=table[j%1000/100];led[2]=table[j%100/10];led[3]=table[j%10];led[4]=table[j%10000/1000]; //千位led[5]=table[j%1000/100]; //百位带小数点led[6]=table[j%100/10]; //十位led[7]=table[j%10]; //个位}}数码管_依次显示0-F#include<reg52.h>unsigned char code table[]= //共阳数码管{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char cnt;while(1)for(cnt=0;cnt<16;cnt++){P0= table[cnt];delay(100);}}数码管_直选动态显示#include<reg52.h>unsigned char code dispiaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code table[]={0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char m;while(1){for(m=0;m<8;m++){P0=table[m];P1=dispiaybit[m];delay(1);}}}数码管秒表#include<reg52.h>void delay(int xms){unsigned int cnt;for(cnt=0;cnt<xms*50;cnt++);}unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void main(){unsigned char num=0;unsigned char cnt=0;unsigned char hour=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay(4);if(cnt>=250){num++;cnt=0;}}}一位静态显示#include <reg51.h>#include <intrins.h>#define NOP() _nop_() //定义空指令void delay(unsigned int i); //函数声名unsigned char code LED7Code[] = //共阳极{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};void main(){unsigned int LedNumV al=1 ,C ; //定义变量while(1){if (++C>= 300){LedNumV al++ ; //每隔300个扫描周期加一次C =0; //每隔300个扫描清零} //将字模送到P0口显示P0 = LED7Code[LedNumV al%10]&0x7f;//LED7 0x7f为小数点共阴和共阳此处不一样;delay(150); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}3.蜂鸣器嘀嘀#include <reg52.h>sbit buzz = P3^4;main(){TMOD = 0x01;TH0 = -(1000/256);TL0 =- (1000%256);EA = 1;ET0 = 1;TR0 = 1;for(;;){} }void T0_irq(void) interrupt 1 using 1{TH0 = -(300/256);TL0 =- (300%256);buzz = ~buzz;}PZ_蜂鸣器#include<reg52.h>sbit beep=P1^5;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){beep=1;delay(1);beep=0;delay(1);}八月桂花本例采用89C52, 晶振为11.0592MHZ关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; #include <REG52.H>#include <INTRINS.H>sbit Beep = P1^5 ;unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] = //格式为: 频率常数, 节拍常数,频率常数, 节拍常数, {0x18, 0x30, 0x1C , 0x10,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--);各位可编译一下看看汇编结果就知道了!}void main(){ unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD|=0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1){a: p=music_tab[i];if(p==0x00){ i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab[i++], n=music_tab[i++];} //取频率常数和节拍常数TR0=1; //开定时器1while(n!=0)Beep=~Beep,delay(m); //等待节拍完成,通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1}}5.继电器按键控制继电器#include <reg51.h>sbit RELAY = P1^4; //定义继电器对应单片机管脚sbit K1 = P2^7; //定义按钮对应单片机管脚void main(){if (!K1)RELAY = 0; //按钮按下开启继电器else RELAY = 1; //按钮松开关闭继电器}4.按键模拟开关#include <reg52.H>sbit K1=P3^0;sbit L1=P2^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){while(1){if(K1==0){delay(100);if(K1==0){L1=~L1;while(!K1);}}}}按键键状态显示#include <reg51.h>#include <intrins.h>sbit BEEP = P1^5;sbit RELAY= P1^4;sbit K1 = P0^0;sbit K2 = P0^1;sbit K3 = P0^2;sbit K4 = P0^3;sbit K5 = P0^4;sbit K6 = P0^5;void beep();main(){while(1){P2 = 0xff;if(K1==0)P2 = 0xfe;if(K2 == 0)P2 = 0xfd;if(!K3)P2 = 0xfb;if(!K4)P2 = 0xf7;if(!K5 )beep(); //喇叭发声RELAY = 1;if (!K6 )RELAY = 0; //通过了反相器}}void beep(){unsigned char i , j;for (i=0;i<100;i++){BEEP=!BEEP; //BEEP取反for (j = 0 ; j<250 ; j++) //需要产生方波_nop_();}BEEP=1; //关闭蜂鸣器}按键移位#include <reg51.h>#include <intrins.h>void delayms(unsigned char ms);void proc_key(unsigned char key_v);void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}sbit K1 = P0^0; //对应按钮K1sbit K2 = P0^1; //对应按钮K2void main(){unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1){key_s = scan_key();if(key_s != key_v){delayms(10);key_s = scan_key();if(key_s != key_v){key_v = key_s;proc_key(key_v);}}}}unsigned char scan_key(){unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;}void proc_key(unsigned char key_v){if((key_v & 0x01) == 0){P2 = _cror_(P2,1);}else if((key_v & 0x02) == 0){P2 = _crol_(P2, 1);}}6.定时器/中断蜂铃器_timer1#include < reg51.h >#include <intrins.h>sbit Beep = P1^5;unsigned int USE_C ;void main(){TMOD=0x10; //定时/计数器1工作于方式1TH0=0x4C;TL0=0x00; //50ms定时常数EA=1; //开总中断ET1=1; //允许定时/计数器1 中断TR1=1; //启动定时/计数器1 中断while(1);}void Time1(void) interrupt 3{TH1=0x4c; //50ms定时TL1=0x00;if (++USE_C == 20) //每隔1秒发声{ Beep = ~Beep;USE_C = 0;}}中断0计数_1位数码管显示#include < reg51.h >#include <intrins.h>unsigned int LedNumV al;// 此表为LED 的字模/ 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };void main(void){// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){P0=Disp_Tab[LedNumV al%10];}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}中断0计数_4位数码管显示试验4位数码管上显示外部中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al = 0 ,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}display(){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}void main(void){P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){display();}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}INT0+INT1#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al_1,LedNumV al_2,LedOut[8]; unsigned char code Disp_Tab[] =/ /共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(void){ unsigned char i;P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EX0=1;// IT1=0; //低电平触发IT1=1; //下降沿触发EX1=1;EA=1;while(1){LedOut[0]=Disp_Tab[LedNumV al_1%10000/1000];LedOut[1]=Disp_Tab[LedNumV al_1%1000/100]|0x80;//0x7f小数点LedOut[2]=Disp_Tab[LedNumV al_1%100/10];LedOut[3]=Disp_Tab[LedNumV al_1%10];LedOut[4]=Disp_Tab[LedNumV al_2%10000/1000];LedOut[5]=Disp_Tab[LedNumV al_2%1000/100];LedOut[6]=Disp_Tab[LedNumV al_2%100/10];LedOut[7]=Disp_Tab[LedNumV al_2%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}INT0中断函数void counter0(void) interrupt 0{EX0=0;delay(100);LedNumV al_1++;EX0=1;}INT1中断函数void counter1(void) interrupt 2{EX1=0;delay(100);LedNumV al_2++;EX1=1;}T0_数码管#include<reg51.h>char num;unsigned char Led [10] ={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-45872)/256;TL0=(65536-45872)%256;while(1);}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==200){num=0;P0 = 0x1e;P2 = Led[1];}}TIMEER0试验数码管上显示定时器中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2; //定义138管脚sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };系统初始化void system_Ini(){TMOD|= 0x11;TH1=0x1C; //12.000MTL1=0x18;IE = 0x8A;TR1 = 1;}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(){system_Ini() ;while(1){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}[ t1 (1ms)中断] 中断void T1zd(void) interrupt 3 //3定时器1的中断号{TH1 = 0x1c; //12.000TL1 = 0x18;LedNumV al++;}定时器#include"reg51.h"bit SecFlag = 0;code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0= 0xf8; //中断返回TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //中断定时初始化{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0//中断允许控制E:enable// 1 00 0 0 0 1 0}void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) //计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}}}定时器_按键#include"reg51.h"bit SecFlag = 0;sbit TIMESTOP_K = P1^0;void Delay2ms(unsigned int DelayTime) //软件延时{unsigned int Count;for(Count = 0;Count < DelayTime*50;Count++);}code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0 = 0xf8;TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //硬件延时{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0E:enable //中断允许控制// 1 00 0 0 0 1 0 }void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) // 计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}//按键工作,让走时停止,StopFlag = 1if(TIMESTOP_K == 0){Delay2ms(5);while(TIMESTOP_K == 0);StopFlag = ~ StopFlag;}}}7.LED点阵显示数字LED点阵实验(流动显示1 2 3 4 5 6 7 8 9)#include<reg51.h>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code digittab[18][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中};unsigned int timecount;unsigned char cnta;unsigned char cntb;void main(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1; //开启定时0ET0=1;EA=1; //开启中断cntb=0;while(1){ ;}}void t0(void) interrupt 1 using 0{TH0=(65536-3000)/256; //定时器高位装载数据TL0=(65536-3000)%256; //定时器低位装载数据if(cntb<18) //红色{P1=0xFF;P2=tab[cnta];P0=digittab[cntb][cnta];}else //绿色{P2=0xFF;P1=tab[cnta];P0=digittab[cntb-18][cnta];}if(++cnta>=8) cnta=0;if(++timecount>=333){timecount=0;if(++cntb>=36)cntb=0;}}滚动LED点阵实验(左右上下流动显示)#include <REG51.H>unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay1(void){unsigned char i,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){unsigned char i,j;while(1){for(j=0;j<3;j++) //from left to right 3 time{for(i=0;i<8;i++){P2=taba[i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from right to left 3 time{for(i=0;i<8;i++){P2=taba[7-i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from top to bottom 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[7-i];delay1();}}for(j=0;j<3;j++) //from bottom to top 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[i];delay1();}}}}8.1602液晶静态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN1988"; //12 uchar code table2[]="TEL 134********"; //15 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void main(){R=0;init();for(num=0;num<12;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table2[num]);delay(20);}while(1);}动态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN"; //8 uchar code table2[]="134********"; //11 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80+0x10);}void main(){R=0;init();for(num=0;num<8;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x53);for(num=0;num<11;num++){write_data(table2[num]);delay(20);}for(num=0;num<16;num++){write_com(0x18);delay(20);}while(1);}滚动显示1、从左到右逐字显示,闪动二次,清屏。
经典单片机编程100例
目录目录 (1)函数的使用和熟悉 (6)实例3:用单片机控制第一个灯亮 (6)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (8)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例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流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (37)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (40)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (44)实例34:用指针数组作为函数的参数显示多个字符串 (46)实例35:字符函数ctype.h应用举例 (49)实例36:内部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)中断、定时器 (56)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (66)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (67)实例50-1:输出50个矩形脉冲 (73)实例50-2:计数器T0统计外部脉冲数 (74)实例51-2:定时器T0的模式2测量正脉冲宽度 (75)实例52:用定时器T0控制输出高低宽度不同的矩形波 (77)实例53:用外中断0的中断方式进行数据采集 (79)实例54-1:输出负脉宽为200微秒的方波 (80)实例54-2:测量负脉冲宽度 (81)实例55:方式0控制流水灯循环点亮 (83)实例56-1:数据发送程序 (85)实例56-2:数据接收程序 (87)实例57-1:数据发送程序 (89)实例57-2:数据接收程序 (91)实例58:单片机向PC发送数据 (93)实例59:单片机接收PC发出的数据 (95)数码管显示 (97)实例60:用LED数码显示数字5 (97)实例61:用LED数码显示器循环显示数字0~9 (97)实例62:用数码管慢速动态扫描显示数字"1234" (99)实例63:用LED数码显示器伪静态显示数字1234 (101)实例64:用数码管显示动态检测结果 (102)实例65:数码秒表设计 (106)实例66:数码时钟设计 (109)实例67:用LED数码管显示计数器T0的计数值 (117)实例68:静态显示数字“59” (119)键盘控制 (120)实例69:无软件消抖的独立式键盘输入实验 (120)实例70:软件消抖的独立式键盘输入实验 (121)实例71:CPU控制的独立式键盘扫描实验 (122)实例72:定时器中断控制的独立式键盘扫描实验 (128)实例73:独立式键盘控制的4级变速流水灯 (135)实例74:独立式键盘的按键功能扩展:"以一当四" (140)实例75:独立式键盘调时的数码时钟实验 (143)实例76:独立式键盘控制步进电机实验 (152)实例77:矩阵式键盘按键值的数码管显示实验 (157)实例78:矩阵式键盘按键音 (164)实例79:简易电子琴 (167)实例80:矩阵式键盘实现的电子密码锁 (181)液晶显示LCD (189)实例81:用LCD显示字符'A' (189)实例82:用LCD循环右移显示"Welcome to China" (196)实例83:用LCD显示适时检测结果 (203)实例84:液晶时钟设计 (212)一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控225实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (225)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 . 234 实例87:对I2C总线上挂接多个AT24C02的读写操作 (250)实例88:基于AT24C02的多机通信读取程序 (261)实例88:基于AT24C02的多机通信写入程序 (269)实例90:DS18B20温度检测及其液晶显示 (293)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (313)实例92:将流水灯控制码写入X5045并读出送P1口显示 (320)实例93:对SPI总线上挂接多个X5045的读写操作 (328)实例94:基于ADC0832的数字电压表 (337)实例95:用DAC0832产生锯齿波电压 (350)实例96:用P1口显示红外遥控器的按键值 (351)实例97:用红外遥控器控制继电器 (356)实例98:基于DS1302的日历时钟 (362)实例99:单片机数据发送程序 (382)实例100:电机转速表设计 (384)//模拟霍尔脉冲 (395)函数的使用和熟悉实例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; //定义无符号整数,最大取值范围65535 for(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~65535for(m=0;m<36000;m++); //空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/ void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255for(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;m=64;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,重新将其置为1 i=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 codeTab[ ]={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 codeTab[]={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=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 i;unsigned charTab[ ]={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 codeTab[]={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 byDS18B20";//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++);}/*************************************************函数功能:主函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 微秒。
这样,定时值应设为65535-2500=63035,将它转换为十六进制则为:F63B。
具体程序请看f200.asm频率递增:200HZ:63035:F63B250HZ:63535:F82F300HZ:63868:F97C5.3 200HZ频率输出程序介绍:利用定时器定时,在P1.0 口产生200HZ 的频率输出。
实际应用例如:传感器前级推动。
程序实例(F200.ASM):ORG 0000HAJMP MAINORG 001BHAJMP DIN0MAIN:CLR P1.0 ;产生一个低电平,实际上是从p1.0口产生频率MOV TMOD,#00010000B ;定时器1工作于方式0MOV TH1,#0F6HMOV TL1,#3BH ;频率产生的时间,详细请见频率公式SETB EA ;开总中断13SETB TR1 ;开定时器1运行SETB ET1 ;开定时器1允许LOOP: AJMP LOOP ;无限循环DIN0: CPL P1.0 ;产生一个高电平,下次来就是低电平(因为取反),一个高电平和一个低电平形成一个周期MOV TH1,#0F6HMOV TL1,#3BH ;重置频率产生时间RETI ;返回END5.4 200——250HZ变化频率输出程序介绍:利用定时器定时时间的变化,由P1.0 口产生200——250HZ变化的频率。
实际应用例如:传感器前级推动、频率发生器。
程序实例(F250.ASM):ORG 0000HAJMP MAINORG 001BHAJMP DIN1MAIN:;定义频率200和300////////////////////////////////// F2H EQU 30HF2L EQU 31HF3H EQU 32HF3L EQU 33H14;////////////////////////////////////////////////// ;定义频率保持初值////////////////////////////////// MOV R1,#50MOV R2,#02H;////////////////////////////////////////////////// ;频率赋初值//////////////////////////////////////// MOV F2H,#0F6HMOV F2L,#3BHMOV F3H,#0F8HMOV F3L,#2FH;////////////////////////////////////////////////// CLR P1.0 ;在P1.0口产生一个低电平,一个脉冲是由一个高电平和一个低电平组成的MOV TMOD,#00010000B ;定时器工作于方式1MOV TH1,F2HMOV TL1,F2L ;200HZ输出SETB EA ;开总中断SETB TR1 ;开定时器1运行SETB ET1 ;开定时器1允许LOOP: AJMP LOOPDIN1:CPL P1.0 ;取反P1.0口,实际是为了不断的将p1.0的电平关系转换,即产生了频率;频率保持时间////////////////////////////////////// DJNZ R1,REMOV R1,#50DJNZ R2,REMOV R2,#02H15;////////////////////////////////////////////////// MOV A,F2HCJNE A,F3H,XIA ;频率高位到300HZ的高位了吗?AJMP JIA ;频率高位没到300HZ的高位值,直接将低位值加1XIA: INC F2LMOV A,F2LCJNE A,#00H,REINC F2HMOV A,F2HCJNE A,F3H,RE;/////////////////////////////////////////////;频率高位加到300HZ的高位值了,低位加一,到300HZ的低位值了吗,没到出去,到了关定时器JIA:INC F2L ;到了将200HZ频率的低位加1MOV A,F2LCJNE A,#F3L,RECLR TR1;/////////////////////////////////////////////RE:MOV TH1,F2HMOV TL1,F2LRETIEND16六、数显0——9999显示程序介绍:利用S51的串行口功能,实现数码管0——9999 的循环显示。
实际应用例如:电子计分牌。
程序实例(9999.ASM):ORG 0000HMAIN:GEE EQU 30HSHI EQU 31HBEI EQU 32HQIAN EQU 33H ;定义个十百千MOV GEE,#00HMOV SHI,#00HMOV BEI,#00HMOV QIAN,#00H ;赋初值MOV SCON,#00H ;串行口工作于方式0.同步移位;显示个,十,百,千////////////////////////////////// DISPLAY:ACALL DELAY ;延时MOV DPTR,#SETTABMOV A,GEEMOVC A,A+DPTR MOV SBUF,AD1: JNB TI,D117CLR TIMOV DPTR,#SETTAB MOV A,SHIMOVC A,A+DPTR MOV SBUF,AD2: JNB TI,D2 CLR TIMOV DPTR,#SETTAB MOV A,BEIMOVC A,A+DPTR MOV SBUF,AD3: JNB TI,D3 CLR TIMOV DPTR,#SETTAB MOV A,QIAN MOVC A,A+DPTR MOV SBUF,AD4: JNB TI,D4CLR TI;/////////////////////////////////////////////;个,十,百,千的依次加一/////////////////////INC GEEMOV A,GEECJNE A,#0AH,DISPLAYMOV GEE,#00HINC SHIMOV A,SHICJNE A,#0AH,DISPLAY18MOV SHI,#00HINC BEIMOV A,BEICJNE A,#0AH,DISPLAYMOV BEI,#00HINC QIANMOV A,QIANCJNE A,#0AH,DISPLAYMOV QIAN,#00HAJMP DISPLAY;//////////////////////////////////////////////////;延时////////////////////////////////////////////// DELAY: MOV R1,#0FFHE1: MOV R2,#0FFHDJNZ R2,$DJNZ R1,E1RET;///////////////////////////////////////////// SETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码END七、AD 转换7.1 AD转换(数码显示)程序介绍:利用ADC0809模拟通道3输入电压,经单片机19处理后在数码管上用相对应的16进制数显示出来,0—5V对应为0--0FFH,实际应用例如:数据采集。
程序操作:程序写完上电运行后,用本机配带的专用起微调图15所示电位器,会在数码管上看到随不同电压而变化的对应16进制值。
也可以用万用表实ADC0809IN3脚电压,来检验所对应显示的16进制数。
图15程序实例(ad.asm):ORG 0000HMAIN1:ACALL DELAY ;延时ACALL AD ;呼叫AD子程序;将转换的数字量屏蔽高位低位送显//////////////////// MOV 31H,30HMOV A,30HANL A,#0FHMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD1: JNB TI,D1CLR TI;////////////////////////////////////////////////// ;将转换的数字量屏蔽低位高位送显//////////////////// MOV A,30H20ANL A,#0F0HSWAP AMOV DPTR,#SETTABMOVC A,A+DPTRMOV SBUF,AD2: JNB TI,D2CLR TI;////////////////////////////////////////////////// AJMP MAIN1 ;返回主程序AD: MOV DPTR,#7F00H ;指向转换地址MOV A,#03H ;指向转换口MOVX DPTR,A ;转换MOV R1,#64HD3: DJNZ R1,D3 ;等100微秒转换完MOVX A,DPTR ;转换后的值给AMOV 30H,A ;转换的值给30HRETDELAY: ;延时MOV R2,#0FFHD14: MOV R3,#0FFHD12: DJNZ R3,D12DJNZ R2,D14RETSETTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6HDB 0EEH,3EH,9CH,7AH,9EH,8EH217.2 十六进制两位数加法器(数码显示)程序介绍:将ADC0809输入的两个不同电压(相同电压也可相加,只是为举例说明,所以取不同电压)所对应的16进制数相加显示出来。