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个单片机设计应用实例

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个

单片机应用实例20个1. 温湿度监测系统单片机可以通过温湿度传感器实时检测环境的温湿度,并将数据显示在LCD屏幕上,提供参考用于对环境进行调节。

2. 微波炉控制单片机可以用于微波炉的控制,通过控制微波的加热时间和强度,实现食物的快速加热或解冻。

3. 灯光控制系统单片机可以通过光敏电阻感应环境光照强度,并控制灯光的开关和亮度,实现智能化的照明控制。

4. 电子秤单片机可以通过称重传感器检测物体的重量,并将重量数据通过LCD屏幕显示出来,广泛应用于商业和家庭领域。

5. 遥控器单片机可以通过接收红外信号,实现对电视、空调、音响等家用电器的遥控操作,提高生活的便利性。

6. 数码相机单片机可以用于数码相机的图像处理和功能控制,实现拍摄、存储和显示图片的功能。

7. 电子钟单片机可以通过RTC芯片实时获取时间,并通过数码管或LCD 屏幕显示时间,告诉人们准确的时间。

8. 智能车单片机可以作为智能车的大脑,通过传感器获取车辆的位置、速度和周围环境信息,并进行路线规划和行驶控制。

9. 温控系统单片机可以通过温度传感器检测环境的温度,并通过控制加热或制冷设备来实现温度的自动调节。

10. 电子组合锁单片机可以用于电子锁的控制,通过密码输入和验证,实现对门锁的开关控制。

11. 电子琴单片机可以用于电子琴的音乐合成和控制,通过按键触发不同音符的发声,实现曲目演奏。

12. 红外避障小车单片机可以通过红外传感器检测前方障碍物的距离,并控制小车的转向和速度,实现自动避障。

13. 室内温度控制单片机可以通过温度传感器检测室内温度,并通过控制空调或暖气设备来实现室内温度的控制。

14. 电子警报器单片机可以通过声音传感器检测环境的声音强度,并触发警报器的报警,用于室内安全保护。

15. 电子表格单片机可以用于开发简单的电子表格应用,实现数据输入、计算和显示的功能,广泛应用于办公场合。

16. 数字电视机顶盒单片机可以用于数字电视机顶盒的信号处理、解码和显示,实现高清电视节目的播放和录制功能。

51单片机技术与应用系统开发案例精选

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 或语音指令,向单片机发送控制信号。

单片机接收到控制信号后,解析并执行相应的操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 秒)。

相关文档
最新文档