单片机应用的实例
单片机应用设计实例

数控调频发射台的设计题目:基于单片机的数控调频发射台功能:本数控调频发射器可在80.0 MHZ 至109.9MHZ 范围内任意设置发射频率,可预置11 个频道,发射频率调整最小值为0.1MHZ,具有单声道/立体声控制,可广泛应用于学校无线广播、电视现场导播、汽车航行、无线演说等场所。
设计过程:一、系统硬件电路的设计(1)单片机控制部分单片机采用AT89C52,采用最小化应用系统设计,P0 口和P2 口作为共阳LED 数码管驱动用,P1 口作为16 键的键盘接口,其中T0—T3 分别为百位、十位、个位、小数位的频率操作键。
百位数只能是0 或1,当百位数为0 时,十位数为8 或9。
当百位数为1 时,十位数只能为0。
个位及小数位为09之中任意数。
T4—T14 为发射频率预置键, T15 为单声道/立体声控制键。
P3.0、P3.1、P3.2 作为与BH1415 的通讯端口,用于传送发射频率控制数据,P3.3 用于立体声发射批示。
采用12MHZ 晶振,模拟串口通讯。
单片机控制部分电路如下图一。
(2)调频调制发射部分采用Rohm 公司最新生产的调频发射专用集成电路BH1415F,内含立体声信号调制、调频广播信号发射电路,BH1415F 内有前置补偿电路、限制器电路、低通滤波电路等,因此具有良好的音色,内置PLL 系统调频发射电路,传输频率非常稳定。
调频发射频率可用单片机通过串行口直接控制。
BH1415F 各引脚的功能如表1,应用电路如图2。
从11 脚输出的调频调制信号经高频放大后由天线发射输出,后级高频放大器的功率可根据接收的距离范围考虑。
BH1415F 的频率控制码为16 位,其传送格式要求如图5,其中D0—D10 为频率控制数据,其值乘0.1 即为BH1415F 的输出频率(单位MHZ)。
D11—D15 为控制位,其中D11(MONO)位为单声道/立体声控制位,0 时为单声道发射模式,1时为立体声发射模式。
实例:单片机在家用电器中的应用

(4)除霜电路 选用MF53-1型热敏电阻作为温度传感器(Rt ),它具有负 温度系数,灵敏度较高。把热敏电阻安装在距蒸发器 3mm 的某 个合适的位置上,当霜厚大于 3mm 时,热敏电阻 Rt 接触到霜从 而感受到较低的温度,其电阻值变大,A点温度降低,运算放大 器输出信号有变化,经A/D转换后送入CPU,经单片机分析、判 断,给出除霜命令。除霜电路如下图所示。
ห้องสมุดไป่ตู้
上页图中, ADC0809 的 A , B , C 三个引脚直接和 80C51 单片 机的 P0.0 ~ P0.2 三个引脚相连,用于选择不同的模拟通道信 号。 P1.6 与读写控制信号端和经过或非门连接到 ADC0809 的 START,ALE,OE端,分别控制ADC0809的启动、地址锁存、读 操作和写操作。ADC0809的EOC端悬空,A/D转换后利用软件延 时一段时间来读取转换后的数据。 (3)功能键和显示电路 功能键和显示电路如上页图所示。采用6个功能键控制冷 冻室、冷藏室及速冻温度设定, 4 位 LED 显示器用于显示冷冻、 冷藏室温度,以及压缩机启动、停止和报警等状态。 LED 显示及功能键都是通过 80C51 的串行口扩展的。显示 输出通道和键盘输入通道的选择由端口线 P3.2 和与门完成。 当 P3.2 为“ 1”时,数据输出到显示器。当 P3.2 为“ 0”时, 80C51完成对键盘的扫描。
1.总体方案设计 直冷式电冰箱的控制原理: 根据蒸发器的温度控制制冷压缩机的启动、停止,使冰箱内的 温度保持在设定温度范围内。采用单片机控制压缩机的启动和 停止,可以使控制更准确、更灵活。 电冰箱采用单片机控制的性能指标如下: ① 设定 3 个测温点,测量范围在- 26℃~ +26℃之间,精度为 ±0.5℃。 ② 利用功能键分别控制温度设定、速冻设定、冷藏室及冷冻室 温度设定等。
单片机100例

目录目录 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实例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******************************************************************** **键盘控制*********键盘控制*************** ***************键盘控制**** *****键盘控制**** ****** *****************************************************/ 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 ************* *******液晶显示LCD*********液晶显示LCD *****液晶显示LCD **** ****** ***********************************************************/ 95实例81:用LCD显示字符'A' 96实例82:用LCD循环右移显示"Welcome to China" 99实例83:用LCD显示适时检测结果 102实例84:液晶时钟设计106*******************************************************************一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控**********************************************/ 112实例85:将数据"0x0f"写入A T24C02再读出送P1口显示112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示117实例87:对I2C总线上挂接多个A T24C02的读写操作 124实例88:基于AT24C02的多机通信读取程序129实例88:基于AT24C02的多机通信写入程序133实例90:DS18B20温度检测及其液晶显示144实例91:将数据"0xaa"写入X5045再读出送P1口显示 153实例92:将流水灯控制码写入X5045并读出送P1口显示157实例93:对SPI总线上挂接多个X5045的读写操作161实例94:基于ADC0832的数字电压表165实例95:用DAC0832产生锯齿波电压171实例96:用P1口显示红外遥控器的按键值171实例97:用红外遥控器控制继电器174实例98:基于DS1302的日历时钟177实例99:单片机数据发送程序185实例100:电机转速表设计 186模拟霍尔脉冲192/************************************************************函数的使用和熟悉*************** ************************************************///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围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 1111B,熄灭LEDP0=P1; // 将P1口状态送入P0口P2=P1; // 将P1口状态送入P2口P3=P1; // 将P1口状态送入P3口}//实例6:使用P3口流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/******************************************************* 函数功能:主函数********************************************************/ void main(void){while(1){P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮delay(); //调用延时函数P3=0x7f; //第八个灯亮delay(); //调用延时函数}}//实例7:通过对P3口地址的操作流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++); //利用循环等待若干机器周期,从而延时一段时间}/*****************************************函数功能:主函数******************************************/void main(void){while(1){x=0xfe; //第一个灯亮delay(); //调用延时函数x=0xfd; //第二个灯亮delay(); //调用延时函数x=0xfb; //第三个灯亮delay(); //调用延时函数x=0xf7; //第四个灯亮delay(); //调用延时函数x=0xef; //第五个灯亮delay(); //调用延时函数x=0xdf; //第六个灯亮delay(); //调用延时函数x=0xbf; //第七个灯亮delay(); //调用延时函数x=0x7f; //第八个灯亮delay(); //调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#include<reg51.h> //包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/void int_delay(void) //延时一段较长的时间{unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++); //空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255 for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作}/******************************************************函数功能:主函数******************************************************/void main(void){unsigned char i;while(1){for(i=0;i<3;i++){P1=0xfe; //P1.0口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //P1.4口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay(); //延时一段较长的时间}}}//实例9:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;n=71;s=m*n; //s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0//两边同除以256,可得17+192/256=H3*16+H2+(H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数P1=s/256; //高8位送P1口,P1=17=11H=0001 0001B, P1.0和P1.4口灭,其余亮P0=s%256; //低8位送P0口, P3=192=c0H=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位,高位补0delay(); //调用延时函数}}}//实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为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 code Tab[ ]={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 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(); //调用延时函数i++; //指向下一个数组元素}}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E};//流水灯控制码unsigned char *pointer;pointer=Tab;led_flow(pointer);}//实例33:用函数型指针控制P1口灯花样#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水灯左移**************************************************************/void led_flow(void){unsigned char i;for(i=0;i<8;i++) //8位控制码{P0=Tab[i];delay();}}/**************************************************************函数功能:主函数**************************************************************/void main(void){void (*p)(void); //定义函数型指针,所指函数无参数,无返回值p=led_flow; //将函数的入口地址赋给函数型指针pwhile(1)(*p)(); //通过函数的指针p调用函数led_flow()}//实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址unsigned char code str3[ ]="The Systerm is designed by Zhang San";unsigned char code str4[ ]="The date is 2008-9-30";unsigned char *p[ ]={str1,str2,str3,str4}; //定义p[4]为指向4个字符串的字符型指针数组/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水点亮P0口8位LED**************************************************************/void led_display(unsigned char *x[ ]) //形参必须为指针数组{unsigned char i,j;for(i=0;i<4;i++) //有4个字符串要显示{j=0; //指向待显字符串的第0号元素while(*(x[i]+j)!='\0') //只要第i个字符串的第j号元素不是结束标志{P0=*(x[i]+j); //取得该元素值送到P0口显示delay(); //调用延时函数j++; //指向下一个元素}}}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char i;while(1){for(i=0;i<4;i++)led_display(p); //将指针数组名作实际参数传递}}//实例35:字符函数ctype.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}//实例36:内部函数intrins.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<intrins.h> //包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){P3=0xfe; //P3=1111 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}//实例37:标准函数stdlib.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<stdlib.h> //包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;while(1){for(i=0;i<10;i++) //产生10个随机数{P3=rand()/160; //将产生的随机数缩小160倍后送P3显示delay();}}}//实例38:字符串函数string.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<string.h> //包含函数isalpha()声明的头文件void main(void){unsigned char str1[ ]="Now, The temperature is :";unsigned char str2[ ]="Now, The temperature is 36 Centgrade:";unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入iif(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}//实例39:宏定义应用举例2#include<reg51.h> //包含51单片机寄存器定义的头文件# define F(a,b) (a)+(a)*(b)/256+(b) //带参数的宏定义,a和b为形参void main(void){unsigned char i,j,k;i=40;j=30;k=20;P3=F(i,j+k); //i和j+k分别为实参,宏展开时,实参将替代宏定义中的形参while(1);}//实例40:宏定义应用举例2#include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0; //将P3.0引脚置低电平,LED点亮P3_1=0; //将P3.0引脚置低电平,LED点亮P3_2=0; //将P3.0引脚置低电平,LED点亮P3_3=0; //将P3.0引脚置低电平,LED点亮P3_4=1; //将P3.4引脚置高电平,LED熄灭P3_5=1; //将P3.5引脚置高电平,LED熄灭P3_6=1; //将P3.7引脚置高电平,LED熄灭P3_7=1; //将P3.7引脚置高电平,LED熄灭while(1);}//实例41:宏定义应用举例3#include<reg51.h> //包含51单片机寄存器定义的头文件#define MAX 100 //将MAX宏定义为字符串100void main(void){#if MAX>80 //如果字符串100大于80P3=0xf0; //P3口低四位LED点亮#elseP3=0x0f; //否则,P3口高四位LED点亮#endif //结束本次编译}/*************************************************************** **中断、定时器********中断、定时器************ *********中断、定时器*********中断、定时器******** **** ********************************************************///实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/**************************************************************函数功能:主函数**************************************************************/void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值}}//实例43:用定时器T1查询方式控制单片机发出1KHz音频#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/************************************************************** 函数功能:主函数**************************************************************/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}。
嵌入式单片机开发设计实例

嵌入式单片机开发设计实例
以下是一些嵌入式单片机开发的设计实例:
1. 温度测量系统:使用单片机与温度传感器连接,实时读取环境温度并显示在液晶屏上。
可以通过按键切换温度单位(摄氏度或华氏度),并设置温度报警阈值,当温度超过阈值时触发蜂鸣器报警。
2. 智能家居系统:将单片机与各种传感器(如光照、湿度、烟雾等)和执行器(如灯泡、窗帘)连接,实现自动化控制。
可以通过手机APP或遥控器远程操控家居设备,也可以设置定时任务,如定时开关灯、定时浇水等。
3. 电子秤:使用单片机控制称重传感器,实时测量物品的重量,并显示在液晶屏上。
可以设置称重范围和精度,当超过范围或精度不足时触发蜂鸣器报警。
4. 智能车辆控制系统:将单片机与各种传感器(如光电传感器、红外线传感器、超声波传感器等)和执行器(如电机、舵机)连接,实现对车辆的控制。
可以通过遥控器或手势识别等方式控制车辆的前进、后退、转向等操作。
5. RFID门禁系统:使用单片机与RFID读写器连接,实现对门禁的管理。
当合法的RFID卡片靠近读写器时,门自动打开,同时记录进出时间和人员信息。
可以通过管理软件对人员的出入进行管理和统计。
这些设计实例只是嵌入式单片机开发的一小部分,实际应用非常广泛,可以根据需求进行扩展和定制。
51单片机写的项目

51单片机写的项目
7. 电子门锁:使用51单片机和密码输入模块,设计一个电子门锁系统,可以通过输入正 确的密码来开启门锁。
8. 智能灌溉系统:利用51单片机和湿度传感器,设计一个智能灌溉系统,可以根据土壤 湿度自动控制灌溉设备的开关。
51单片机写的项目
51单片机是一种经典的单片机型号,广泛应用于嵌入式系统和电子设备中。以下是一些 常见的基于51单片机的项目示例:
1. 温度监测系统:使用51单片机和温度传感器,设计一个温度监测系统,可以实时监测 环境温度,并将数据显示在液晶显示屏上。
2. 电子琴:利用51单片机的IO口和蜂鸣器,设计一个简单的电子琴,可以发出不同音调 的声音,通过按键控制。
3. 智能家居控制系统:使用51单片机和各种传感器,设计一个智能家居控制系统,可以 实现对家居设备(如灯光、窗帘、空调等)的远程控制和自动化控制。
51单片机写的项目
4. 智能车辆:利用51单片机和各种传感器(如外线传感器、超声波传感器等),设计 一个智能车辆,可以实现避障、跟随等功能。
5. 电子时钟:使用51单片机和数码管,设计一个电子时钟,可以显示当前的时间,并具 备闹钟功能。
这些项目只是一些常见的示例,基于51单片机的项目种类繁多,可以根据实际需求和兴 趣进行创新和扩展。
C51单片机实战100例

C51单片机实战100例C51单片机作为最常用的单片机芯片之一,具有性能稳定、资源丰富、易于学习和开发等优势。
本文将介绍C51单片机实战100例,旨在帮助读者更好地理解和应用C51单片机。
第一例:LED灯闪烁首先,我们以最简单的LED灯闪烁为例,来体验一下C51单片机的编程过程。
首先我们需要准备一个开发板、几个电阻和电源。
然后,根据单片机的引脚图,将LED灯连接好。
接下来,我们需要编写简单的C语言程序来控制LED灯的闪烁。
例如,我们可以使用内置的延时函数来调整灯亮的时间,实现闪烁效果。
经过编译和下载,我们就可以看到LED灯以一定的频率闪烁,一闪一闪的。
第二例:数码管显示除了控制LED灯闪烁外,C51单片机还可以用来控制各种数码管显示。
例如,我们可以编写程序实现数字的倒计时功能。
在倒计时过程中,我们可以通过数码管的显示,直观地观察到时间的变化。
在编写程序时,我们需要根据数码管的接口电路来控制引脚的输出,并使用定时器中断来实现秒数的递减。
通过不断循环调用显示函数,我们可以将倒计时的数字显示在数码管上,并实时更新。
第三例:温湿度检测C51单片机还可以用来进行温湿度的检测。
我们可以连接温湿度传感器到单片机的引脚上,并编写相应的程序来读取传感器的数据。
在编写程序时,我们可以使用串口通信来与PC机进行数据的交互。
通过串口发送指令,单片机可以将温湿度的数据发送回PC机进行实时显示。
这样,我们就可以通过C51单片机来实现温湿度的实时监测功能。
......通过以上几个实例,可以清楚地看到C51单片机的强大功能和灵活性。
C51单片机实战100例可以涵盖更多的应用场景,如蜂鸣器控制、电机驱动、红外遥控等。
读者可以根据自己的需求和兴趣选择相应的实例进行学习和实践。
结语总而言之,C51单片机作为一种常见且广泛使用的单片机芯片,具有强大的功能和灵活性。
通过实战100例的学习和实践,读者可以更加深入地理解和掌握C51单片机的编程方法和应用技巧。
电子专业单片机原理与应用教学案例范本

电子专业单片机原理与应用教学案例范本在电子专业的学习中,单片机原理与应用是非常重要的一门课程。
针对这门课程,教学案例是帮助学生理解和应用知识的重要工具。
本文将为大家展示一份电子专业单片机原理与应用教学案例范本,帮助学生更好地掌握相关知识。
案例一:LED灯控制案例描述:在这个案例中,我们将使用单片机来控制LED灯的亮灭。
通过编写相应的程序,我们可以实现不同的亮度和闪烁模式。
这个案例有助于学生理解单片机IO口的应用和控制技术。
实验材料:- 单片机开发板- LED灯- 连接线实验步骤:1. 将LED的正极连接到单片机的一个IO口,将负极连接到地线。
2. 在单片机开发环境中编写程序,控制IO口的高低电平来实现灯的亮灭。
3. 调试程序并观察LED灯的效果。
4. 尝试编写不同的程序,实现灯的呼吸灯效果或者闪烁模式。
案例二:温度监测与报警系统案例描述:这个案例将介绍如何使用单片机构建一个温度监测与报警系统。
通过接入温度传感器,我们可以实时监测温度,并在达到一定阈值之后触发报警。
实验材料:- 单片机开发板- 温度传感器- 蜂鸣器- 连接线实验步骤:1. 将温度传感器连接到单片机的一个模拟输入口。
2. 编写程序读取传感器的模拟信号,并将其转换为对应的温度数值。
3. 设定一个合适的温度阈值,当温度超过该阈值时触发报警。
4. 将蜂鸣器连接到单片机的一个IO口,通过控制IO口的高低电平来控制报警声音的开关。
通过这个案例,学生可以了解如何使用单片机进行温度检测和控制,并了解到实际应用中温度传感器的使用方法。
案例三:智能小车控制系统案例描述:这个案例将介绍如何使用单片机构建一个智能小车控制系统。
通过编写程序,我们可以控制小车的方向和速度,实现避障等功能。
实验材料:- 单片机开发板- 电机驱动模块- 超声波传感器- 连接线实验步骤:1. 将电机驱动模块连接到单片机的若干个IO口,用于控制小车的转向和速度。
2. 将超声波传感器连接到单片机的若干个IO口,用于检测小车前方障碍物的距离。
单片机技术的使用方法及实例解析

单片机技术的使用方法及实例解析在现代科技的发展中,单片机技术的应用越来越广泛。
单片机是一种集成电路,具有微处理器核心、存储器和外围设备接口等功能,可以实现各种复杂的控制任务。
本文将介绍单片机技术的使用方法,并通过实例解析来展示其在实际应用中的作用。
一、单片机的基本原理单片机是一种集成电路,内部包含了微处理器、存储器和外围设备接口等功能。
它的工作原理是通过微处理器核心来执行程序,控制外围设备的工作。
单片机的核心是一个小型的计算机,具有运算、逻辑判断和控制等功能。
它通过存储器来存储程序和数据,通过外围设备接口与外界进行通信。
二、单片机的使用方法1. 硬件设计:在使用单片机之前,首先需要进行硬件设计。
这包括选择适当的单片机型号、设计电路图、选择外围设备等。
硬件设计的关键是根据实际需求选择合适的单片机型号,并设计出稳定可靠的电路。
2. 软件编程:单片机的软件编程是控制单片机工作的关键。
在编程过程中,需要使用特定的开发工具和编程语言。
常用的开发工具有Keil、IAR等,编程语言主要有汇编语言和C语言。
通过编程,可以实现对单片机的控制和操作。
3. 调试和测试:在完成硬件设计和软件编程之后,需要对单片机进行调试和测试。
这包括连接电源、下载程序、运行测试等。
通过调试和测试,可以检查单片机的工作状态是否正常,以及是否满足设计要求。
三、单片机技术的实例解析为了更好地理解单片机技术的应用,下面以智能家居控制系统为例进行解析。
智能家居控制系统是一种基于单片机技术的智能化控制系统,可以实现对家庭设备的远程控制和智能化管理。
该系统由单片机、传感器、执行器和通信模块等组成。
通过单片机的编程,可以实现对家庭设备的控制和监测。
在智能家居控制系统中,单片机负责接收传感器的信号,并根据预设的逻辑进行判断和控制。
例如,当温度传感器检测到室内温度过高时,单片机会发送指令给空调执行器,控制空调开启降温。
同时,单片机还可以通过通信模块与用户的手机进行远程连接,实现对家庭设备的远程控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机应用的实例
单片机是一种在单个芯片上集成了处理器、存储器和输入/输出设备的微型计算机。
它适用于许多不同的应用领域,下面我们将为您提供一些单片机应用的实例。
1. 家电控制:单片机可以用来控制家电产品,如电视、空调、冰箱等。
通过单片机控制,这些设备可以自动化操作,提高使用效率和便利性。
例如,空调可以根据室内温度自动调节温度和风速,冰箱可以根据食物种类自动调整温度和湿度等。
2. 汽车电子:单片机在汽车电子中的应用越来越广泛,可以用来控制发动机、制动系统、燃油管理、车辆安全系统等。
例如,单片机可以控制发动机的点火和燃油喷射,以提高燃油利用率和减少排放;还可以控制制动系统,使车辆更加安全稳定。
3. 工控系统:单片机在工业自动化中的应用非常广泛,可以用来控制生产线、机械设备、仓储物流等。
例如,单片机可以控制流水线上的机器人进行自动化操控,减少工作人员的负担和提高生产效率。
4. 智能家居:单片机可以应用于智能家居领域,如智能门锁、智能灯光、智能窗帘等。
例如,单片机可以控制智能门锁的开关状态,通过传感器检测进出人员,实现智能化管理。
5. 医疗设备:单片机在医疗设备中的应用非常广泛,可以用来控制医疗设备,如血糖仪、血压计、体温计等。
例如,单片机可以控制血糖仪的检测和报告,根据用户的血糖水平提供治疗建议。
总之,单片机的应用非常广泛,在许多不同的领域都有重要的应用,如家电控制、汽车电子、工控系统、智能家居和医疗设备等。
通过单片机,我们可以实现自动化、智能化和便利化的操作。