个单片机C语言实例()

合集下载

单片机c语言编程实例大全

单片机c语言编程实例大全
;
}
/
函数功能:主函数
/
void main(void)
{
while(1)
{
P3=0xfe; //第一个灯亮
delay(); //调用延时函数
P3=0xfd; //第二个灯亮
delay(); //调用延时函数
P3=0xfb; //第三个灯亮
delay(); //调用延时函数
P3=0xf7; //第四个灯亮
}
//实例7:通过对P3口地址的操作流水点亮8位LED
#include<reg51.h> //包含单片机寄存器的头文件
sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机
//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作
/
函数功能:延时一段时间
x=0xfd; //第二个灯亮
delay(); //调用延时函数
x=0xfb; //第三个灯亮
delay(); //调用延时函数
x=0xf7; //第四个灯亮
delay(); //调用延时函数
x=0xef; //第五个灯亮
delay(); //调用延时函数
x=0xdf; //第六个灯亮
delay(); //调用延时函数
delay(); //调用延时函数
P3=0xef; //第五个灯亮
delay(); //调用延时函数
P3=0xdf; //第六个灯亮
delay(); //调用延时函数
P3=0xbf; //第七个灯亮
delay(); //调用延时函数
P3=0x7f; //第八个灯亮
delay(); //调用延时函数

C51单片机C语言程序100例

C51单片机C语言程序100例

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)****************************************/。

单片机c语言程序设计实例100例--基于805i+proteus仿真

单片机c语言程序设计实例100例--基于805i+proteus仿真

以下是一个基于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例-单片机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语言实例

pic16 c语言实例

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语言经典实例

51单片机汇编语言及C语言经典实例

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例

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口的操作/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某。

单片机C语言编程实例

单片机C语言编程实例

单片机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转换原理及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语言编程

51单片机C语言编程100例单片机c语言编程

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. 蜂鸣器发声这个实例展示了如何使用蜂鸣器进行声音发声。

单片机编程100例

单片机编程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例

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例-单片机c语言编程

51单片机C语言编程100例-单片机c语言编程

51单片机C语言编程100例-单片机c语言编程(共19页)-本页仅作为预览文档封面,使用时请删除本页-目录实例3:用单片机控制第一个灯亮...................... 错误!未定义书签。

实例4:用单片机控制一个灯闪烁:认识单片机的工作频率错误!未定义书签。

实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能错误!未定义书签。

实例6:使用P3口流水点亮8位LED.................... 错误!未定义书签。

实例7:通过对P3口地址的操作流水点亮8位LED........ 错误!未定义书签。

实例8:用不同数据类型控制灯闪烁时间................ 错误!未定义书签。

实例9:用P0口、P1 口分别显示加法和减法运算结果.... 错误!未定义书签。

实例10:用P0、P1口显示乘法运算结果................ 错误!未定义书签。

实例11:用P1、P0口显示除法运算结果................ 错误!未定义书签。

实例12:用自增运算控制P0口8位LED流水花样........ 错误!未定义书签。

实例13:用P0口显示逻辑"与"运算结果................ 错误!未定义书签。

实例14:用P0口显示条件运算结果.................... 错误!未定义书签。

实例15:用P0口显示按位"异或"运算结果.............. 错误!未定义书签。

实例16:用P0显示左移运算结果...................... 错误!未定义书签。

实例17:"万能逻辑电路"实验......................... 错误!未定义书签。

实例18:用右移运算流水点亮P1口8位LED............. 错误!未定义书签。

实例19:用if语句控制P0口8位LED的流水方向....... 错误!未定义书签。

(完整word版)51单片机C语言编程100例

(完整word版)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:简易电子琴 (163)实例80:矩阵式键盘实现的电子密码锁 (175)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (188)实例83:用LCD显示适时检测结果 (195)实例84:液晶时钟设计 (203)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (215)实例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语言编程300例

单片机c语言编程300例

单片机C语言编程300例1. 介绍单片机是一种集成电路芯片,具有处理器核心、存储器、输入/输出接口等功能部件。

使用C语言进行单片机编程可以在嵌入式系统中实现各种功能,例如控制设备、采集数据、驱动外设等。

本文档将介绍300个关于单片机C语言编程的例子,涵盖基本的输入/输出操作、循环结构、条件语句、函数调用、中断处理等内容。

2. 基本概念在开始编程之前,我们需要了解一些基本的概念和术语。

2.1 单片机单片机是一种集成电路芯片,由处理器核心、存储器、输入/输出接口等功能部件组成。

常见的单片机包括51系列、AVR系列、STM32系列等。

2.2 C语言C语言是一种通用的高级编程语言,具有代码简洁、易读易写、可移植性强等特点。

在单片机编程中,我们通常使用C 语言来编写程序。

2.3 编译编译是将C语言源代码转换为目标机器指令的过程。

在单片机编程中,我们需要将C语言源代码编译为机器可执行的二进制文件。

2.4 调试调试是指通过调试工具来检查程序的执行过程,以便找出程序中的错误。

3. 基本的输入/输出操作在单片机编程中,我们需要通过输入/输出操作和外部设备进行通信。

以下是一些基本的输入/输出操作的例子:3.1 数字输入/输出3.1.1 通过脚位控制LED灯#include <8051.h>void main() {P0 = 0xFF; // 将P0口设置为输出while (1) {P0 = 0x00; // 打开LED灯delay(); // 延时P0 = 0xFF; // 关闭LED灯delay(); // 延时}}void delay() {int i, j;for (i = 0; i < 500; i++) {for (j = 0; j < 500; j++) {// 延时处理}}}3.1.2 通过按键控制LED灯#include <8051.h>void main() {P0 = 0xFF; // 将P0口设置为输出while (1) {if (P1_0 == 0) { // 检测按键是否按下P0 = 0x00; // 打开LED灯} else {P0 = 0xFF; // 关闭LED灯}}}3.2 模拟输入/输出3.2.1 通过ADC采集模拟信号#include <8051.h>void main() {while (1) {int value = ADC_Read(0); // 采集A0通道的模拟信号P0 = value; // 将模拟信号输出到P0口}}int ADC_Read(unsigned char channel) {// ADC采集处理}3.2.2 通过DAC输出模拟信号#include <8051.h>void main() {while (1) {int value = get_value(); // 获取模拟信号数值DAC_Write(value); // 将模拟信号输出到DAC}}void DAC_Write(unsigned char value) {// DAC输出处理}4. 循环结构循环结构是单片机编程中常用的控制结构之一,可以重复执行一段代码。

单片机C语言编程精选例

单片机C语言编程精选例

目录实例3:用单片机控制第一个灯亮 ................................. 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率........... 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能.实例6:使用P3口流水点亮8位LED ............................... 实例7:通过对P3口地址的操作流水点亮8位LED ................... 实例8:用不同数据类型控制灯闪烁时间........................... 实例9:用P0口、P1 口分别显示加法和减法运算结果............... 实例10:用P0、P1口显示乘法运算结果........................... 实例11:用P1、P0口显示除法运算结果........................... 实例12:用自增运算控制P0口8位LED流水花样................... 实例13:用P0口显示逻辑"与"运算结果........................... 实例14:用P0口显示条件运算结果 ............................... 实例15:用P0口显示按位"异或"运算结果......................... 实例16:用P0显示左移运算结果 ................................. 实例17:"万能逻辑电路"实验 .................................... 实例18:用右移运算流水点亮P1口8位LED ........................ 实例19:用if语句控制P0口8位LED的流水方向.................. 实例20:用swtich语句的控制P0口8位LED的点亮状态............ 实例21:用for语句控制蜂鸣器鸣笛次数.......................... 实例22:用while语句控制LED ................................... 实例23:用do-while语句控制P0口8位LED流水点亮..............实例24:用字符型数组控制P0口8位LED流水点亮................. 实例25:用P0口显示字符串常量 ................................ 实例26:用P0 口显示指针运算结果............................... 实例27:用指针数组控制P0口8位LED流水点亮................... 实例28:用数组的指针控制P0 口8 位LED流水点亮................ 实例29:用P0 、P1口显示整型函数返回值 ........................ 实例30:用有参函数控制P0口8位LED流水速度................... 实例31:用数组作函数参数控制流水花样.......................... 实例32:用指针作函数参数控制P0口8位LED流水点亮............. 实例33:用函数型指针控制P1口灯花样........................... 实例34:用指针数组作为函数的参数显示多个字符串................ 实例35:字符函数ctype.h应用举例 .............................. 实例36:内部函数intrins.h应用举例............................ 实例37:标准函数stdlib.h应用举例............................. 实例38:字符串函数string.h应用举例........................... 实例39:宏定义应用举例2 ....................................... 实例40:宏定义应用举例2 ....................................... 实例41:宏定义应用举例3 ....................................... 实例42:用定时器T0查询方式P2口8位控制LED闪烁.............. 实例43:用定时器T1查询方式控制单片机发出1KHz音频............ 实例44:将计数器T0计数的结果送P1口8位LED显示.............. 实例45:用定时器T0的中断控制1位LED闪烁..................... 实例46:用定时器T0的中断实现长时间定时.......................实例47:用定时器T1中断控制两个LED以不同周期闪烁............. 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频.............. 实例49:用定时器T0的中断实现"渴望"主题曲的播放............... 实例50-1:输出50个矩形脉冲 ................................... 实例50-2:计数器T0统计外部脉冲数............................. 实例51-2:定时器T0的模式2测量正脉冲宽度..................... 实例52:用定时器T0控制输出高低宽度不同的矩形波............... 实例53:用外中断0的中断方式进行数据采集...................... 实例54-1:输出负脉宽为200微秒的方波.......................... 实例54-2:测量负脉冲宽度 ...................................... 实例55:方式0控制流水灯循环点亮 .............................. 实例56-1:数据发送程序 ........................................ 实例56-2:数据接收程序 ........................................ 实例57-1:数据发送程序 ........................................ 实例57-2:数据接收程序 ........................................ 实例58:单片机向PC发送数据 ................................... 实例59:单片机接收PC发出的数据............................... 实例60:用LED数码显示数字5 ................................... 实例61:用LED数码显示器循环显示数字0~9 ....................... 实例62:用数码管慢速动态扫描显示数字"1234" .................... 实例63:用LED数码显示器伪静态显示数字1234 .................... 实例64:用数码管显示动态检测结果 .............................. 实例65:数码秒表设计 ..........................................实例66:数码时钟设计 .......................................... 实例67:用LED数码管显示计数器T0的计数值..................... 实例68:静态显示数字“59” .................................... 实例69:无软件消抖的独立式键盘输入实验 ........................ 实例70:软件消抖的独立式键盘输入实验.......................... 实例71:CPU控制的独立式键盘扫描实验........................... 实例72:定时器中断控制的独立式键盘扫描实验.................... 实例73:独立式键盘控制的4级变速流水灯 ........................ 实例74:独立式键盘的按键功能扩展:"以一当四" .................. 实例75:独立式键盘调时的数码时钟实验.......................... 实例76:独立式键盘控制步进电机实验............................ 实例77:矩阵式键盘按键值的数码管显示实验...................... 实例78:矩阵式键盘按键音 ...................................... 实例79:简易电子琴 ............................................ 实例80:矩阵式键盘实现的电子密码锁............................ 实例81:用LCD显示字符'A' ..................................... 实例82:用LCD循环右移显示"Welcome to China" .................. 实例83:用LCD显示适时检测结果 ................................ 实例84:液晶时钟设计 .......................................... 实例85:将数据"0x0f"写入AT24C02再读出送P1口显示............. 实例86:将按键次数写入AT24C02,再读出并用1602LCD显示......... 实例87:对I2C总线上挂接多个AT24C02的读写操作................ 实例88:基于AT24C02的多机通信读取程序......................实例88:基于AT24C02的多机通信写入程序....................... 实例90:DS18B20温度检测及其液晶显示........................... 实例91:将数据"0xaa"写入X5045再读出送P1口显示............... 实例92:将流水灯控制码写入X5045并读出送P1口显示............. 实例93:对SPI总线上挂接多个X5045的读写操作.................. 实例94:基于ADC0832的数字电压表 .............................. 实例95:用DAC0832产生锯齿波电压 .............................. 实例96:用P1口显示红外遥控器的按键值......................... 实例97:用红外遥控器控制继电器 ................................ 实例98:基于DS1302的日历时钟 ................................. 实例99:单片机数据发送程序 .................................... 实例100:电机转速表设计 ....................................... 模拟霍尔脉冲................................................... /*函数的使用和熟悉*///实例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++); //空操作}/******************************************************函数功能:主函数******************************************************/{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>{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语句控制蜂鸣器鸣笛次数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++);}/**************************************** 函数功能:主函数****************************************/{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(); //延时}}}//实例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=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){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; //定义无符号字符型数据{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 code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{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 code Tab[ ]={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(); //调用延时函数}}}/*************************************************函数功能:主函数*************************************************/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位赋初值}。

mcu 单片机c语言经典程序-实例

mcu 单片机c语言经典程序-实例
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
*名称: Delay()
本例中是调用的intrins.h中的函数实现的循环移位。
*创建人:东流,2009年8月27日
*版本号:1.0
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
/********************************************************************
*名称: Delay()
*功能:延时,延时时间为10ms * del
*输入: del
*输出:无
***********************************************************************/
*输入:无
*输出:无
***********************************************************************/
voidMain(void)
{
P0 = 0xff; //关闭所有LED
while(1)
{
Show_LED = 1;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

相关文档
最新文档