单片机C语言和汇编应用实例1-12新手专用[1]
- 格式:doc
- 大小:635.50 KB
- 文档页数:50
范文范例学习指导目录实例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。
51单片机汇编语言及C语言经典实例实验及课程设计一、闪烁灯如图1 所示为一简单单片机系统原理图:在P1.0 端口上接一个发光二极管L1,使L1 在不停地一亮一灭,一亮一灭的时间间隔为0.2 秒。
延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1 所示的石英晶体为12MHz,因此,1 个机器周期为 1 微秒,机器周期微秒如图 1 所示,当P1.0 端口输出高电平,即P1.0=1 时,根据发光二极管的单向导电性可知,这时发光二极管L1 熄灭;当P1.0 端口输出低电平,即P1.0=0 时,发光二极管L1 亮;我们可以使用SETB P1.0 指令使P1.0端口输出高电平,使用CLR P1.0 指令使P1.0 端口输出低电平。
C 语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2 秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP START DELAY: MOV R5,#20 ;延时子程序,延时0.2 秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND图2 程序设计流程图图1 单片机原理图二、多路开关状态指示如图 3 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4,P1.4-P1.7 接了四个开关 K1-K4,编程将开关的状态反映到发光二极管上。
单片机汇编语言经典一百例汇编语言是一种底层的程序设计语言,是一种将汇编指令直接翻译成机器指令的语言。
在单片机编程中,掌握汇编语言是非常重要的,因为它可以充分发挥单片机的性能,并且提高程序的运行效率。
本文将介绍一百个经典的单片机汇编语言例子,帮助读者更好地理解汇编语言的使用。
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 ; 程序结束```...通过以上例子,我们可以看到单片机汇编语言的应用非常广泛,可以实现各种各样的功能。
51单片机C语言编程100例-单片机c语言编程51单片机C语言编程100例在嵌入式系统领域,单片机是常用的硬件平台之一。
而C语言作为一种高级编程语言,能够为单片机编程提供更高的效率和便利性。
本文将介绍51单片机C语言编程的100个实例,帮助读者了解并掌握单片机的基本编程技巧和应用方法。
一、LED灯控制1. 实例介绍:通过控制51单片机的IO口输出,实现对LED灯的亮灭控制。
2. 实例代码:```#include <reg51.h>sbit LED = P1^0; // 定义P1口的第0位为LEDvoid main(){while(1){LED = 0; // LED灯亮delay(1000); //延时1秒LED = 1; // LED灯灭delay(1000); //延时1秒}}```二、数码管显示1. 实例介绍:使用数码管显示数字0-9,并实现数码管的动态显示效果。
2. 实例代码:```#include <reg51.h>unsigned char code DispTab[] ={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82};sbit WeiDu = P1^2;sbit DUAN = P1^0;void delay(unsigned int t){unsigned int i;while(t--)for(i=0;i<125;i++);}void main(){unsigned int i;while(1){P0 = DispTab[i]; // 显示数字iDUAN = 1; //点亮段码DUAN = 0; //关闭段码P0 = ~(0x01 << i); // 选择数码管的位 WeiDu = 0; // 打开选通位WeiDu = 1; // 关闭选通位delay(100); // 延时100msi++;if(i > 9) i = 0;}}```三、外部中断1. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
一、用单片机控制发光二极管图1为单片机控制发光二极管的实验电路图。
图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED。
实例1:用单片机控制LED闪烁发光源程序如下:MAIN:SETB P1.0LCALL DELAYCLR P1.0LCALL DELAYLJMP MAINDELAY:MOV R7,#250D1:MOV R6,#250D2:DJNZ R6,D2DJNZ R7,D1RETEND程序说明:1、SETB P1.0:将P1.0口置“1”,既让P1.0输出高电平,让LED 熄灭。
2、LCALL DELAY:LCALL称为子程序调用指令,指令后面的参数DELAY是一个标号,用于标识第6行程序,执行LCALL指令时,程序转到LCALL后面的标号所指示的程序行处执行,如果执行指令过程中遇到RET指令,则程序就返回到LCALL指令下面的一条指令继续执行。
3、CLR P1.0:将P1.0口置“0”,既让P1.0输出低电平,让LED 亮。
4、LCALL DELAY:调用延时子程序DELAY。
5、LJMP MAIN:跳转到第1条指令处执行第1条指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:不是S51单片机的指令,不会产生单片机可执行的代码,而是用于告诉汇编软件“程序到此结束”,这类用于汇编软件控制的指令称为“伪指令”。
延时程序说明:1、程序中的R6、R7代表工作寄存器的单元,用来暂时存放一些数据。
2、MOV指令的含义是传递数据。
指令“MOV R7,#250”的含义是:将数据250送到R7中。
250前面的“#”号表示250是一个数,而不是一个地址,“#”号后面的数称为立即数。
3、DJNZ指令后面有两个符号,一个是R6,一个是D2。
R6是寄存器,D2是标号。
DJNZ指令的执行过程是:将其后面第一个参数中的值减1,然后看这个值是否等于0,如果等于0,往下执行,如果不等于0,则转移到第二个参数所指定的位置去执行,这里是转移到由D2所标识的这条语句去执行。
目录目录 (1)函数的使用和熟悉 (4)实例3:用单片机控制第一个灯亮 (4)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (4)实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (4)实例6:使用P3口流水点亮8位LED (5)实例7:通过对P3口地址的操作流水点亮8位LED (6)实例8:用不同数据类型控制灯闪烁时间 (7)实例9:用P0口、P1 口分别显示加法和减法运算结果 (8)实例10:用P0、P1口显示乘法运算结果 (8)实例11:用P1、P0口显示除法运算结果 (8)实例12:用自增运算控制P0口8位LED流水花样 (9)实例13:用P0口显示逻辑"与"运算结果 (9)实例14:用P0口显示条件运算结果 (10)实例15:用P0口显示按位"异或"运算结果 (10)实例16:用P0显示左移运算结果 (10)实例17:"万能逻辑电路"实验 (10)实例18:用右移运算流水点亮P1口8位LED (11)实例19:用if语句控制P0口8位LED的流水方向 (11)实例20:用swtich语句的控制P0口8位LED的点亮状态 (12)实例21:用for语句控制蜂鸣器鸣笛次数 (13)实例22:用while语句控制LED (14)实例23:用do-while语句控制P0口8位LED流水点亮 (15)实例24:用字符型数组控制P0口8位LED流水点亮 (16)实例25:用P0口显示字符串常量 (16)实例26:用P0 口显示指针运算结果 (17)实例27:用指针数组控制P0口8位LED流水点亮 (17)实例28:用数组的指针控制P0 口8 位LED流水点亮 (18)实例29:用P0 、P1口显示整型函数返回值 (19)实例30:用有参函数控制P0口8位LED流水速度 (20)实例31:用数组作函数参数控制流水花样 (20)实例32:用指针作函数参数控制P0口8位LED流水点亮 (21)实例33:用函数型指针控制P1口灯花样 (22)实例34:用指针数组作为函数的参数显示多个字符串 (23)实例35:字符函数ctype.h应用举例 (24)实例36:内部函数intrins.h应用举例 (25)实例37:标准函数stdlib.h应用举例 (25)实例38:字符串函数string.h应用举例 (26)实例39:宏定义应用举例2 (26)实例40:宏定义应用举例2 (27)实例41:宏定义应用举例3 (27)中断、定时器 (28)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (28)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (28)实例45:用定时器T0的中断控制1位LED闪烁 (30)实例46:用定时器T0的中断实现长时间定时 (30)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (31)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (32)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (33)实例50-1:输出50个矩形脉冲 (35)实例50-2:计数器T0统计外部脉冲数 (36)实例51-2:定时器T0的模式2测量正脉冲宽度 (36)实例52:用定时器T0控制输出高低宽度不同的矩形波 (37)实例53:用外中断0的中断方式进行数据采集 (38)实例54-1:输出负脉宽为200微秒的方波 (38)实例54-2:测量负脉冲宽度 (39)实例55:方式0控制流水灯循环点亮 (40)实例56-1:数据发送程序 (41)实例56-2:数据接收程序 (42)实例57-1:数据发送程序 (43)实例57-2:数据接收程序 (44)实例58:单片机向PC发送数据 (45)实例59:单片机接收PC发出的数据 (46)数码管显示 (46)实例60:用LED数码显示数字5 (46)实例61:用LED数码显示器循环显示数字0~9 (47)实例62:用数码管慢速动态扫描显示数字"1234" (47)实例63:用LED数码显示器伪静态显示数字1234 (48)实例64:用数码管显示动态检测结果 (49)实例65:数码秒表设计 (50)实例66:数码时钟设计 (52)实例67:用LED数码管显示计数器T0的计数值 (55)实例68:静态显示数字“59” (56)键盘控制 (57)实例69:无软件消抖的独立式键盘输入实验 (57)实例70:软件消抖的独立式键盘输入实验 (57)实例71:CPU控制的独立式键盘扫描实验 (58)实例72:定时器中断控制的独立式键盘扫描实验 (61)实例73:独立式键盘控制的4级变速流水灯 (64)实例74:独立式键盘的按键功能扩展:"以一当四" (66)实例75:独立式键盘调时的数码时钟实验 (67)实例76:独立式键盘控制步进电机实验 (71)实例77:矩阵式键盘按键值的数码管显示实验 (73)实例78:矩阵式键盘按键音 (76)实例79:简易电子琴 (77)实例80:矩阵式键盘实现的电子密码锁 (82)液晶显示LCD (85)实例81:用LCD显示字符'A' (85)实例82:用LCD循环右移显示"Welcome to China" (87)实例83:用LCD显示适时检测结果 (91)实例84:液晶时钟设计 (94)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (99)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (103)实例87:对I2C总线上挂接多个AT24C02的读写操作 (109)实例88:基于AT24C02的多机通信读取程序 (114)实例88:基于AT24C02的多机通信写入程序 (117)实例90:DS18B20温度检测及其液晶显示 (127)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (134)实例92:将流水灯控制码写入X5045并读出送P1口显示 (137)实例93:对SPI总线上挂接多个X5045的读写操作 (141)实例94:基于ADC0832的数字电压表 (145)实例95:用DAC0832产生锯齿波电压 (150)实例96:用P1口显示红外遥控器的按键值 (150)实例97:用红外遥控器控制继电器 (153)实例98:基于DS1302的日历时钟 (155)实例99:单片机数据发送程序 (162)实例100:电机转速表设计 (164)模拟霍尔脉冲.............................................................................. 错误!未定义书签。
51单片机C语言编程基础及实例C语言是一门通用计算机编程语言,应用广泛。
下面是小编整理的51单片机C语言编程基础及实例,希望对大家有帮助!单片机的外部结构:DIP40双列直*;P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)电源VCC(PIN40)和地线GND(PIN20);高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)四个8位通用I/O端口,对应引脚P0、P1、P2和P3;两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 一个串行通信接口;(SCON,SBUF)一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
C语言编程基础:十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
++var表示对变量var先增一;var—表示对变量后减一。
x|=0x0f;表示为x=x|0x0f;TMOD=(TMOD&0xf0)|0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
While(1);表示无限执行该语句,即死循环。
语句后的分号表示空循环体,也就是{;}在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)代码#include//该头文档中有单片机内部资源的符号化定义,其中包含P1.3voidmain(void)//void表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P1_3=1;//给P1_3赋值1,引脚P1.3就能输出高电平VCCWhile(1);//死循环,相当LOOP:gotoLOOP;}注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。
51单片机汇编语言及C语言经典实例汇编语言是一种用来编写计算机指令的低级语言,它与机器语言十分接近,可以直接控制计算机硬件。
而C语言是一种高级程序设计语言,它具有结构化编程和模块化设计的特点。
本文将介绍51单片机汇编语言和C语言的经典实例,并进行详细解析。
一、LED指示灯的闪烁我们首先来看一个经典的51单片机汇编语言的实例——LED指示灯的闪烁。
我们可以通过控制单片机的IO口来实现LED的闪烁效果。
以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV P1, #0; 将 P1 置为0,熄灭LEDLJMP $ ; 无限循环```以上代码使用了51单片机的MOV指令和LJMP指令。
MOV指令用来将一个立即数(这里是0)存储到寄存器P1中,控制对应的I/O口输出低电平,从而熄灭LED。
而LJMP指令则是无条件跳转指令,将程序跳转到当前地址处,实现了无限循环的效果。
对应的C语言代码如下:```c#include <reg51.h>void main() {P1 = 0; // 将 P1 置为0,熄灭LEDwhile(1); // 无限循环}```以上代码使用了reg51.h头文件,该头文件提供了对51单片机内部寄存器和外设的访问。
通过将P1赋值为0,控制IO口输出低电平,实现了熄灭LED的效果。
while(1)是一个无限循环,使得程序一直停留在这个循环中。
二、数码管的动态显示接下来我们介绍51单片机汇编语言和C语言实现数码管动态显示的经典实例。
数码管动态显示是通过控制多个IO口的高低电平来控制数码管显示不同的数字。
以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV A, #0FH ; 设置数码管全亮,A存储数码管控制位MOV P2, A ; 将 A 的值存储到 P2,控制数码管的数码控制位DELAY: ; 延时循环MOV R7, #0FFH ; 设置延时计数值LOOP1: ; 内层循环MOV R6, #0FFH ; 设置延时计数值LOOP2: ; 内部延时循环DJNZ R6, LOOP2 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ R7, LOOP1 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ A, DELAY ; A减1并判断是否为0,不为0则继续循环JMP DELAY ; 无限循环,实现动态显示```以上代码中,我们通过MOV指令来将一个立即数(0x0F)存储到寄存器A中,控制数码管显示0-9的数字。
1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#20 2个 2D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;delay02s();}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
2.电路原理图图4.2.13.系统板上硬件连线(1).把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;(2).把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;4.程序设计内容(1).开关状态的检测过程单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。
单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。
(2).输出控制如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图图4.2.26.汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND7. C语言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //灯亮}else{L1=1; //灯灭}}}3.多路开关状态指示1.实验任务如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。
(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2.电路原理图图4.3.13.系统板上硬件连线(1.把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;(2.把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;4.程序设计内容(1.开关状态检测对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
(2.输出控制根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5.程序框图中读P1口数据到ACC内容右移4次ACC内容与F0H相或ACC内容送入P1口ACC<![endif]-->图4.3.26.方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AXOR A,#0F0HMOV P1,ASJMP STARTEND7.方法一(C语言源程序)#include <AT89X51.H> unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8.方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1 CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9.方法二(C语言源程序)#include <AT89X51.H>void main(void) {while(1){if(P1_4==0) {P1_0=0;}else{P1_0=1;}if(P1_5==0) {P1_1=0;}else{P1_1=1;}if(P1_6==0) {P1_2=0;}else{P1_2=1;}if(P1_7==0) {P1_3=0;}else{P1_3=1;}}}4.广告灯的左移右移1.实验任务做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。
2.电路原理图图4.4.13.系统板上硬件连线把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。
4.程序设计内容我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。
每次送出的数据是不同,具体的数据如下表1所示表15.程序框图图4.4.26.汇编源程序ORG 0START: MOV R2,#8MOV A,#0FEHSETB CLOOP: MOV P1,ALCALL DELAYRLC ADJNZ R2,LOOPMOV R2,#8LOOP1: MOV P1,A LCALL DELAYRRC ADJNZ R2,LOOP1LJMP STARTDELAY: MOV R5,#20 ; D1: MOV R6,#20D2: MOV R7,#248 DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H> unsigned char i; unsigned char temp; unsigned char a,b;void delay(void) {unsigned char m,n,s; for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--); }void main(void){while(1){temp=0xfe;P1=temp;delay();for(i=1;i<8;i++) {a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++) {a=temp>>i;b=temp<<(8-i); P1=a|b;delay();}}}5.广告灯(利用取表方式)1.实验任务利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。
2.电路原理图图4.5.13.系统板上硬件连线把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。
4.程序设计内容在用表格进行程序设计的时候,要用以下的指令来完成(1).利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。