35个单片机设计应用实例
单片机应用设计实例
数控调频发射台的设计题目:基于单片机的数控调频发射台功能:本数控调频发射器可在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时为立体声发射模式。
单片机编程例
单片机编程实例100例大全单片机编程实例*实例1:使用P3口流水点亮8位LED#include<reg51.h>//包含单片机寄存器的头文件/函数功能:延时一段时间voiddelay(void){unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/函数功能:主函数voidmain(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>//包含单片机寄存器的头文件sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/函数功能:延时一段时间/voiddelay(void){unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);//利用循环等待若干机器周期,从而延时一段时间}/函数功能:主函数/voidmain(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>//包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/voidint_delay(void)//延时一段较长的时间{unsignedintm;//定义无符号整形变量,双字节数据,值域为0~65535for(m=0;m<36000;m++);//空操作}/函数功能:用字符型数据延时一段时间/voidchar_delay(void)//延时一段较短的时间{unsignedchari,j;//定义无符号字符型变量,单字节数据,值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++);//空操作}/函数功能:主函数/voidmain(void){unsignedchari;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单片机寄存器定义的头文件voidmain(void){}*实例5:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h>//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void)//两个void意思分别为无需返回值,没有参数传递{ unsignedinti;//定义无符号整数,最大取值范围65535for(i=0;i<20000;i++)//做20000次空循环;//什么也不做,等待一个机器周期}/函数功能:主函数(C语言规定必须有也只能有1个主函数)/voidmain(void) {while(1)//无限循环{delay();//延时一段时间delay();//延时一段时间}}*实例6:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h>//包含单片机寄存器的头文件/函数功能:主函数(C语言规定必须有也只能有1个主函数)/voidmain(void){while(1)//无限循环{P0=P1;//将P1口状态送入P0口P2=P1;//将P1口状态送入P2口P3=P1;//将P1口状态送入P3口}}*实例7:用P0口、P1口分别显示加法和减法运算结果#include<reg51.h> voidmain(void){unsignedcharm,n;m=43;//即十进制数2x16+11=43n=60;//即十进制数3x16+12=60P1=m+n;//P1=103=01100111B,结果P1.3、P1.4、P1.7口的灯被点亮P0=n-m;//P0=17=00010001B,结果P0.0、P0.4的灯被熄灭}*实例8:用P0、P1口显示乘法运算结果#include<reg51.h>//包含单片机寄存器的头文件voidmain(void){unsignedcharm,n;unsignedints;m=64;n=71;s=mn;//s=6471=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17256+192=H3161616+H21616+H116+H0//两边同除以256,可得17+192/256=H316+H2+(H116+H0)/256//因此,高8位16进制数H316+H2必然等于17,即4544除以256的商//低8位16进制数H116+H0必然等于192,即4544除以256的余数P1=s/256;//高8位送P1口,P1=17=11H=00010001B,P1.0和P1.4口灭,其余亮}*实例9:用P1、P0口显示除法运算结果#include<reg51.h>//包含单片机寄存器的头文件voidmain(void){P1=36/5;//求整数P0=((36%5)10)/5;//求小数while(1);//无限循环防止程序“跑飞”}*实例10:用自增运算控制P0口8位LED流水花样#include<reg51.h>//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void){unsignedinti;for(i=0;i<20000;i++);}/函数功能:主函数/voidmain(void){unsignedchari;for(i=0;i<255;i++)//注意i的值不能超过255 {P0=i;//将i的值送P0口delay();//调用延时函数}}*实例11:用P0口显示逻辑"与"运算结果#include<reg51.h>//包含单片机寄存器的头文件voidmain(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1);//设置无限循环,防止程序“跑飞”}*实例12:用P0口显示条件运算结果#include<reg51.h>//包含单片机寄存器的头文件voidmain(void){P0=(8>4)8:4;//将条件运算结果送P0口,P0=8=00001000Bwhile(1);//设置无限循环,防止程序“跑飞”}*实例13:用P0口显示按位"异或"运算结果#include<reg51.h>//包含单片机寄存器的头文件voidmain(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=00001000Bwhile(1);//设置无限循环,防止程序“跑飞”}*实例16:用P0显示左移运算结果#include<reg51.h>//包含单片机寄存器的头文件voidmain(void){;//无限循环,防止程序“跑飞”}*实例17:"万能逻辑电路"实验#include<reg51.h>//包含单片机寄存器的头文件sbitF=P1^4;//将F位定义为P1.4sbitX=P1^5;//将X位定义为P1.5sbitY=P1^6;//将Y位定义为P1.6sbitZ=P1^7;//将Z位定义为P1.7voidmain(void){while(1){F=((~X)&Y)|Z;//将逻辑运算结果赋给F;}}*实例18:用右移运算流水点亮P1口8位LED#include<reg51.h>//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void){unsignedintn;for(n=0;n<30000;n++);}/函数功能:主函数/voidmain(void){unsignedchari;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>//包含单片机寄存器的头文件sbitS1=P1^4;//将S1位定义为P1.4sbitS2=P1^5;//将S2位定义为P1.5/函数功能:主函数/voidmain(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>//包含单片机寄存器的头文件sbitS1=P1^4;//将S1位定义为P1.4/函数功能:延时一段时间/voiddelay(void){unsignedintn;for(n=0;n<10000;n++);}/函数功能:主函数/voidmain(void){unsignedchari;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)//使用多分支选择语句{}*实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h>//包含单片机寄存器的头文件sbitsound=P3^7;//将sound 位定义为P3.7/函数功能:延时形成1600Hz音频/voiddelay1600(void){unsignedcharn;for(n=0;n<100;n++);}/函数功能:延时形成800Hz音频/voiddelay800(void){unsignedcharn;for(n=0;n<200;n++);}/函数功能:主函数/voidmain(void){unsignedinti;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(3100200=60000μs)/voiddelay60ms(void){unsignedcharm,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/函数功能:主函数/voidmain(void){unsignedchari;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(3100200=60000μs)/voiddelay60ms(void){unsignedcharm,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/函数功能:主函数/voidmain(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(3100200=60000μs)/voiddelay60ms(void){unsignedcharm,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/函数功能:主函数/voidmain(void){unsignedchari;unsignedcharcodeTab[]={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(3200250=150000μs=150ms/voiddelay150ms(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/voidmain(void){unsignedcharstr[]={"Now,Temperatureis:"};//将字符串赋给字符型全部元素赋值unsignedchari;while(1){i=0;//将i初始化为0,从第一个元素开始显示while(str[i]!='\0')//只要没有显示到结束标志'\0'{P0=str[i];//将第i个字符送到P0口显示delay150ms();//调用150ms延时函数i++;//指向下一个待显字符}}}*实例26:用P0口显示指针运算结果#include<reg51.h>voidmain(void){unsignedcharp1,p2;//定义无符号字符型指针变量p1,p2unsignedchari,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=00101000B,结果P0.3、P0.5引脚LED熄灭,其余点亮while(1);//无限循环,防止程序“跑飞”}*实例27:用指针数组控制P0口8位LED流水点亮#include<reg51.h>/函数功能:延时约150ms(3200250=150000μs=150msvoiddelay150ms(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/voidmain(void){unsignedcharcodeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsignedcharp[]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],&T ab[6],&Tab[7]};unsignedchari;//定义无符号字符型数据while(1){for(i=0;i<8;i++){P0=p[i];delay150ms();}}*实例28:用数组的指针控制P0口8位LED流水点亮#include<reg51.h>/函数功能:延时约150ms(3200250=150000μs=150ms/voiddelay150ms(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/voidmain(void){unsignedchari;unsignedcharTab[]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xB F,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,0x DB,0xE7,0xBD,0xDB};//流水灯控制码unsignedcharp;//定义无符号字符型指针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>/函数功能:计算两个无符号整数的和/unsignedintsum(inta,intb){unsignedints;s=a+b;return(s);}/函数功能:主函数/voidmain(void){unsignedz;z=sum(2008,2009);P1=z/256;//取得z的高8位P0=z%256;//取得z的低8位while(1);}*实例30:用有参函数控制P0口8位LED流水速度#include<reg51.h>/函数功能:延时一段时间/voiddelay(unsignedcharx){unsignedcharm,n;for(m=0;m<x;m++)for(n=0;n<200;n++);}/函数功能:主函数/voidmain(void){unsignedchari;unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++)//共8个流水灯控制码{P0=Tab[i];delay(100);//延时约60ms,(3100200=60000μs)} //慢速流水点亮LEDfor(i=0;i<8;i++)//共8个流水灯控制码{P0=Tab[i];delay(250);//延时约150ms,(3250200=150000μs)} }}*实例31:用数组作函数参数控制流水花样#include<reg51.h>/函数功能:延时约150ms/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水点亮P0口8位LED/voidled_flow(unsignedchara[8]){unsignedchari;for(i=0;i<8;i++){P0=a[i];delay();}}/函数功能:主函数/voidmain(void){unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码led_flow(Tab);}*实例32:用指针作函数参数控制P0口8位LED流水点亮#include<reg51.h> /函数功能:延时约150ms/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水点亮P0口8位LED/voidled_flow(unsignedcharp)//形参为无符号字符型指针{unsignedchari;while(1){i=0;//将i置为0,指向数组第一个元素while((p+i)!='\0')//只要没有指向数组的结束标志{P0=(p+i);//取的指针所指变量(数组元素)的值,送P0口delay();//调用延时函数i++;//指向下一个数组元素}}}/函数功能:主函数/voidmain(void){unsignedcharcodeTab[]={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};//流水灯控制码unsignedcharpointer;pointer=Tab;led_flow(pointer);}*实例33:用函数型指针控制P1口灯花样#include<reg51.h>//包含51单片机寄存器定义的头文件unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量/函数功能:延时约150ms/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:流水灯左移/voidled_flow(void){unsignedchari;for(i=0;i<8;i++)//8位控制码{P0=Tab[i];delay();}}/函数功能:主函数/voidmain(void)void(p)(void);//定义函数型指针,所指函数无参数,无返回值p=led_flow;//将函数的入口地址赋给函数型指针pwhile(1)(p)();//通过函数的指针p调用函数led_flow()}*实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h>//包含51单片机寄存器定义的头文件unsignedcharcodestr1[]="TemperatureistestedbyDS18B20";//C语言中,字符串是作为字符数组来处理的unsignedcharcodestr2[]="Nowtemperatureis:";//所以,字符串的名字就是字符串的首地址unsignedcharcodestr3[]="TheSystermisdesignedbyZhangSan"; unsignedcharcodestr4[]="Thedateis2008-9-30";unsignedcharp[]={str1,str2,str3,str4};//定义p[4]为指向4个字符串的字符型指针数组/函数功能:延时约150ms/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);/函数功能:流水点亮P0口8位LED/voidled_display(unsignedcharx[])//形参必须为指针数组{unsignedchari,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++;//指向下一个元素}}}/函数功能:主函数/voidmain(void){unsignedchari;while(1){for(i=0;i<4;i++)led_display(p);//将指针数组名作实际参数传递}*实例35:字符函数ctype.h应用举例#include<reg51.h>//包含51单片机寄存器定义的头文件#include<ctype.h> voidmain(void){while(1){P3=isalpha('_')0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0}}*实例36:内部函数intrins.h应用举例#include<reg51.h>//包含51单片机寄存器定义的头文件#include<intrins.h>//包含函数isalpha()声明的头文件/函数功能:延时约150ms/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/voidmain(void)while(1){P3=_crol_(P3,1);//将P3的二进制位循环左移1位后再赋给P3delay();//调用延时函数}}*实例37:标准函数stdlib.h应用举例#include<reg51.h>//包含51单片机寄存器定义的头文件#include<stdlib.h>//包含函数isalpha()声明的头文件/函数功能:延时约150ms/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/函数功能:主函数/voidmain(void){unsignedchari;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()声明的头文件voidmain(void) {unsignedcharstr1[]="Now,Thetemperatureis:";unsignedcharstr2[]="Now,Thetemperatureis36Centgrade:";unsignedchari ;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单片机寄存器定义的头文件#defineF(a,b)(a)+(a)(b)/256+(b)//带参数的宏定义,a和b为形参voidmain(void){unsignedchari,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>voidmain(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单片机寄存器定义的头文件#defineMAX100//将MAX宏定义为字符串100voidmain(void){#ifMAX>80//如果字符串100大于80P3=0xf0;//P3口低四位LED点亮#elseP3=0x0f;//否则,P3口高四位LED点亮#endif//结束本次编译}/中断、定时器中断、定时器中断、定时器中断、定时器/*实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h>//包含51单片机寄存器定义的头文件/函数功能:主函数/voidmain(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单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.7引脚/函数功能:主函数/voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x10;//使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound;//将P3.7引脚输出电平取反TH1=(65536-921)/256;//定时器T0的高8位赋初值TL1=(65536-921)%256;//定时器T0的高8位赋初值}}*实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h>//包含51单片机寄存器定义的头文件sbitS=P3^4;//将S位定义为P3.4引脚/函数功能:主函数/voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x02;//使用定时器T0的模式2TH0=256-156;//定时器T0的高8位赋初值TL0=256-156;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待查询{while(TF0==0)//如果未计满就等待{if(S==0)//按键S按下接地,电平为0P1=TL0;//计数器TL0加1后送P1口显示}TF0=0;//计数器溢出后,将TF0清0}}*实例45:用定时器T0的中断控制1位LED闪烁#include<reg51.h>//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚/函数功能:主函数/voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式2TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待中断;}/函数功能:定时器T0的中断服务程序/voidTime0(void)interrupt1using0//“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单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚unsignedcharCountor;//设置全局变量,储存定时器T0中断次数/函数功能:主函数/voidmain(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的中断服务程序/voidTime0(void)interrupt1using0//“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单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚sbitD2=P2^1;//将D2位定义为P2.1引脚unsignedcharCountor1;//设置全局变量,储存定时器T1中断次数unsignedcharCountor2;//设置全局变量,储存定时器T1中断次数/函数功能:主函数/voidmain(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的中断服务程序/voidTime1(void)interrupt3using0//“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单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.7引脚/函数功能:主函数/voidmain(void){EA=1;//开总中断ET1=1;//定时器T1中断允许TMOD=0x10;//TMOD=0001000B,使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1while(1)//无限循环等待中断;}/函数功能:定时器T1的中断服务程序/voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数{sound=~sound;TH1=(65536-921)/256;//定时器T1的高8位重新赋初值TL1=(65536-921)%256;//定时器T1的高8位重新赋初值}*实例49:用定时器T0的中断实现"渴望"主题曲的播放#include<reg51.h>//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.7unsignedintC;//储存定时器的定时常数//以下是C调低音的音频宏定义#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz//以下是C调中音的音频宏定义#definedao523//将“dao”宏定义为中音“1”的频率523Hz#definere587//将“re”宏定义为中音“2”的频率587Hz#definemi659//将“mi”宏定义为中音“3”的频率659Hz#definefa698//将“fa”宏定义为中音“4”的频率698Hz#definesao784//将“sao”宏定义为中音“5”的频率784Hz#definela880//将“la”宏定义为中音“6”的频率880Hz#definexi987//将“xi”宏定义为中音“7”的频率523H//以下是C调高音的音频宏定义#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz#defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz#defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz/函数功能:1个延时单位,延时200ms/voiddelay(){unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/函数功能:主函数/voidmain(void){unsignedchari,j;//以下是《渴望》片头曲的一段简谱unsignedintcodef[]={re,mi,re,dao,l_la,dao,l_la,//每行对应一小节音符l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,0xff};//以0xff作为音符的结束标志//以下是简谱中每个音符的节拍//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位unsignedcharcodeJP[]={4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10};EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x00;//使用定时器T0的模式1(13位计数器)while(1)//无限循环{i=0;//从第1个音符f[0]开始播放while(f[i]!=0xff)//只要没有读到结束标志就继续播放{C=460830/f[i];TH0=(8192-C)/32;//可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32;//可证明这是13位计数器TL0低5位的赋初值方法TR0=1;//启动定时器T0for(j=0;j<JP[i];j++)//控制节拍数delay();//延时1个节拍单位TR0=0;//关闭定时器T0i++;//播放下一个音符}}}/函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波/voidTime0(void)interrupt1using1{sound=!sound;//将P3.7引脚输出电平取反,形成方波TH0=(8192-C)/32;//可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32;//可证明这是13位计数器TL0低5位的赋初值方法} *实例50-1:输出50个矩形脉冲#include<reg51.h>//包含51单片机寄存器定义的头文件sbitu=P1^4;//将u位定义为P1.4/函数功能:延时约30ms(3100100=30000μs=30m/voiddelay30ms(void){unsignedcharm,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}/函数功能:主函数/voidmain(void){unsignedchari;。
实例:单片机在家用电器中的应用
(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℃。 ② 利用功能键分别控制温度设定、速冻设定、冷藏室及冷冻室 温度设定等。
35个单片机设计应用实例
图 4.2.2
void main(void) { while(1) { if(K1==0) { L1=0; //灯亮 } else { L1=1; //灯灭 } } }
3. 多路开关状态指示
1. 实验任务
如图 4.3.1 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4, P1.4-P1.7 接了四个开关 K1-K4,编程将开关的状态反映到发光二极管上。 (开关闭合,对应的灯亮,开关断开,对应的灯灭)。
因此在按键按下的时候图482要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉一般情况下我们可以采用电容来滤除掉这些干扰信号但实际上会增加硬件成本及硬件电路的体积这是我们不希望总得有个办法解决这个问题因此我们可以采用软件滤波的方法去除这些干扰信号一般情况下一个按键按下的时候总是在按下的时刻存在着一定的干扰信号按下之后就基本上进入了稳定的状态
(2. 输出控制
根据开关的状态,由发光二极管 L1-L4 来指示,我们可以用 SETB P1.X 和 CLR P1.X 指令来完成,也可以采用 MOV P1,#1111XXXXB 方法一次指示。
5. 程序框图
<![endif]-->
读 P1 口数据到 ACC 中
ACC 内容右移 4 次 ACC 内容与 F0H 相或 ACC 内容送入 P1 口
void main(void) { while(1) { L1=0; delay02s();
L1=1; delay02s(); } }
2. 模拟开关灯 1. 实验任务
如图 4.2.1 所示,监视开关 K1(接在 P3.0 端口上),用发光二极管 L1(接 在单片机 P1.0 端口上)显示开关状态,如果开关合上,L1 亮,开关打开, L1 熄灭。 2. 电路原理图
单片机应用实例20个
单片机应用实例20个1. 温湿度监测系统单片机可以通过温湿度传感器实时检测环境的温湿度,并将数据显示在LCD屏幕上,提供参考用于对环境进行调节。
2. 微波炉控制单片机可以用于微波炉的控制,通过控制微波的加热时间和强度,实现食物的快速加热或解冻。
3. 灯光控制系统单片机可以通过光敏电阻感应环境光照强度,并控制灯光的开关和亮度,实现智能化的照明控制。
4. 电子秤单片机可以通过称重传感器检测物体的重量,并将重量数据通过LCD屏幕显示出来,广泛应用于商业和家庭领域。
5. 遥控器单片机可以通过接收红外信号,实现对电视、空调、音响等家用电器的遥控操作,提高生活的便利性。
6. 数码相机单片机可以用于数码相机的图像处理和功能控制,实现拍摄、存储和显示图片的功能。
7. 电子钟单片机可以通过RTC芯片实时获取时间,并通过数码管或LCD 屏幕显示时间,告诉人们准确的时间。
8. 智能车单片机可以作为智能车的大脑,通过传感器获取车辆的位置、速度和周围环境信息,并进行路线规划和行驶控制。
9. 温控系统单片机可以通过温度传感器检测环境的温度,并通过控制加热或制冷设备来实现温度的自动调节。
10. 电子组合锁单片机可以用于电子锁的控制,通过密码输入和验证,实现对门锁的开关控制。
11. 电子琴单片机可以用于电子琴的音乐合成和控制,通过按键触发不同音符的发声,实现曲目演奏。
12. 红外避障小车单片机可以通过红外传感器检测前方障碍物的距离,并控制小车的转向和速度,实现自动避障。
13. 室内温度控制单片机可以通过温度传感器检测室内温度,并通过控制空调或暖气设备来实现室内温度的控制。
14. 电子警报器单片机可以通过声音传感器检测环境的声音强度,并触发警报器的报警,用于室内安全保护。
15. 电子表格单片机可以用于开发简单的电子表格应用,实现数据输入、计算和显示的功能,广泛应用于办公场合。
16. 数字电视机顶盒单片机可以用于数字电视机顶盒的信号处理、解码和显示,实现高清电视节目的播放和录制功能。
51单片机技术与应用系统开发案例精选
51单片机技术与应用系统开发案例精选随着科技的不断进步和发展,单片机技术已经在各个领域得到了广泛的应用。
单片机技术作为嵌入式系统的核心,具有体积小、功耗低、成本低等特点,因此在自动化控制、电子产品、通信设备等领域都有着重要的应用价值。
本文将从多个案例出发,介绍一些51单片机技术的应用系统开发案例,以期帮助读者更好地了解单片机技术的应用和发展。
1. 智能家居系统智能家居系统是当今物联网技术中的热门应用之一,而单片机技术在智能家居系统中扮演着重要的角色。
通过使用51单片机,可以实现家庭灯光、空调、窗帘等设备的远程控制,从而提高家居的智能化水平。
通过单片机技术,还可以实现家庭安防系统的监控和报警功能,保障家庭成员的安全。
2. 工业控制系统在工业领域,单片机技术也有着广泛的应用。
在自动化生产线上,通过单片机可以实现对设备运行状态的实时监测和控制,提高生产效率和产品质量。
单片机技术还可以应用于温度、湿度、压力等参数的采集和控制,为工业生产提供可靠的技术支持。
3. 智能交通系统随着城市交通的不断发展以及车辆数量的持续增加,智能交通系统的需求也日益凸显。
通过单片机技术,可以实现智能交通信号灯的控制、车辆导航系统的优化等功能,提高交通系统的智能化水平,减少交通拥堵和交通事故的发生。
4. 医疗器械在医疗器械领域,单片机技术应用也十分广泛。
通过单片机可以实现医疗设备的精准控制和监测,比如体温计、血压计、心电图仪等设备,都可以通过单片机实现对生理参数的准确测量和分析,为临床诊断提供可靠的数据支持。
5. 智能手环智能手环作为一种智能可穿戴设备,通过内置的传感器和单片机芯片,可以实现对用户的健康数据进行实时监测和分析,比如步数、心率、睡眠质量等。
通过单片机技术,可以实现智能手环与手机的蓝牙通信,将用户的健康数据同步到手机App上,为用户提供科学的健康管理方案。
通过以上案例的介绍,我们可以看出,51单片机技术在各个领域都有着重要的应用价值,为各行业的发展提供了强大的技术支持。
单片机应用实例大荟萃,精巧制作让你爱不释手!
单片机+手机,实现PM2.5检测仪功能,低成本更便捷
高速/低功耗/超强抗干扰的新一代8051单片机——STC12C5A60S2单片机最小系统开发板资料
四位单片机液晶显示密码锁,存包系统密码锁设计
STC12C2052AD单片机主控的无线单路可编程遥控带数码管延时模块
基于51单片机的智能电热水器
单片机应用实例大荟萃,精巧制作让你爱不释手!
单片机由运算器、控制器、存储器、输入输出设备构成。单片机作为计算机发展的一个重要分支领域,根据发展情况,单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。这里,小编将为大家整理汇合各种各样通过使用51单片机制作的案例,一起来学习吧!
更多电路>>
毕业设计-基于51单片机的智能药盒(51源代码,原理图,PCB,相关资料)
基于单片机的指纹管理系统设计/AS608、FPM10A指纹模块兼容。课程、课程毕业设计(有实物制作STC单片机多功能迷你时钟
单片机双路可编程温度控制板电路资料
LCD12864+51单片机打造音乐频谱显示制作资料分享
单片机开发案例
单片机开发案例在现代科技的浪潮中,单片机以其强大的功能和广泛的应用领域,成为了电子工程师们手中的得力工具。
从智能家居到工业自动化,从医疗设备到消费电子,单片机的身影无处不在。
下面,让我们一起来深入了解几个单片机开发的案例。
案例一:智能温度控制系统在工业生产中,对温度的精确控制至关重要。
为了实现这一目标,我们基于单片机开发了一套智能温度控制系统。
首先,我们选用了一款性能稳定、功能强大的单片机,如 STM32系列。
它具有丰富的外设资源和较高的运算速度,能够满足系统的实时性要求。
温度传感器采用了高精度的热敏电阻或热电偶,将温度变化转化为电信号。
这些电信号经过放大、滤波等处理后,输入到单片机的模拟数字转换器(ADC)中,单片机对转换后的数字信号进行处理和计算,得到当前的温度值。
根据设定的温度范围,单片机通过控制继电器或可控硅等器件,来调节加热或冷却设备的工作状态。
例如,当温度低于下限值时,单片机控制加热设备开启;当温度高于上限值时,控制冷却设备启动。
为了实现人机交互,我们还配备了液晶显示屏(LCD)和按键。
通过显示屏可以实时显示当前温度和设定的温度范围,按键则用于设置温度上下限等参数。
在软件方面,我们采用了 C 语言进行编程。
通过合理的算法和控制逻辑,实现了温度的精确控制和稳定运行。
同时,还加入了故障检测和报警功能,当传感器故障或温度异常时,系统能够及时发出警报,提醒工作人员进行处理。
案例二:智能家居灯光控制系统随着人们生活水平的提高,对家居智能化的需求也日益增长。
智能家居灯光控制系统就是其中的一个重要应用。
在这个系统中,我们选用了低功耗的单片机,如 Arduino 系列。
它具有简单易用、成本低廉的特点,非常适合智能家居应用。
灯光控制采用了智能灯泡或 LED 灯带,通过蓝牙或 WiFi 模块与单片机进行通信。
用户可以通过手机 APP 或语音指令,向单片机发送控制信号。
单片机接收到控制信号后,解析并执行相应的操作。
c51单片机编程应用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"写入AT24C02再读出送P1口显示 112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 117实例87:对I2C总线上挂接多个AT24C02的读写操作 124实例88:基于AT24C02的多机通信读取程序 129实例88:基于AT24C02的多机通信写入程序 133实例90:DS18B20温度检测及其液晶显示 144实例91:将数据"0xaa"写入X5045再读出送P1口显示 153实例92:将流水灯控制码写入X5045并读出送P1口显示 157实例93:对SPI总线上挂接多个X5045的读写操作 161实例94:基于ADC0832的数字电压表 165实例95:用DAC0832产生锯齿波电压 171实例96:用P1口显示红外遥控器的按键值 171实例97:用红外遥控器控制继电器 174实例98:基于DS1302的日历时钟 177实例99:单片机数据发送程序 185实例100:电机转速表设计 186模拟霍尔脉冲 192/********************************************** **************函数的使用和熟悉*************** yes******************************************** ****///实例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~65535for(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=11000000B,P3.1,P3.6,P3.7口灭,其余亮}//实例11:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5)*10)/5; //求小数while(1); //无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#include<reg51.h> //包含单片机寄存器的头文件/****************************************************** 函数功能:延时一段时间******************************************************/ void delay(void){unsigned int i;for(i=0;i<20000;i++);}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0口delay(); //调用延时函数}}//实例13:用P0口显示逻辑"与"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}//实例14:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}//实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}//实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}//实例18:用右移运算流水点亮P1口8位LED #include<reg51.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0delay(); //调用延时函数}}}//实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4 /*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1 i=1;}switch(i) //使用多分支选择语句{case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LED P0=0xff;}}}//实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件sbit sound=P3^7; //将sound位定义为P3.7/****************************************函数功能:延时形成1600Hz音频****************************************/void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/****************************************函数功能:延时形成800Hz音频****************************************/void delay800(void){unsigned char n;for(n=0;n<200;n++);}/**************************************** 函数功能:主函数****************************************/ void main(void){unsigned int i;while(1){for(i=0;i<830;i++){sound=0; //P3.7输出低电平delay1600();sound=1; //P3.7输出高电平delay1600();}for(i=0;i<200;i++){sound=0; //P3.7输出低电平delay800();sound=1; //P3.7输出高电平delay800();}}}//实例22:用while语句控制LED #include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;while(1) //无限循环{i=0; //将i初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体{P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}//实例23:用do-while语句控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/**************************************** 函数功能:主函数****************************************/ void main(void){do{P0=0xfe; //第一个LED亮delay60ms();P0=0xfd; //第二个LED亮delay60ms();P0=0xfb; //第三个LED亮delay60ms();P0=0xf7; //第四个LED亮delay60ms();P0=0xef; //第五个LED亮delay60ms();P0=0xdf; //第六个LED亮delay60ms();delay60ms();P0=0xbf; //第七个LED亮delay60ms();P0=0x7f; //第八个LED亮delay60ms();}while(1); //无限循环,使8位LED循环流水点亮}//实例24:用字符型数组控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;unsigned char 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,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 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];。
51单片机设计实例
51单片机设计实例
1. 电子钟:使用51单片机设计一个数字时钟,可以显示小时和分钟,并能够设置闹钟功能。
2. 温度监控器:使用51单片机设计一个温度监控器,可以实时监测当前温度,并根据设定的阈值发出警报。
3. 电子秤:使用51单片机设计一个电子秤,可以精确测量物体的重量,并显示在LCD屏幕上。
4. 电子门锁:使用51单片机设计一个电子门锁系统,可以使用密码或者指纹进行解锁,并记录进出门的时间。
5. 智能家居控制器:使用51单片机设计一个智能家居控制器,可以通过手机APP控制家庭中的灯光、空调、窗帘等设备。
6. 智能车:使用51单片机设计一个智能车,可以根据传感器检测到的环境信息进行自主导航和避障。
7. 电子琴:使用51单片机设计一个简单的电子琴,可以通过按键发出不同的音符。
8. 电子游戏机:使用51单片机设计一个简单的电子游戏机,可以玩一些简单的游戏如打砖块、赛车等。
9. 电子宠物:使用51单片机设计一个虚拟宠物,可以通过按钮和
显示屏与宠物进行互动,喂食、玩耍等。
10. 无线遥控器:使用51单片机设计一个无线遥控器,可以控制电视、空调、音响等家电设备。
51单片机100例程序设计(可编辑)
51单片机100例程序设计100例程序设计范例汇总第一章 4【实例1】使用累加器进行简单加法运算:4【实例2】使用B寄存器进行简单乘法运算: 4【实例3】通过设置RS1,RS0选择工作寄存器区1: 4【实例4】使用数据指针DPTR访问外部数据数据存储器: 4 【实例5】使用程序计数器PC查表: 4【实例6】if语句实例: 4【实例7】switch-case语句实例: 4【实例8】for语句实例: 4【实例9】while语句实例: 5【实例10】do…while语句实例: 5【实例11】语句形式调用实例:5【实例12】表达式形式调用实例: 5【实例13】以函数的参数形式调用实例: 5【实例14】函数的声明实例: 5【实例15】函数递归调用的简单实例:5【实例16】数组的实例:6【实例17】指针的实例:6【实例18】数组与指针实例: 6【实例19】P1口控制直流电动机实例 6第二章8【实例20】用74LS165实现串口扩展并行输入口8【实例21】用74LS164实现串口扩展并行输出口10【实例22】P0 I/O扩展并行输入口 12【实例23】P0 I/O扩展并行输出口 12【实例24】用8243扩展I/O端口12【实例25】用8255A扩展I/O口14【实例26】用8155扩展I/O口19第三章26【实例29】与AT24系列EEPROM接口及驱动程序26【实例30】EEPROM X5045 接口及驱动程序30【实例31】与铁电存储器接口及驱动程序33【实例32】与双口RAM存储器接口及应用实例35【实例33】与NANDFLASH(K9F5608)接口及驱动程序35 第四章43【实例34】独立键盘控制43【实例35】矩阵式键盘控制44【实例36】改进型I/O端口键盘46【实例37】PS/2键盘的控制 49【实例38】LED显示53【实例39】段数码管(HD7929)显示实例54 【实例40】16×2字符型液晶显示实例 55【实例41】点阵型液晶显示实例61【实例42】LCD显示图片实例63第五章70【实例43】简易电子琴的设计70【实例44】基于MCS-51单片机的四路抢答器71 【实例45】电子调光灯的制作76【实例46】数码管时钟的制作81【实例47】LCD时钟的制作96【实例48】数字化语音存储与回放103【实例49】电子标签设计112第六章120【实例50】指纹识别模块121【实例51】数字温度传感器121第七章124【实例53】超声波测距124【实例54】数字气压计125【实例55】基于单片机的电压表设计132【实例56】基于单片机的称重显示仪表设计133 【实例57】基于单片机的车轮测速系统136第八章138【实例58】电源切换控制138【实例59】步进电机控制140【实例60】单片机控制自动门系统141【实例61】控制微型打印机144【实例62】单片机控制的EPSON微型打印头144 【实例63】简易智能电动车145【实例64】洗衣机控制器149第九章152【实例65】串行A/D转换152【实例66】并行A/D转换153【实例67】模拟比较器实现A/D转换154【实例68】串行D/A转换155【实例69】并行电压型D/A转换156【实例70】并行电流型D/A转换156【实例71】接口的A/D转换157【实例72】接口的D/A转换161第十章164【实例73】单片机间双机通信164【实例74】单片机间多机通信方法之一166【实例75】单片机间多机通信方法之二171【实例76】 PC与单片机通信176【实例77】红外通信接口178【实例79】单片机实现PWM信号输出180【实例80】实现基于单片机的低频信号发生器182 【实例81】软件滤波方法183【实例82】FSK信号解码接收186【实例83】单片机浮点数运算实现187【实例84】神经网络在单片机中的实现192【实例85】信号数据的FFT变换194第十二章198【实例86】总线接口的软件实现198【实例87】SPI总线接口的软件实现200【实例88】1-WIRE总线接口的软件实现205 【实例89】单片机外挂CAN总线接口207【实例90】单片机外挂USB总线接口210【实例91】单片机实现以太网接口214【实例92】单片机控制GPRS传输221【实例93】单片机实现TCP/IP协议223第十三章229【实例94】读写U盘229【实例95】非接触IC卡读写234【实例96】SD卡读写 238【实例97】高精度实时时钟芯片的应用242【实例98】智能手机充电器设计247【实例99】单片机控制门禁系统248第一章【实例1】使用累加器进行简单加法运算:MOV A,#02H ;A←2ADD A,#06H ;A←A+06H【实例2】使用B寄存器进行简单乘法运算:MOV A,#02H ; A←2MOV B,#06H ; B←6MUL AB ; BA←A*B 6*2【实例3】通过设置RS1,RS0选择工作寄存器区1:CLR PSW.4 ; PSW.4←0SETB PSW.5 ; PSW.5←1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOV DPTR, #data16 ; DPTR←data16MOVX A, @ DPTR ; A← DPTRMOVX @ DPTR, A ; DPTR ←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC← PC +1 ,A← A + PC 【实例6】if语句实例:void mainint a,b,c,min;printf "\n please input three number:" ;scanf "%d%d%d ",&a,&b,&c ;if a b&&a c printf "min %d\n",a ;else if b a&&b c printf "min %d\n",b ;else if c a&&c c printf "min %d\n",c ;else printf "There at least two numbers are equal\n" ;【实例7】switch-case语句实例:void mainint num; printf "input one number:" ;scanf "%d",& num ;switch numcase 1: printf "num %d\n", num ;break;case 2: printf "num %d\n", num ;break;case 3: printf "num %d\n", num ;break;case 4: printf "num %d\n", num ;break;default: printf "The number is out of the range\n", num ;【实例8】for语句实例:void mainfor int a 10;n 0;a --printf "%d",a ;【实例9】while语句实例:void mainint i 0;while i 10 i++;【实例10】do…while语句实例:void mainint i 0;do i++;while i 10 ;【实例11】语句形式调用实例:void mainint i 0; while i 10 i++; … … Sum ; /*函数调用*/【实例12】表达式形式调用实例:void mainint a,b,i 0; while i 10 i++; … …i 4*Sum a,b ; /*函数调用*/【实例13】以函数的参数形式调用实例:void mainint a,b,c,i 0; while i 10 i++; … …i c,Sum a,b ; /*函数调用*/【实例14】函数的声明实例:void mainint int x,int y ; /*函数的声明*/ int a,b,c,i 0; while i 10 i++; … … i c,Sum a,b ; /*函数调用*/【实例15】函数递归调用的简单实例:void funint a 1, result,i;for i 0;i 10;i a+I;result fun ; /*函数调用*/return result;【实例16】数组的实例:void mainchar num[3] [3] ’’,’#’,’’ , ’#’,’’,’#’ , ’’,’#’,’’ ; /*定义多维数组*/int i 0,j 0;for ;i 3;i++for ;j 3;j++ printf “%c”,num[i][j] ;printf “/n” ;【实例17】指针的实例:void mainint a 3,*p;p &a; /*将变量a的地址赋值给指针变量p*/printf “%d,%d”,a,*p ; /*输出二者的数值进行对比*/【实例18】数组与指针实例:void mainint i 3,num[3] 1,2,3 ,*p;p num; /*将数组num[]的地址赋值给指针变量p*/result p,3 ; /*函数调用,计算数组的最大值*/【实例19】P1口控制直流电动机实例sfr p1 0x90;sbit p10 p1^0;sbit p11 p1^1;void mainint i, m;int j 100;int k 20;// 正快转for i 0; i 100; i++P10 1;for j 0; j 50; j++m 0;P10 0;for j 0; j 10; j++//正慢转for i 0; i 100; i++P10 1;for j 0; j 10; j++ m 0p10 0;for j 0; j 50; j++ m 0// 负快转for i 0; i 100; i++p11 1;for j 0; j 50; j++p11 0;for j 0; j 10; j++m 0;// 负慢转for i 0; i 100; i++p11 1;for j 0;j 10;j++m 0;p11 0for j 0; j 50; j++ m 0;第二章【实例20】用74LS165实现串口扩展并行输入口(1)函数声明管脚定义//#includesbit LOAD P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init//// 函数名称:UART_init// 功能说明:串口初始化,设定串口工作在方式0 //void UART_init voidSCON 0x10;//设串行口方式0,允许接收,启动接收过程ES 0;//禁止串口中断(3)数据接收函数PA//// 函数名称:PA// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//unsigned char PA voidunsigned char PA_data;LOAD 0;//当P1.7输出低电平,74LS165将并行数据装入寄存器//当中LOAD 1;//当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init ;//74LS165工作在时钟控制下的串行移位状态while RI 0 ;//循环等待RI 0;PA_data SBUF;return PA_data;//返回并行输入的数据(1)函数声明管脚定义//#includesbit a7 ACC^7;sbit simuseri_CLK P1^6;//用P1^6模拟串口时钟sbit simuseri_DATA P1^5;//用P1^5模拟串口数据sbit drive74165_LD P1^7;//用P1^7控制SH/ 管脚(2)数据输入函数in_simuseri//// 函数名称:in_simuseri// 输入参数:无// 输出参数:data_buf// 功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到// 高位// 保存到data_buf//unsigned char in_simuseri voidunsigned char i;unsigned char data_buf;i 8;doACC ACC 1;for ;simuseri_CLK 0; ;a7 simuseri_DATA;for ;simuseri_CLK 1; ;while --i! 0 ;simuseri_CLK 0;data_buf ACC;return data_buf ;(3)数据输出函数PAs//// 函数名称:PAs// 输入参数:无// 输出参数:PAs _buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//unsigned char PAs voidunsigned char PAs_buf;drive74165_LD 0;drive74165_LD 1;PAs_buf in_simuseri ;return PAs_buf ;【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。
单片机应用系统设计实例
一、控制原理: 虚线表示允许水位变化的上下限。 水塔由电机带动水泵供水,单片 机控制电机转动以达到对水位控 制的目的。 ①当水位上升,达到上限时,因水导电,B、C棒连通+5V。b、c均为“1”,应停止电机和水泵的工作,不再供水; ②当水位降到下限时,B、C棒都不能与A棒导电。 b、c均为“0”,应启动电机,带动水泵工作,给水塔供水; ③当水位处于上下限之间时,B与A棒导通。 b为“1”, c为“0”,无论怎样都应维持原有的工作状态。
输出控制电路
输出高电平:双向可控硅导通,电热丝通电; 输出低电平:双向可控硅截止,电热丝断电。 8155 I/O端口的负载能力不足以驱动光电耦合器的发光 二极管,用1413作为功放。 控制算法:对于温度控制系统,系统具有大热惯性,系统采用脉冲宽度调制的控制方法。 也可用PID算法、Smith算法、Dalin算法等。
温度信号输入通道
MC14433是双积分3 ½ 位的A/D转换器:采用扫描的方法, 输出3 ½ 位的BCD码,从0000~1999共2000个数码。内部有时钟源(振荡器)。 VR:基准电压输入线,其值为200mV或2V; VX:被测电压输入线,最大为199.9mV或1.999V。 DS4~DS1:分别是个、十、百、千位的选通脉冲输出线; Q3~Q0 :BCD码数据输出线,动态地输出千位、百位、十位、个位值。 即DS4有效时,Q3~Q0表示的是个位值(0~9);依次类推。 EOC与INT0相接使得MC14433每次A/D结束后,同时启动下一次转换,使其处于 连续的A/D转换中,并使得单片机在中断服务程序中读入该次转换结果。
单击此处添加大标题内容
硬件:时钟电路片 软件:片内定时器 在单片机计时的过程中,每一次秒加1,都与规定的作 息时间比较,如比较相等就进行电铃或扩音设备的开关控制。 本系统共有4项控制内容:接通电铃和断开电铃; 接通和断开扩音设备。 由P1口输出控制码进行控制,其控制码定义为: 接通电铃:0FEH 断开电铃:0FDH 接通扩音设备:7FH 断开扩音设备:0BFH
单片机应用实例
单片机应用实例单片机是一种基于微处理器的微型电脑,被广泛应用于各种电子设备中。
它具有体积小、功耗低、性能稳定的特点,被广泛用于家电控制、汽车电子、医疗设备、工业控制等领域。
本文将介绍几个单片机应用实例,帮助读者更好地了解单片机的应用和开发。
**智能家居控制系统**随着物联网技术的发展,智能家居控制系统成为了人们生活中的一个热门话题。
单片机作为智能家居控制系统的核心控制器,可以实现对家中照明、温度、窗帘等设备的远程控制。
通过编程控制单片机,可以实现定时开关灯、自动调节室内温度等功能。
通过与传感器、无线通信模块等外围设备的配合,单片机可以实现对家庭环境的智能监测和控制,为用户提供更加便利和舒适的家居体验。
**智能交通信号控制系统**交通拥堵和交通事故是城市交通管理面临的重要问题,而智能交通信号控制系统的应用可以有效缓解这些问题。
单片机可以被用于控制交通信号灯的显示,根据实时交通流量和车辆行驶速度来实现灯光的智能调控。
通过与车辆检测设备、摄像头等设备的连接,单片机可以实现对交通状况的实时监测和数据分析,从而为交通管理部门提供数据支持,改善城市交通流畅度,降低交通事故的发生率。
**医疗设备控制系统**单片机在医疗设备中也有着广泛的应用,例如可穿戴健康监测设备、患者监护仪等。
通过单片机的控制,可以实现对医疗设备的数据采集、分析和展示。
单片机可以与云平台连接,将患者的监测数据上传至云端,为医护人员提供实时的患者健康状况信息,以便及时调整治疗方案。
单片机还可以实现对医疗设备的远程控制,提高了医疗设备的便捷性和灵活性。
**工业自动化控制系统**在工业生产中,单片机被广泛应用于自动化控制系统中。
单片机可以控制生产线上的各种设备,实现产品的自动装配、检测和包装。
通过编程,单片机可以根据传感器的反馈信号,实现对生产线的智能调控,提高生产效率和产品质量。
单片机还可以实现对设备的远程监控和故障诊断,提高了设备的可靠性和维护效率。
单片机典型应用举例
单片机典型应用举例
单片机典型应用举例
1、数显表:数字显示表是一种具备数字显示功能的电子显示仪表,它采用单片机技术,实现对量测模拟量的显示,记录和控制功能。
它能支持多种测量单位,并有多种显示模式,可进行数据保护、调整和记录。
它结构简单,操作简便,制作成本低,功能强大,广泛地应用在工业控制等领域。
2、门禁系统:这是一款采用单片机技术制作的门禁系统,它能根据用户的授权操作来开启和关闭门,具有防盗功能。
它可以根据不同的安全等级,采用多种授权方式操作,如密码、刷卡、按键等,具有较高的安全性能。
3、车载电子系统:车载电子系统是一种整合了单片机技术和分布式伺服控制技术的电子系统,用于控制汽车的各个子系统,具有良好的安全性能和可靠性。
它可以提供多种功能服务,如汽车行驶记录、电子导航、自动刹车等,可以提高汽车的安全性、动力性能和便捷性。
- 1 -。
单片机35个实例2
13.动态数码显示技术1.实验任务如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。
2.电路原理图图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.动态扫描方法动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。
(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+DPTRMOV 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);temp=a|b;for(a=4;a>0;a--)for(b=248;b>0;b--);}}}14.4×4矩阵式键盘识别技术1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
几个单片机应用实例
几个单片机应用实例例一:一个液晶显示的数字式电脑温度计液晶显示器分很多种类,按显示方式可分为段式,行点阵式和全点阵式。
段式与数码管类似,行点阵式一般是英文字符,全点阵式可显示任何信息,如汉字、图形、图表等。
这里我们介绍一种八段式四位LCD显示器,该显示器内置驱动器,串行数据传送,使用非常方便。
原理图如下图:下图是长沙太阳人科技开发有限公司生产的4位带串行接口的液晶显示模块SMS0403 的外部引线简图:有关该模块的具体参数,请查看该公司网站。
此例中使用的温度传感器为美国DALLAS公司生产的单总线式数字温度传感器。
该传感器本站有其详细的资料可供下载。
此例稍加改动,即可做成温控器。
下载驱动该模块的源程序LCD.PLM例2: LED显示电脑电子钟本例介绍一种用LED制作的电脑电子钟(电脑万年历)。
原理图如下图所示:上图中,CPU选用的是AT89C2051,时钟芯片选用的是Dallas公司的DS1302, 温度传感器选用的是Dallas公司的数字温度传感器DS1820,显示驱动芯片选用的是德州仪器公司的TPIC6B595,也可选用与其兼容的芯片NC595或国产的AMT9595。
整个电子钟用两个键来调节时间和日期。
一个是位选键,一个是数字调节键。
按一下位选键,头两位数字开始闪动,进入设定调节状态,此时按数字调节键,当前闪动位的数字就可改变。
全部参数调节完后,五秒钟内没有任何键按下,则数字停止闪动,退出设定调节状态。
源程序清单如下(无温度显示程序):start:do;$include(reg51.dcl)declare (sclk,io,rst) bit at (0b3h) register; /* p33,p34,p35 */ declare (command,data,n,temp1,num) byte;declare a(9) byte;declare ab(6) byte;declare aco(11) byte constant (0fdh,60h,0dah,0f2h,66h,0b6h,0beh,0e0h,0feh,0f6h,00h);declare week(11) byte constant (0edh,028h,0dch,7ch,39h,75h,0f5h,2ch,0fdh,7dh,00h);declare da literally 'p15',clk literally 'p16',ale literally 'p17', mk literally 'p11',sk literally 'p12';clear:procedure;sclk=0;io=0;rst=0;end clear;send1302:procedure(comm);declare (i,comm) byte;do i=0 to 7;comm=scr(comm,1);io=cy;call time(1);sclk=0;call time(1);sclk=1;end;end send1302;wbyt1:procedure(com,dat);/*字节写过程*/ declare (com,dat) byte;call clear;rst=1;call send1302(com);call send1302(dat);call clear;end wbyt1;wbyt8:procedure;/*时钟多字节突发模式写过程*/ declare j byte;call clear;a(7)=A(6);a(6)=a(0);rst=1;call send1302(command);do j=1 to 8;call send1302(a(j));end;call clear;end wbyt8;RBYT1:PROCEDURE;DECLARE I BYTE;CALL CLEAR;RST=1;call send1302(0c1h);IO=1;DO I=0 TO 7;SCLK=1;SCLK=0;CY=IO;N=SCR(N,1);END;A(8)=N;CALL CLEAR;END RBYT1;send595:procedure;declare k byte;do k=0 to 7;data=scr(data,1);da=cy;clk=1;clk=0;end;end send595;send595_1:procedure;declare k byte;do k=0 to 7;data=scr(data,1);da1=cy;clk1=1;clk1=0;end;end send595_1;rb1:procedure(abc,j);DECLARE (I,j,abc) BYTE;CALL CLEAR;RST=1;call send1302(abc);IO=1;DO I=0 TO 7;SCLK=1;SCLK=0;CY=IO;N=SCR(N,1);END;ab(j)=N;ab(j)=dec(ab(j));CALL CLEAR;end rb1;rbyt6:procedure;call rb1(0f1h,0);call rb1(0f3h,1);call rb1(0f5h,2);call rb1(0f7h,3);call rb1(0f9h,4);call rb1(0fbh,5);call rb1(0fdh,6);end rbyt6;wbyt6:procedure;call wbyt1(8eh,0); /* write enable */ call wbyt1(0f0h,ab(0));call wbyt1(0f2h,ab(1));call wbyt1(0f4h,ab(2));call wbyt1(0f6h,ab(3));call wbyt1(0f8h,ab(4));call wbyt1(0fah,ab(5));call wbyt1(0fch,ab(6));call wbyt1(8eh,80h); /* write disable */end wbyt6;rbyt8:procedure;/*时钟多字节突发模式读过程*/ declare (i,j) byte;call clear;rst=1;call send1302(command);io=1;do j=1 to 8;do i=0 to 7;sclk=1;call time(1);sclk=0;cy=io;n=scr(n,1);end;a(j)=n;end;call clear;a(0)=a(6);a(6)=A(7);a(0)=a(0) and 0fh;if a(0)>6 then a(0)=0;CALL RBYT1;if (a(1)=0 and a(2)=0 and a(3)=0) thendo;do num=0 to 35;call time(250);end;temp1=1;end;if temp1=1 thendo;temp1=0;ab(4)=ab(4)+1;if ab(4)>99h thendo;ab(4)=0;ab(5)=ab(5)+1;if ab(5)>99h then ab(5)=0;end;call wbyt6;end;end rbyt8;display:procedure; /*jieya,yima,fasong*/ declare (i,n,m) byte;n=a(0) and 0fh; /* send week */data=week(n);call send595;n=a(4); /* send date */n=n and 0fh;data=aco(n);call send595;n=a(4);n=shr(n,4);data=aco(n);call send595;do i=1 to 3; /* send second,minute,hour */ n=a(i);n=n and 0fh;data=aco(n);call send595;n=a(i);n=shr(n,4);data=aco(n);call send595;end;do i=5 to 6; /* send month,year */n=a(i);n=n and 0fh;data=aco(n);call send595;n=a(i);n=shr(n,4);data=aco(n);call send595;end;n=a(8); /* send 19 or 20 */n=n and 0fh;data=aco(n);call send595;n=a(8);n=shr(n,4);data=aco(n);call send595;do m=0 to 5;n=ab(m);n=n and 0fh;data=aco(n);call send595_1;n=ab(m);n=shr(n,4);data=aco(n);call send595_1;end;ale=0;ale=1;end display;beginset:procedure;a(0)=06h;a(1)=58h;a(2)=59h;a(3)=23h;a(4)=30h;a(5)=06h;a(6)=97h;a(7)=00;a(8)=19h; /* set date/time (1997,7,1,8:00:00,week 3) */ call wbyt1(8eh,0); /* write enable*/call wbyt1(80h,00h);/* start colock */call wbyt1(0beh,0abh);/*两个二极管与8K电阻串联充电*/ command=0beh; /* write colock/date */call wbyt8;call wbyt1(0c0h,a(8));call wbyt1(8eh,80h); /* set write protect bit */end beginset;key:procedure;declare (i,time1,k1,tem) byte;call time(100);k1=7;time1=30;if mk=0 thendo;do while time1>0;week: if k1=0 thendo;do i=0 to 5;/* call hz(a(0)); */end;do i=0 to 3;/* call hz0; */end;end;tem=a(k1);if k1=7 then tem=a(8);a(k1)=0aah;if k1=7 then a(8)=0aah;call display;call time(254);call time (254);a(k1)=tem;if k1=7 then a(8)=tem;call display;call time(254);call time(254);call time(254);time1=time1-1;if mk=0 thendo;call time(100); /*MOD KEY PROCESS*/TIME1=30;IF MK=0 THENDO;k1=k1-1;DO WHILE K1=0FFH;K1=7;END;END;end;IF SK=0 THENDO;CALL TIME(100); /*SET KEY PROCESS*/ TIME1=30;IF SK=0 THENDO;tem=tem+1;tem=dec(tem);DO CASE K1;DO WHILE tem=7;/*week*/tem=0;END;DO WHILE tem=60H;/*scond*/tem=0;END;DO WHILE tem=60H;/*minute*/tem=0;END;DO WHILE tem=24H;/*hour*/tem=0;END;DO WHILE tem=32H;/*date*/tem=1;END;DO WHILE tem=13H;/*month*/tem=1;END;DO while tem=100h; /* YEAR */tem=00;END;DO WHILE TEM>=21H;tem=19H;END;END;A(K1)=tem;if k1=7 then a(8)=tem;END;END;END;END;end key;main$program:mk=1;sk=1;temp1=0;num=0;p32=1;if sk=0 then call beginset;clk=0;da=0;ale=1;loop:do while mk=1 ;if a(0)>6 then a(0)=0;command=0bfh;call rbyt8;call display;do while mk=0;call key;call wbyt1(8eh,0);command=0beh;call wbyt8;call wbyt1(0C0H,A(8));call wbyt1(8eh,80h);end;end;goto loop;end start;例3:一个6位LED、4个按键的显示板按键和显示是单片机系统的基本输入输出部件,下面介绍一个由74LS164驱动的6位数码管和4个按键组成的通用仪表面板。
单片机应用的实例
单片机应用的实例
单片机是一种在单个芯片上集成了处理器、存储器和输入/输出设备的微型计算机。
它适用于许多不同的应用领域,下面我们将为您提供一些单片机应用的实例。
1. 家电控制:单片机可以用来控制家电产品,如电视、空调、冰箱等。
通过单片机控制,这些设备可以自动化操作,提高使用效率和便利性。
例如,空调可以根据室内温度自动调节温度和风速,冰箱可以根据食物种类自动调整温度和湿度等。
2. 汽车电子:单片机在汽车电子中的应用越来越广泛,可以用来控制发动机、制动系统、燃油管理、车辆安全系统等。
例如,单片机可以控制发动机的点火和燃油喷射,以提高燃油利用率和减少排放;还可以控制制动系统,使车辆更加安全稳定。
3. 工控系统:单片机在工业自动化中的应用非常广泛,可以用来控制生产线、机械设备、仓储物流等。
例如,单片机可以控制流水线上的机器人进行自动化操控,减少工作人员的负担和提高生产效率。
4. 智能家居:单片机可以应用于智能家居领域,如智能门锁、智能灯光、智能窗帘等。
例如,单片机可以控制智能门锁的开关状态,通过传感器检测进出人员,实现智能化管理。
5. 医疗设备:单片机在医疗设备中的应用非常广泛,可以用来控制医疗设备,如血糖仪、血压计、体温计等。
例如,单片机可以控制血糖仪的检测和报告,根据用户的血糖水平提供治疗建议。
总之,单片机的应用非常广泛,在许多不同的领域都有重要的应用,如家电控制、汽车电子、工控系统、智能家居和医疗设备等。
通过单片机,我们可以实现自动化、智能化和便利化的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.闪烁灯1.实验任务如图 4.1.1 所示:在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。
2.3.电路原理图系统板上硬件连线图 4.1.1把“单片机系统”区域中的 P1.0 端口用导线连接到“八路发光二极管指示模块”区域中的 L1 端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图 4.1.1 所示的石英晶体为 12MHz,因此,1 个机器周期为 1 微秒机器周期微秒MOV R6,#20 2 个机器周期 2D1: MOV R7,#248 2 个机器周期DJNZ R7,$ 2 个机器周期DJNZ R6,D1 2 个机器周期22×2482×20=402+2×248=498 20×49810002因此,上面的延时程序时间为 10.002ms。
由以上可知,当 R6=10、R7=248 时,延时 5ms,R6=20、R7=248 时,延时 10ms,以此为基本的计时单位。
如本实验要求 0.2 秒=200ms,10ms×R5=200ms,则 R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图 1 所示,当 P1.0 端口输出高电平,即 P1.0=1 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.0=0 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。
5.程序框图如图4.1.2所示图 4.1.2 6.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时 0.2 秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C 语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时 0.2 秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}2.模拟开关灯1.实验任务如图 4.2.1 所示,监视开关 K1(接在 P3.0 端口上),用发光二极管 L1(接在单片机 P1.0 端口上)显示开关状态,如果开关合上,L1 亮,开关打开,L1 熄灭。
2.电路原理图图 4.2.13.系统板上硬件连线(1).把“单片机系统”区域中的 P1.0 端口用导线连接到“八路发光二极管指示模块”区域中的 L1 端口上;(2).把“单片机系统”区域中的 P3.0 端口用导线连接到“四路拨动开关”区域中的K1 端口上;4.程序设计内容(1).开关状态的检测过程单片机对开关状态的检测相对于单片机来说,是从单片机的 P3.0 端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关 K1 拨上去,即输入高电平,相当开关断开,当拨动开关 K1 拨下去,即输入低电平,相当开关闭合。
单片机可以采用 JB BIT,REL 或者是 JNB BIT,REL 指令来完成对开关状态的检测即可。
(2).输出控制如图 3 所示,当 P1.0 端口输出高电平,即 P1.0=1 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.0=0时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。
5.程序框图图 4.2.26.汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND7. C 语言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //灯亮}else{L1=1; //灯灭}}}3.多路开关状态指示1.实验任务如图 4.3.1 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4,P1.4-P1.7 接了四个开关 K1-K4,编程将开关的状态反映到发光二极管上。
(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2.电路原理图图 4.3.13.系统板上硬件连线(1.把“单片机系统”区域中的 P1.0-P1.3 用导线连接到“八路发光二极管指示模块”区域中的 L1-L4 端口上;(2.把“单片机系统”区域中的 P1.4-P1.7 用导线连接到“四路拨动开关”区域中的 K1-K4 端口上;4.程序设计内容(1.开关状态检测对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用 JB P1.X,REL或 JNB P1.X,REL 指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用 MOV A,P1 指令一次把 P1 端口的状态全部读入,然后取高 4 位的状态来指示。
(2.输出控制根据开关的状态,由发光二极管 L1-L4 来指示,我们可以用 SETB P1.X 和 CLR P1.X 指令来完成,也可以采用 MOV P1,#1111XXXXB 方法一次指示。
5.程序框图读P1口数据到A CC中A CC内容右移4次A CC内容与F0H相或A CC内容送入P1口<![endif]-->图 4.3.26.方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7.方法一(C 语言源程序)#include <AT89X51.H> unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8.方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9.方法二(C 语言源程序)#include <AT89X51.H>void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}4.广告灯的左移右移1.实验任务做单一灯的左移右移,硬件电路如图 4.4.1 所示,八个发光二极管 L1-L8 分别接在单片机的 P1.0-P1.7 接口上,输出“0”时,发光二极管亮,开始时 P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0 亮,重复循环。
2.电路原理图图 4.4.13.系统板上硬件连线把“单片机系统”区域中的 P1.0-P1.7 用 8 芯排线连接到“八路发光二极管指示模块”区域中的 L1-L8 端口上,要求:P1.0 对应着 L1,P1.1 对应着 L2,……,P1.7 对应着 L8。
4.程序设计内容我们可以运用输出端口指令 MOV P1,A 或 MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。
每次送出的数据是不同,具体的数据如下表 1 所示:P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明L8 L7 L6 L5 L4 L3 L2 L11 1 1 1 1 1 1 0 L1 亮1 1 1 1 1 1 0 1 L2 亮1 1 1 1 1 0 1 1 L3 亮1 1 1 1 0 1 1 1 L4 亮1 1 1 0 1 1 1 1 L5 亮1 1 0 1 1 1 1 1 L6 亮1 0 1 1 1 1 1 1 L7 亮0 1 1 1 1 1 1 1 L8 亮表15.程序框图图 4.4.26.汇编源程序ORG 0START: MOV R2,#8MOV A,#0FEHSETB CLOOP: MOV P1,ALCALL DELAYRLC ADJNZ R2,LOOPMOV R2,#8LOOP1: MOV P1,ALCALL DELAYRRC ADJNZ R2,LOOP1LJMP STARTDELAY: MOV R5,#20 ;D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C 语言源程序#include <AT89X51.H>unsigned char i;unsigned char temp;unsigned char a,b;void delay(void){unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void){while(1){temp=0xfe;P1=temp;delay();for(i=1;i<8;i++){a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++){a=temp>>i;b=temp<<(8-i);P1=a|b;delay();}}}5.广告灯(利用取表方式)1.实验任务利用取表的方法,使端口 P1 做单一灯的变化:左移 2 次,右移 2 次,闪烁 2 次(延时的时间 0.2 秒)。