个单片机C语言实例()
- 格式:docx
- 大小:35.56 KB
- 文档页数:30
C51单片机C语言程序100例.Word文档目录目录(1)函数的使用和熟悉********************************/ (4)实例3:用单片机控制第一个灯亮(4)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率(4)实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能(5)实例6:使用P3口流水点亮8位LED (5)实例7:通过对P3口地址的操作流水点亮8位LED (6)实例8:用不同数据类型控制灯闪烁时间(7)实例9:用P0口、P1口分别显示加法和减法运算结果(8) 实例10:用P0、P1口显示乘法运算结果(9)实例11:用P1、P0口显示除法运算结果(9)实例12:用自增运算控制P0口8位LED流水花样(10)实例13:用P0口显示逻辑“与"运算结果(10)实例14:用P0口显示条件运算结果(11)实例15:用P0口显示按位"异或"运算结果(11)实例16:用P0显示左移运算结果(11)实例17:"万能逻辑电路"实验(11)实例18:用右移运算流水点亮P1口8位LED (12)实例19:用if语句控制P0口8位LED的流水方向(13)实例20:用swtich语句的控制P0口8位LED的点亮状态(13)实例21:用for语句控制蜂鸣器鸣笛次数(14)实例22:用while语句控制LED (16)实例23:用do-while语句控制P0口8位LED流水点亮(16) 实例24:用字符型数组控制P0口8位LED流水点亮(17) 实例25:用P0口显示字符串常量(18)实例26:用P0口显示指针运算结果(19)实例27:用指针数组控制P0口8位LED流水点亮(19)实例28:用数组的指针控制P0口8位LED流水点亮(20) 实例29:用P0、P1口显示整型函数返回值(21)实例30:用有参函数控制P0口8位LED流水速度(22)实例31:用数组作函数参数控制流水花样(23)实例32:用指针作函数参数控制P0口8位LED流水点亮(23)实例33:用函数型指针控制P1口灯花样(25)实例34:用指针数组作为函数的参数显示多个字符串(26)实例35:字符函数ctype.h应用举例(27)实例36:内部函数intrins.h应用举例(27)实例37:标准函数stdlib.h应用举例(28)实例38:字符串函数string.h应用举例(29)实例39:宏定义应用举例2 (29)1/192.实例40:宏定义应用举例2 (30)实例41:宏定义应用举例3 (30)中断、定时器************************************************ (31)实例42:用定时器T0查询方式P2口8位控制LED闪烁(31)实例43:用定时器T1查询方式控制单片机发出1KHz音频(31)实例44:将计数器T0计数的结果送P1口8位LED显示(32)实例45:用定时器T0的中断控制1位LED闪烁(33)实例46:用定时器T0的中断实现长时间定时(34)实例47:用定时器T1中断控制两个LED以不同周期闪烁(34)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频(36) 实例49:用定时器T0的中断实现"渴望"主题曲的播放(36) 实例50-1:输出50个矩形脉冲(39)实例50-2:计数器T0统计外部脉冲数(40)实例51-2:定时器T0的模式2测量正脉冲宽度(40)实例52:用定时器T0控制输出高低宽度不同的矩形波(41) 实例53:用外中断0的中断方式进行数据采集(42)实例54-1:输出负脉宽为200微秒的方波(43)实例54-2:测量负脉冲宽度(43)实例55:方式0控制流水灯循环点亮(44)实例56-1:数据发送程序(45)实例56-2:数据接收程序(47)实例57-1:数据发送程序(47)实例57-2:数据接收程序(49)实例58:单片机向PC发送数据(50)实例59:单片机接收PC发出的数据(51)*********************************数码管显示(52)实例60:用LED数码显示数字5 (52)实例61:用LED数码显示器循环显示数字0~9 (52)实例62:用数码管慢速动态扫描显示数字"1234" (53)实例63:用LED数码显示器伪静态显示数字1234 (54)实例64:用数码管显示动态检测结果(54)实例65:数码秒表设计(56)实例66:数码时钟设计(58)实例67:用LED数码管显示计数器T0的计数值(62)实例68:静态显示数字“59” (63)*****************************键盘控制2/192Word文档.Word 文档*****************************************************/ (63) 实例69:无软件消抖的独立式键盘输入实验(64)实例70:软件消抖的独立式键盘输入实验.............................................................64 实例71:CPU 控制的独立式键盘扫描实验. (65)实例72:定时器中断控制的独立式键盘扫描实验(68)实例73:独立式键盘控制的4 级变速流水灯(71)实例74:独立式键盘的按键功能扩展:"以一当四" (73)实例75:独立式键盘调时的数码时钟实验(75)实例76:独立式键盘控制步进电机实验(79)实例77:矩阵式键盘按键值的数码管显示实验(82)//实例78:矩阵式键盘按键音(85)实例79:简易电子琴(86)实例80:矩阵式键盘实现的电子密码锁 (92)******************************************************************* ***** **液晶显示LCD*********液晶显示LCD *****液晶显示LCD ************************************************************************/ (95)实例81:用LCD 显示字符'A' (96)实例82:用LCD 循环右移显示"Welcome to China"...............................................99 实例83:用LCD 显示适时检测结果...................................................................... 102 实例84:液晶时钟设计. (106)******************************************一些芯片的使用*****24c02 ........***** X5045 ***** ***** DS1302红外遥控**********************************************/ (112) 实例85:将数据"0x0f"写入***** 再读出送P1 口显示..................................112 实例86:将按键次数写入*****,再读出并用1602LCD 显示.......................117 实例87:对I2C 总线上挂接多个***** 的读写操作.......................................124 实例88:基于***** 的多机通信读取程序.. (129)实例88:基于***** 的多机通信写入程序....................................................133 实例90:***** 温度检测及其液晶显示...........................................................144 实例91:将数据"0xaa"写入X5045 再读出送P1 口显示.. (153)实例92:将流水灯控制码写入X5045 并读出送P1 口显示................................ 157 实例93:对SPI 总线上挂接多个X5045 的读写操作............................................161 实例94:基于***** 的数字电压表..................................................................165 实例95:用***** 产生锯齿波电压..................................................................171 实例96:用P1 口显示红外遥控器的按键值.........................................................171 实例97:用红外遥控器控制继电器.......................................................................174 实例98:基于DS1302 的日历时钟........................................................................177 实例99:单片机数据发送程序...............................................................................185 实例100:电机转速表设计.....................................................................................186 模拟霍尔脉冲(192)3 / 192.Word 文档/************************************************************ 函数的使用和熟悉***************************************************************///实例3:用单片机控制第一个灯亮#includereg51.h //包含51 单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B ,即P1.0输出低电平}// 4//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#includereg51.h //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void 意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围*****for(i=0;i20XX年0;i++) //做20XX年0 次空循环; //什么也不做,等待一个机器周期}/*******************************************************函数功能:主函数(C 语言规定必须有也只能有1 个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xfe; //P1=***-*****B ,P1.0 输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B ,P1.0 输出高电平delay();//延时一段时间}}4/ 192.Word 文档// 5 P1 P0 P2 P3 I/O //实例5:将#includereg51.hP1 口状态分别送入P0、P2、P3 口:认识I/O口的引脚功能//包含单片机寄存器的头文件/******************************************************* 函数功能:主函数(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 #includereg51.h //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;ii++)for(j=0;jj++);}/******************************************************* 函数功能:主函数********************************************************/ voidmain(void){.5/192Word文档.Word 文档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 #includereg51.h //包含单片机寄存器的头文件sfr x=0xb0; //P3 口在存储器中的地址是b0H ,通过sfr 可定义8051 内核单片机//的所有内部8 位特殊功能寄存器,对地址x 的操作也就是对P1 口的操作/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned chari,j;for(i=0;ii++)for(j=0;jj++); //利用循环等待若干机器周期,从而延时一段时间}/*****************************************函数功能:主函数6/ 192.******************************************/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:用不同数据类型控制灯闪烁时间#includereg51.h//包含单片机寄存器的头文件/****************************************************** 函数功能:用整形数据延时一段时间******************************************************/ void int_delay(void)//延时一段较长的时间{unsigned int m;//定义无符号整形变量,双字节数据,值域为0~***** for(m=0;m*****;m++);//空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/7/192Word文档.Word 文档void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255 for(i=0;ii++)for(j=0;jj++); //空操作}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;while(1){for(i=0;ii++){P1=0xfe; //P1.0 口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;ii++){P1=0xef; //P1.4 口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay();//延时一段较长的时间} }}//实例9:用P0 口、P1 #includereg51.hvoid main(void){unsigned char m,n;口分别显示加法和减法运算结果m=43; //即十进制数2x16+11=43 8/192.Word 文档n=60; P1=m+n; //即十进制数3x16+12=60//P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮} P0=n-m; //P0=17=***-*****B,结果P0.0、P0.4的灯被熄灭//实例10:用P0、P1口显示乘法运算结果#includereg51.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口显示除法运算结果#includereg51.h //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5)*10)/5;//求小数while(1) 9/ 192.; //无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#includereg51.h//包含单片机寄存器的头文件/******************************************************函数功能:延时一段时间******************************************************/void delay(void){unsigned int i;for(i=0;i20XX年0;i++);}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;for(i=0;ii++)//注意i的值不能超过255{P0=i;//将i的值送P0口delay();//调用延时函数}}//实例13:用P0口显示逻辑"与"运算结果#includereg51.h//包含单片机寄存器的头文件void main(void){P0=(40)(90xab);//将逻辑运算结果送P0口while(1);//设置无限循环,防止程序“跑飞”}110/192Word文档.Word文档//14P0//实例14:用P0口显示条件运算结果#includereg51.h//包含单片机寄存器的头文件void main(void){P0=(84)?8:4;//将条件运算结果送P0口,P0=8=***-*****B while(1);//设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#includereg51.h//包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=***-*****B while(1);//设置无限循环,防止程序“跑飞”}//16P0//实例16:用P0显示左移运算结果#includereg51.h//包含单片机寄存器的头文件void main(void){P0=0x3b2;//将左移运算结果送P0口,P0=***-*****B=0xec while(1);//无限循环,防止程序“跑飞”}#includereg51.hsbit F=P1^4; //实例17:"万能逻辑电路"实验//包含单片机寄存器的头文件//将F位定义为P1.4.Word文档1 1 1 / 1 9 2.Word 文档sbit X=P1^5; sbit Y=P1^6; sbit Z=P1^7; void main(void){while(1){//将X 位定义为//将Y 位定义为//将Z 位定义为P1.5 P1.6 P1.7 } }F=((~X)Y)|Z; //将逻辑运算结果赋给F;//实例18:用右移运算流水点亮P1 口8 位LED #includereg51.h //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n*****;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;ii++)//设置循环次数为8{P1=P11; //每次循环P1 的各二进位右移1 位,高位补0 delay(); //调用延时函数}} }112/ 192.Word 文档// 19 iff P0 8 LED //实例19:用iff 语句控制P0 口8 位LED 的流水方向#includereg51.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 的点亮状态#includereg51.h //包含单片机寄存器的头文件sbit S1=P1^4; //将S1 位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n*****;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned chari; 113/ 192.Word 文档i=0; while(1) { //将i 初始化为0 if(S1==0) { delay(); //如果S1 键按下//延时一段时间}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//实例21:用for 语句控制蜂鸣器鸣笛次数#includereg51.h //包含单片机寄存器的头文件sbit sound=P3^7; //将sound 位定义为P3.7 /**************************************** 函数功能:延时形成1600Hz 音频114/ 192.Word 文档****************************************/ void delay1600(void){unsigned char n;for(n=0;nn++);}/**************************************** 函数功能:延时形成800Hz 音频****************************************/ void delay800(void) {unsigned charn;for(n=0;nn++);} /**************************************** 函数功能:主函数****************************************/ void main(void){unsigned int i;while(1){for(i=0;ii++){sound=0; //P3.7 输出低电平delay1600();sound=1; //P3.7 输出高电平delay1600();}for(i=0;ii++){sound=0; //P3.7 输出低电平delay800();sound=1; //P3.7输出高电平delay800();} }}115/ 192.Word文档//实例22:用whille语句控制LED #includereg51.h //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms(3*100*200=*****μs) ****************************************/void delay60ms(void){unsigned char m,n;for(m=0;mm++)for(n=0;nn++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;while(1)//无限循环{i=0;//将i初始化为0while(i0xff)//当i小于0xff(255)时执行循环体{P0=i;//将i送P0口显示delay60ms();//延时i++;//i自增1}}}//实例23:用do-whiile语句控制P0口8位LED流水点亮#includereg51.h//包含单片机寄存器的头文件/****************************************函数功能:延时约60ms(3*100*200=*****μs)****************************************/void delay60ms(void){116/192.unsigned char m,n;for(m=0;mm++)for(n=0;nn++);}/****************************************函数功能:主函数****************************************/ 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流水点亮#includereg51.h//包含单片机寄存器的头文件/****************************************函数功能:延时约60ms(3*100*200=*****μs)****************************************/。
以下是一个基于8051单片机和Proteus仿真环境的C语言程序设计实例:实例1:点亮LED灯
在这个例子中,我们将使用C语言编写一个简单的程序来控制8051单片机的一个I/O引脚,使其驱动一个LED灯。
c代码:
要使用Proteus进行仿真,你需要按照以下步骤操作:
1. 打开Proteus软件,创建一个新的设计工程。
2. 在元件库中搜索并添加相应的8051单片机型号(如AT89C51)和LED 元件到工作区。
3. 根据实际硬件连接,正确配置单片机的引脚和LED的连接。
4. 右键单击单片机元件,选择“Edit Component”打开编辑窗口。
5. 在“Program File(s)”区域,点击右侧的浏览按钮,选择你的C语言源文件(如上述的main.c)。
6. 点击“OK”关闭编辑窗口,然后点击工具栏上的“Play”按钮开始仿真。
在仿真过程中,你应该能看到LED灯被点亮,这表明你的C语言程序已经在Proteus环境中成功运行。
以上只是一个基础的例子,实际的"单片机C语言程序设计实例100例--基于8051+Proteus仿真"会包含更复杂和多样化的应用场景,包括定时器/计数器
应用、中断处理、串口通信、ADC/DAC转换、液晶显示等等。
每个实例都会详细介绍程序设计思路、代码实现以及如何在Proteus中进行仿真调试。
通过这些实例的学习和实践,你可以逐步掌握8051单片机的C语言编程技巧和Proteus仿真环境的使用方法。
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. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
pic16 c语言实例摘要:1.PIC16 单片机简介2.C 语言编程基础3.PIC16 C 语言编程实例详解4.总结正文:【1.PIC16 单片机简介】PIC16 系列单片机是由美国Microchip 公司推出的一款16 位微控制器(Microcontroller Unit, MCU)。
它具有高性能、低功耗、成本低的特点,广泛应用于嵌入式系统、自动控制、智能家居等领域。
【2.C 语言编程基础】C 语言是一种通用的高级程序设计语言,广泛应用于各种领域,如操作系统、嵌入式系统、游戏开发等。
C 语言的特点是语法简洁、执行效率高、跨平台等。
【3.PIC16 C 语言编程实例详解】以PIC16F877A 单片机为例,这是一个常见的PIC16 系列单片机型号。
下面是一个简单的PIC16 C 语言编程实例:```c#include <reg52.h> // 包含头文件,定义了PIC16F877A 单片机的寄存器sbit led = P1^0; // 定义一个名为led 的位变量,对应P1.0 端口,用于控制LED 灯的开关void delay(unsigned int ms) // 延时函数{unsigned int i, j;for (i = ms; i > 0; i--)for (j = 114; j > 0; j--);}void main(){while (1) // 无限循环{led = 0; // LED 灯熄灭delay(500); // 延时500msled = 1; // LED 灯点亮delay(500); // 延时500ms}}```这个例子中,我们首先引入了PIC16F877A 单片机的寄存器定义头文件,然后定义了一个位变量led,用于控制P1.0 端口的LED 灯的开关。
接着,我们编写了一个延时函数,用于控制程序的执行速度。
最后,在主函数中,我们使用一个无限循环,通过切换LED 灯的状态,实现了一个简单的闪烁效果。
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的数字。
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口的操作/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某。
单片机C语言编程实例前言INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的多种芯片,从而扩充和扩展了其品种和应用领域.C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。
将C语言向单片机上的移植,始于20世纪80年代的中后期。
经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。
用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。
因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的..C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广。
最多的计算语言之一。
C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言。
与汇编语言相比,C51在功能上.结构上以及可读性。
可移植性。
可维护性等方面都有非常明显的优势.目前最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51.第一章单片机C语言入门1。
1建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能.因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
单片机adc转换原理及c语言编程实例单片机中的ADC(模拟数字转换器)是一种将模拟信号转换为数字信号的电子元件。
其原理是将模拟信号通过一系列的电子元件转换为相应的数字信号,从而能够被单片机处理和识别。
在C语言中,ADC的转换通常是通过读取ADC的寄存器来实现的。
下面是一个简单的C语言编程实例,用于读取ADC的转换结果:```cinclude <> // 包含单片机头文件define ADC_PORT P1 // 定义ADC输入端口为P1口void ADC_Start() // 启动ADC{ADC_PORT = 0x80; // 设置ADC控制寄存器,启动ADCdelay(10); // 延时一段时间,等待ADC转换完成}unsigned char ADC_Read() // 读取ADC转换结果{unsigned char i, dat = 0;for (i = 0; i < 8; i++) // 循环读取ADC数据寄存器中的数据{ADC_Start(); // 启动ADCdelay(10); // 延时一段时间,等待ADC转换完成if (ADC_PORT & 0x01) // 判断数据寄存器最高位是否为1{dat = (0x01 << i); // 将数据寄存器中的数据写入到结果变量中}ADC_PORT = (ADC_PORT >> 1) & 0x7F; // 将数据寄存器左移一位,准备读取下一位数据}return dat; // 返回转换结果}void main() // 主函数{while (1) // 循环读取ADC转换结果并输出到串口{unsigned char dat = ADC_Read(); // 读取ADC转换结果// 在此处添加串口发送代码,将dat发送到串口}}```在上述代码中,首先定义了ADC的输入端口为P1口,然后定义了两个函数:`ADC_Start()`用于启动ADC,`ADC_Read()`用于读取ADC转换结果。
51单片机C语言编程100例单片机c语言编程单片机是一种常用于嵌入式系统的微型计算机,可以根据预设的程序来执行指令。
而C语言是一种高级编程语言,具有较强的可读性和可移植性。
在单片机编程中,C语言是常用的编程语言之一。
本文将介绍51单片机C语言编程中的100个实例,帮助读者了解单片机编程的基本概念和技巧。
1. LED灯闪烁这是一个简单的实例,用于让LED灯交替闪烁。
在C语言中,可以使用宏定义和循环语句来实现:```c#include <reg52.h>#define LED P1void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){while (1) //循环执行{LED = 0xFF; //LED灯亮delay(1000); //延时1秒LED = 0x00; //LED灯灭delay(1000); //延时1秒}}```2. 数码管显示这个实例演示了如何使用数码管进行数字显示。
在C语言中,可以通过控制IO口状态来实现:```c#include <reg52.h>#define LED P0unsigned char code digit[] ={ //数码管显示值表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){unsigned int i;while (1) //循环执行{for(i=0;i<10;i++){LED = digit[i]; //显示数字delay(1000); //延时1秒}}```3. 蜂鸣器发声这个实例展示了如何使用蜂鸣器进行声音发声。
11.00-59 秒计时器<利用软件延时)1.实验任务如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0 口驱动显示秒时间的十位,而P2 口驱动显示秒时间的个位。
2.电路原理图图 4.11.13.系统板上硬件连线<1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7 端口用8 芯排线连接到“四路静态数码显示模块”区域中的任一个a-h 端口上;要求:P0.0/AD0 对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
<2.把“单片机系统”区域中的P2.0/A8-P2.7/A15 端口用8 芯排线连接到“四路静态数码显示模块”区域中的任一个a-h 端口上;要求:P2.0/A8 对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。
4.程序设计内容tyw 藏书<1.在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加 1 ,当秒计数达到60 时,就自动返回到0,重新秒计数。
<2.对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10 整除和对10 求余。
<3.在数码上显示,仍通过查表的方式完成。
<4.一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1 秒时间为1 .002 秒。
DELY1S: MOV R5,#100D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RET5.程序框图tyw 藏书图 4.11.26.汇编源程序Second EQU 30HORG 0START: MOV Second,#00HNEXT: MOV A,SecondMOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,AMOV A,BMOVC A,@A+DPTRLCALL DELY1SINC SecondMOV A,SecondCJNE A,#60,NEXTLJMP STARTDELY1S: MOV R5,#100D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7. C 语言源程序#include <AT89X51.H>unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} 。
unsigned char Second 。
void delay1s(void>{unsigned char i,j,k 。
for(k=100。
k>0。
k-->for(i=20 。
i>0 。
i-->for(j=248 。
j>0 。
j--> 。
}tyw 藏书void main(void>{Second=0。
P0=table[Second/10] 。
P2=table[Second%10] 。
while(1>{delay1s(> 。
Second++。
if(Second==60>{Second=0。
}P0=table[Second/10] 。
P2=table[Second%10] 。
}}12.可预置可逆 4 位计数器1.实验任务利用AT89S51单片机的P1.0 —P1.3接四个发光二极管L1 —L4,用来指示当前计数P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。
具体的电路原理图如下图所示2.电路原理图tyw 藏书图4.12.13.系统板上硬件连线<1.把“单片机系统”区域中的P1.0—P1.3 端口用8 芯排线连接到“八路发光二极管指示模块”区域中的L1 —L4上;要求:P1.0对应着L1, P1.1对应着L2, P1.2对应着L3, P1.3对应着L4;<2.把“单片机系统”区域中的P3.0/RXD,P3.1/TXD,P3.2/INT0 ,P3.3/INT1 用导线连接到“四路拨动开关”区域中的K1—K4 上;<3.把“单片机系统”区域中的P3.6/WR, P3.7/RD 用导线连接到“独立式键盘”区域中的SP1和SP2 上;4.程序设计内容<1.两个独立式按键识别的处理过程;tyw 藏书<2.预置初值读取的问题<3.LED 输出指示5.程序框图图4.12.26.汇编源程序COUNT EQU 30HORG 00HSTART: MOV A,P3ANL A,#0FHMOV COUNT,AMOV P1,ASK2: JB P3.6,SK1tyw 藏书ANL A,#0FH MOV COUNT,A NEXT: MOV P1,A WAIT: JNB LCALL DELY10MS JB P3.6,SK1 INC COUNT MOV A,COUNT CJNE A,#16,NEXT MOV A,P3P3.6,WAIT LJMP SK2 SK1: JB P3.7,SK2 LCALL DELY10MS JB P3.7,SK2 DEC COUNT MOV A,COUNT CJNE A,#0FFH,NEX MOV A,P3 ANL A,#0FH MOV COUNT,A NEX: MOV P1,A WAIT2: JNB P3.7,WAIT2 LJMP SK2 DELY10MS: MOV R6,#20 MOV R7,#248 D1: DJNZ R7,$ DJNZR6,D1 RETEND 7. C 语言源程序#include <AT89X51.H> unsigned char curcount voiddelay10ms(void> { unsigned char i,j 。
for(i=20 。
i>0 。
i--> for(j=248 。
j>0。
j--> 。
} void main(void> { curcount=P3 & 0x0f 。
P1=~curcount 。
while(1>{if(P3_6==0>{tyw 藏书delay10ms(> 。
if(P3_6==0>{ if(curcount>=15>{curcount=15 。
}else{curcount++ 。
}P1=~curcount 。
while(P3_6==0> 。
}} if(P3_7==0>{delay10ms(> 。
if(P3_7==0>{if(curcount<=0>{curcount=0 。
}else{curcount-- 。
}P1=~curcount 。
while(P3_7==0> 。
}}}}13.动态数码显示技术1.实验任务如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7 接一个开关,当开关接高电平时,显示“ 12345”字样;当开关接低电平时,显示“ HELL O字样。
2.电路原理图tyw 藏书图4.13.13.系统板上硬件连线<1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7 用8 芯排线连接到“动态数码显示”区域中的a-h 端口上;<2.把“单片机系统”区域中的P2.0/A8-P2.7/A15 用8 芯排线连接到“动态数码显示”区域中的S1-S8 端口上;<3.把“单片机系统”区域中的P1.7 端口用导线连接到“独立式键盘”区域中的SP1 端口上;4.程序设计内容<1 .动态扫描方法tyw 藏书动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出< 字形选择),另一接口完成各数码管的轮流点亮<数位选择)。
<2.在进行数码显示的时候,要对显示单元开辟8 个显示缓冲区,每个显示缓冲区装有显示的不同数据即<3.对于显示的字形码数据我们采用查表方法来完成。
5.程序框图图4.13.26.汇编源程序ORG 00HSTART: JB P1.7,DIR1MOV DPTR,#TABLE1SJMP DIRDIR1: MOV DPTR,#TABLE2DIR: MOV R0,#00HMOV R1,#01HNEXT: MOV A,R0MOVC A,@A+DPTRtyw 藏书MOV P0,AMOV A,R1MOV P2,ALCALL DAYINC R0RL AMOV R1,ACJNE R1,#0DFH,NEXTSJMP STARTDAY: MOV R6,#4D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE1: DB 06H,5BH,4FH,66H,6DHTABLE2: DB 78H,79H,38H,38H,3FHEND7. C 语言源程序#include <AT89X51.H>unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d} unsigned char code table2[]={0x78,0x79,0x38,0x38,0x3f} unsigned char i 。
unsigned char a,b 。
unsigned char temp 。
void main(void>{while(1>{temp=0xfe 。
for(i=0 。
i<5。
i++>if(P1_7==1>{P0=table1[i] 。
}else{P0=table2[i] 。
}P2=temp。
a=temp<<(i+1> 。
b=temp>>(7-i> 。
tyw 藏书temp=a|b 。
for(a=4。
a>0。
a-->for(b=248 。
b>0。
b--> 。
}}14. 4 X 4矩阵式键盘识别技术1 .实验任务如图4.14.2所示,用AT89S51的并行口P1接4X 4矩阵键盘,以P1.0 —P1.3 作输入线,以P1.4 —P1.7作输出线;在数码管上显示每个按键的“ 0—F”序号。
对应的按键的序号排列如图 4.14.1 所示图4.14.12.硬件电路原理图tyw 藏书图4.14.23.系统板上硬件连线<1.把“单片机系统“区域中的P3.0—P3.7 端口用8 芯排线连接到“ 4X4 行列式键盘”区域中的C1—C4 R1—R4 端口上;<2.把“单片机系统”区域中的P0.0/AD0—P0.7/AD7 端口用8 芯排线连接到“四路静态数码显示模块”区域中的任一个a—h 端口上;要求:P0.0/AD0 对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。