基于51单片机数字频率计的设计与实现

news2024/11/27 6:16:25

目录

第一章 系统原理与总体设计

1.1系统组成

1.2系统原理

1.3测量原理

1.4频率测量与总体设计

第二章 硬件电路设计

2.1硬件电路框图

2.2数字频率计原理图

2.3硬件电路设计

第三章 软件程序设计

3.1程序流程图

3.2显示电路程序设计

3.3 定时器初始化程序设计

3.4中断控制程序设计

3.5 主函数程序设计

第四章 测试与总结

5.1系统测试

5.2 总结

参考文献

  • 系统原理与总体设计

1.1系统组成

频率计由单片机AT89C51、信号预处理电路、测量数据显示电路和系统软件所组成.其中信号预处理电路包含待测信号放大、波形变换、波形整形和分频电路。系统软件包括测量初始化模块、显示模块、信号频率测量模块、量程自动转换模块、信号周期测量模块、信号定时器中断服务模块、二进制数到BcD码转换模块。

1.2系统原理

频率的定义是:单位时间(1s)内周期信号的变化次数。若在一定时间间隔T内测得周期信号的重复变化次数为N,则其频率为N,f=N/T。本频率计的设计以AT89C51单片机为核心,利用它内部的定时/计数器完成待测信号频率、周期的测量。单片机AT89C51内部具有2个16位定时/计数器,定时/计数器的工作可以由编程来实现定时、计数和产生计数溢出中断要求的功能.在构成为定时器时每个机器周期加1(使用12删z时钟时,每1US加1),这样以机器周期为基准可以用来测量时间间隔。在构成计数器时.在相应的外部引脚发生从1到0的跳变时计数器加1,这样在计数闸门的控制下可以用来测量待测信号的频率。外部输入每个机器周期被采样一次,这样检测一次从1到0的跳变至少需要2个机器周期(24个振荡周期),所以最大计数速率为时钟频率的1/24(使用12删z时钟时,最大计数速率为500肼z)。定时/计数器的工作由相应的运行控制位TR控制。当TR置1,定时/计数器开始计数;当TR清0,停止计数。

1.3测量原理

提出的利用单片机中的定时器和计数器来直接测频的方法原理很简单.将被测信号通过一个定时闸门加 到计数器进行计数的方法 ,如果闸门打开的时问为 T,计数器得到的计数值为 N,则被测频率为 f=N/T.当T为某确定值时(通常取 1s),则有fl=N1,而f=N.测量频率的原理如图 1所示.从图 1.1可见 ,N的数值愈大 ,测量误差愈小 ,反之亦然.如果想要提高测量精度降低测量误差可通过增大T的方法来降低测量误差。

 

图1.1 频率测量原理

1.4频率测量与总体设计

被测信号先进入信号放大电路进行放大,再被送到波形整形电路整形 ,把被测的正弦波或者三角波整形为方波。利用单片机的计数器和定时器 的功能对被测信号进行计数.编写相应的程序可以使单片机自动调节测量的量程 ,并把测出的频率数据送到显示电路显示.频率计的总体设计如图1.2所示。

 

图1.2 频率计总体设计流程图

  • 硬件电路设计

2.1硬件电路框图

 

图2.1 硬件电路框图

2.2数字频率计原理图

频率计主要由单片机控制系统、主闸门、计数器以及LCD显示等几部组成,电路如图2.2所示,其中闸门采用电路由74HC08与门构成,电路中电阻R2和二极管D2、D3主要是起到对74HC08输入输出端的保护作用。防止过压或者接错导致器件损坏。

 

图2.2 数字频率计原理图

51单片机内部有两个16位的定时/计数器T1,因此采用T0进行对被测信号进行计数.由T1产生lS的闸门采样时间T,这样既可完成采样时间T又得到计数N,从而实现频率的

测量。但是5l单片机在12MHz晶振时To最高输入为0.5MHz,频率范围受到限制,因此在哟之前加入一级74HC393预分频电路,输入信号经过闸门进入74HC393进行256分频计数,大于256溢出的部分由单片机的仰负责计数,每次测量前单片机要将74HC393以及TH0、TL0清零。 因此,设计数字频率计原理仿真图如图2.3所示。

 

图2.3  数字频率计仿真原理图

2.3硬件电路设计

  1. 单片机最小系统电路设计
  • 单片机芯片电路:

 

图2.4  主芯片电路

对于89C52单片机未经100分频的待测信号接入单片机的定时/计数器0(P3.4),100分频后的待测信号接入单片机的定时/计数器1(P3.5),单片机的P1.0、P1.1、P1.2分别接1602LCD液晶显示模块的片选控制、读写控制和使能控制,而P0.0-P0.7则控制1602芯片的数据引脚D0-D7。另外值得一提的是,此为52单片机,其定时器2具有16位自动重装载中断功能,即为“interrupt 5”中断方式。

  • 复位电路设计

复位电路的用途:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。单片机复位电路如下图2.5所示

 

图2.5 复位电路

51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。

开机的时候为什么会复位:在电路图中,电容的的大小是10uF,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在单片机启动的0.1S内,电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。

按键按下的时候为什么会复位:在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。

  • 晶振电路设计

晶振电路:晶振是晶体振荡器的简称 在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络 电工学上这个网络有两个谐振点 以频率的高低分其中较低的频率是串联谐振 较高的频率是并联谐振 由于晶体自身的特性致使这两个频率的距离相当的接近 在这个极窄的频率范围内 晶振等效为一个电感 所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路 这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄 所以即使其他元件的参数变化很大 这个振荡器的频率也不会有很大的变化。

晶振有一个重要的参数 那就是负载电容值 选择与负载电容值相等的并联电容 就可以得到晶振标称的谐振频率。

一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振 再有两个电容分别接到晶振的两端 每个电容的另一端再接到地 这两个电容串联的容量值就应该等于负载电容 请注意一般IC的引脚都有等效输入电容。

一般的晶振的负载电容为15pF或12.5pF 如果再考虑元件引脚的等效输入电容 则两个22pF的电容构成晶振的振荡电路就是比较好的选择。 

晶振是给单片机提供工作信号脉冲的 这个脉冲就是单片机的工作速度 比如 12M晶振 单片机工作速度就是每秒12M 当然 单片机的工作频率是有范围的不能太大 一般24M就不上去了不然不稳定。晶振电路图如下图2.6所示;

 

图2.6 晶振电路

(2)信号处理电路设计

为了有效防止因信号过小而造成的检测障碍,在信号输入处采用了三极管共射放大电路,如图2.7所示。实际工作中,我们必须解决放大电路与信号源及放大电路与负载之间的耦合问题。一方面要求耦合电路能够传输交流的输入和输出信号,传输过程中的信号损耗尽可能小;另一方面又要求信号源,放大电路、负载之间的直流工作状态互补影响,即有“隔直”作用,电路的C1、C7就很好的解决了这个问题即固定偏置共射极放大器。集电极电压通过基极偏置电阻R2使晶体管Je正偏;同时拖过R3使Jc反偏,从而实现信号源放大。

 

图2.7 基于三极管共射放大电路的信号采集模块

(3)脉冲信号产生设计

脉冲产生模块采用74HC14实现了三次施密特触发并反相,从图2.8可以看出,正在上传…重新上传取消正在上传…重新上传取消来自信号采集模块的经过放大的信号从74HC14的1脚进入,经过1A→1Y、2A→2Y和3A→3Y三次施密特触发并反相最终将缓慢变化的输入信号转换成清晰、无抖动的信从6脚输出。

 

图2.8 74HC14管脚图

具体到每一个施密特触发反相器来说,其转移特性和输入输出波形关系如图2.9所示。

 

图2.9  74HC14单个施密特触发器转移特性和输入输出波形

通过Proteus,可以同时观察到有信号输入时74HC14的1脚、2脚、4脚和6脚上的波形仿真。如图2.10所示;

 

图2.10 输入信号通过74HC14转换为脉冲

(4)分频电路设计

 

图2.11 基于双4位十进制波纹计数器74HC390的分频模块

    74HC390具有有八个主从触发器和附加门以构成两个独立的4位计数器,其中每个计数器皆包含两个部分:“除2计数部分”和“除5计数部分”,每个计数器又有一个清除输入和一个时钟输入。它可以实现等于2 分频、5 分频乃至100 分频的任何累加倍数的周期长度,且可以连成十进制计数器或二-五进制计数器以分别实现两种进制的数值输出。由于每个计数级都有并行输出,所以系统定时信号可以获得输入计数频率的任何因子。

74HC390具有以下特点:

①A和B触发器都有独立的时钟

②每个计数器都有直接清除

③有效提高系统密度

④缓冲输出减小集电极转换的可能性

 

图2.12  74HC390单个计数器功能图

从74HC390的单个计数器功能图中可以看出,若从nCP0输入频率为f的时钟信号,则会在nQ0得到频率为f/2的信号;若从nCP1输入时钟信号,则会在nQ1、nQ2、nQ3得到按表2.13变化的组合信号。

 

2.13 时钟信号从nCP1输入时Q2:Q1:Q0真值表

由此展开设想:由于单片机可操作频率有限,若输入信号频率过大则单片机无法成功实现脉冲计数,因此需要使用74HC390进行分频,以100分频为宜(具体为200KHz以上信号采取100分频后再检测,200KHz或以下信号则检测未经100分频的原始信号)。采取的方法为:从表2.11中可以看出,若从nCP1输入频率为f的时钟信号,则会在nQ2处输出频率为f/5的脉冲信号,因此可进行如图1.5所示的连线方法,1CP1--1Q2→2CP1--2Q2→1CP0--1Q0→2CP0--2Q0,其中“→”代表芯片外部电气连接,“--”代表芯片内部功能连接,从而得到5×5×2×2=100分频,即若从1CP1输入一个频率为f的信号,则会从2Q0输出一个频率为f/100的分频信号。

  1. 显示电路设计

显示电路流程图如下图2.14所示:

 

图2.14 显示电路流程图

图2.15 显示电路图

 

2.16 1602液晶引脚排列和引脚功能说明

1602液晶显示芯片的功能:①没有信号输入时液晶显示“fre= Hz”②有信号输入时液晶显示单片机RAM中的全局变量“fre”的即时数值(最多显示8位,不显示无效的“0”,如若fre=123,则液晶显示“fre=123Hz”)。

  • 软件程序设计

3.1程序流程图

 

图3.1 系统软件设计程序流程图

   数字频率计使用的51单片机的定时计数器T0、T1分别被设置为计数方式和定时方式,闸门的打开与关闭以及数据的读取与计算均在定时器T1内完成,主程序中进行频率显示,

74HC393的计数输出引脚连接在单片机的P1口上,计数值N可通过P1口和THO、TLO值以及T0溢出次数Count计算后得到,51单片机的T0计数器是每计65536个数后溢出,而T0 计数器又是经过74HC393分频的,采样时间T为1s。系统程序通过中断实现定时和计数,T1进行定时 ,定时时间为 1s进行计数 ,11D中断溢出一次 ,TOcount加 1.当定时达到 1s时,停止 ,T1.最后计算相应的频率值。

3.2主函数程序设计

void main()

{

unsigned char i;

LCD_init();

timer_init();             //定时/计数器初始化



for(i = 0;i<4;i++)

{

  LCD_disp_char(i+0,1,character_1[i]);

}

while(1)

{

dis_num();         //显示

 delay_1s();

}  

}

主函数的主要任务就是进行各种初始化并开启无限循环检测输入信号频率值的变化并通过改变fre的值在LCD1602上表现出来(在无信号输入的情况下,初始化函数将LCD1602上显示的字符固定为“fre= Hz”)。主程序的流程图如下图3.2所示;

 

图3.2 主程序流程图

3.3 定时器初始化程序设计

void timer_init(void)      //定时/计数器初始化

{

TMOD=0x66;        //计数器0和计数器1工作工作方式2,自动重装初值



TH0=0;                    //计数器初值为0

TL0=0;

TR0=1;                    //计数器开始计数     

ET0=1;                    //打开计数器0中断   



TH1=0;                    //计数器初值为0

TL1=0;

TR1=1;                    //计数器开始计数     

ET1=1;                    //打开计数器1中断   



RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值,

RCAP2L=(65536-62500)%256; //TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。

TH2=RCAP2H;       //12M晶振下每次中断62.5ms(1s=1000ms=62.5ms×16)

TL2=RCAP2L;

ET2=1;                    //打开定时器2中断  

TR2=1;                    //定时器2开始计时  

EA=1;                     //开总中断   

}

由表3.3可知,TMOD=0x66=0110 0110B表明TR0(计数器0)和TR1(计数器1)工作工作在方式2,即可自动重装8位初值。

此外,52单片机具有定时器2,它的功能比定时/计数器0和定时/计数器1要强大很多。它具有自动重装16位初值的功能,初值存储在16 位计数存储器RCAP2H (高8位)和RCAP2L(低8位)中,只要程序初始化的时候给RCAP2H和RCAP2L赋值,在中断产生时将会自动执行TH2=RCAP2H,TL2=RCAP2L。这个中断操作在C语言中被编排为52单片机特有的方式5,即“interrupt 5”。

通过计算得到若要在晶振为12MHz的条件下每62.5ms进行一次计时中断需要在RCAP2H: RCAP2L装载初值62500。选择62.5ms的原因是62.5ms×16=1000ms=1s,这样既可通过准确测量计算16个计时中断周期内在TR0和TR1上捕获了几个脉冲信息,即待测信号的频率值。

 表3.3 TMOD寄存器

3.4中断控制程序设计

中断程序实现定时与计数的功能.T1进行定时 ,定时时间为 1s进行计数 ,11D中断溢出一次 ,TOcount加 1.当定时达到 1s时,停止 ,T1.最后计算相应的频率值.设计中采用的是按键中断子程序 ,当按下测频按键后 ,程序开始执行中断命令 ,为了保证闸门时间为周期 T,设计中定时器的中断优先级必须高于按键中断的优先级。

void timer2(void) interrupt 5 //定时器2中断(62.5ms)

{

time++;

TF2=0;                    //定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零

if (time==16)             //定时1s时间到  

{

   time=0;                //计时清0

   EA=0;                  //关中断  

   fre=(long)count1*256+TL1;     //count*256强制转换成long型,否则将不产生进位 先判断分频后(计数器1)

   FLAG = 0;

  

   if(fre<2000)//如果不到200KHz则读取分频前(计数器0)频率(200K÷100=2000)

   {

    fre = (long)count*256+TL0;

FLAG = 1;          

   }

if(!FLAG)

{

fre = fre *100;//100分频

}   

   TL0=0;                 //清零计数器0计数     

   TH0=0;

   

   TL1=0;

   TH1=0;

   count=0;               //清零计数器0计数   

   count1=0;

   EA=1;                  //开中断     

}

}

//----------------------------------------------------------------

void timer0(void) interrupt 1 //计数器0中断(100分频前)  

{

count++;

}

//----------------------------------------------------------------

void timer1(void) interrupt 3 //计数器1中断(100分频后)

{

count1++;

}

通过变量time控制定时器2每16个62.5ms,即1s进行一次中断。进入中断后,考察来自TR1的脉冲计数值,“fre = (long)count*256+TL1;”的含义是:count为1s计时到时时TL1在此周期内重装初值的次数,即TR1的中断次数,将此值乘以256再加上定时器2中断瞬间TL1的值即为此周期内TR1捕获的脉冲的准确数量,需要注意的是,fre是long类型变量,故需将count强制临时转换成long类型,否则与256相乘后仍是8位的字节变量,造成错误。

若经过上述考察后发现fre的数值不到200KHz的100分频值即2000Hz,则根据尽量规避分频造成误差的原则,在单片机能处理的频率范围内进行操作,即使用TR0上捕获的1s内未分频原始脉冲信号到达的数量对fre进行赋值,方法及注意事项同上。

最后,清零一切TR0、TR1计数值并重新打开总中断,等待潜在的频率数值变化的出现。

 

图3.4定时器T1中断流程图

3.5 显示电路程序设计

①程序头文件

unsigned long int fre;

unsigned char time;

unsigned int count;

unsigned int count1;

sbit   LCD_RS=P1^0;   //片选信号

sbit   LCD_RW=P1^1;   //读写信号

sbit   LCD_E=P1^2;   //使能信号

#define LCD_DB     P0 //数据信号

unsigned char character[10]={0};//在屏幕上显示的字符串

unsigned char character_1[]={"fre= Hz"};

unsigned char FLAG = 0;

void LCD_init(void);//初始化函数

void LCD_write_command(unsigned char command);//写指令函数

void LCD_write_data(unsigned char dat);//写数据函数

void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)

void delay_n40us(unsigned int n);//延时函数

void timer_init();            //中断初始化函数

②函数设定

void LCD_write_command(unsigned char dat)  //写命令函数

{

LCD_DB=dat;

LCD_RS=0;//指令  

LCD_RW=0;//写入  

LCD_E=1; //使能  

LCD_E=0;

delay_n40us(1);//写命令延时   

}  



void LCD_write_data(unsigned char dat)   //写数据函数

{

LCD_DB=dat;

LCD_RS=1;//数据   

LCD_RW=0;//写入   

LCD_E=1;//使能  

LCD_E=0;

delay_n40us(1);  //写数据延时 

}

1602芯片的4号引脚为RS(数据/命令选择端,1数据寄存器,0指令寄存器),5号引脚为RW(读写选择端,1读,0写),6号引脚为EN(使能端,1允许读写,0禁止读写),因此调用LCD_write_command函数时,变量dat将作为指令信号输入而控制1602芯片,调用LCD_write_data函数时,变量dat将作为数据信号输入1602芯片。

void LCD_init(void)  //液晶初始化函数 

{

LCD_write_command(0x38);//设置8位格式,2行,5x7

LCD_write_command(0x38);//设置8位格式,2行,5x7

LCD_write_command(0x38);//设置8位格式,2行,5x7

LCD_write_command(0x0c);//整体显示,关光标,不闪烁 

LCD_write_command(0x06);//设定输入方式,增量不移位

LCD_write_command(0x01);//清除屏幕显示   

delay_n40us(100);//清屏延时 

}

首先需要说明的是执行三次LCD_write_command(0x38)的目的是让所有1602芯片都兼容。

进行功能设定时,指令格式如下:001 DL N F 00;DL=1时,数据长度为8位,DL=0时,数据长度为4位;N=1时显示双列字,N=0时显示单列字;F=1时显示5×10字形,F=0时显示5×7字形。本作品中采用8位数据格式,2行显示,5x7字符显示,故执行0011 1000B(0x38)指令。

进行显示器开关设定时,指令格式如下:0000 1DCB;D=1时,整体显示;C=1时,开启光标;B=1时,光标所在位置光标闪烁。本作品中采用关闭显示关光标不闪烁,故执行0000 1100B(0x0c)指令。

进行进入模式设定时,指令格式如下:0000 01 I/D S;I/D=1时,递增, I/D=0时,递减;S=1时,开启显示屏且整个屏移动;S=0时,屏幕不移动。本作品中采用增量不移位,故执行0000 0110B(0x06)指令。

清屏指令为0000 0001B(0x01)。

void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//显示一个字符

{

unsigned char address;

if(y==1)

         address=0x80+x;  //显示在第一排的时候的x的地址

else

         address=0xc0+x;  //显示在第二排的时候的x的地址

LCD_write_command(address);  //输入地址

LCD_write_data(dat);  //输入数据

}

void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//显示一个数字

{

unsigned char address;

if(y==1)

         address=0x80+x;  //显示在第一排的时候的x的地址

else

         address=0xc0+x;  //显示在第二排的时候的x的地址

LCD_write_command(address);  //输入地址

LCD_write_data(dat+48);  //输入数据

}

实现液晶芯片的功能②的函数。首先使用一个常规编程手法将全局变量fre8位数字分别赋值给数组character[0]- character[7]character[8]:character[9]则固定为“Hz”。在将数组character_1[]中的字符串“fre=”显示在1602液晶第一行的前四列的同时,作为虚拟光标的局部变量i的值变为3,接下来,通过逐位检查排除将i定位在fre的第一个不为零的数位上,此时8-i的数值即为fre的有效数字个数,有效数字即要显示在1602液晶上的数字,则从字符“=”的下一位即Ox84开始逐位将以上有效数字显示在液晶上,最后补上字符串“Hz”。

void dis_num(void)

{

unsigned char i=0,j=0,k=0;

LCD_write_command(0x01);//清除屏幕显示



character[0] = fre/10000000;

character[1] = fre/1000000%10;

character[2] = fre/100000%10;

character[3] = fre/10000%10;

character[4] = fre/1000%10;

character[5] = fre/100%10;

character[6] = fre/10%10;

character[7] = fre%10;

   character[8] = 'H';

character[9] = 'z';



for(i = 0;i<4;i++)  //显示fre=

{

  LCD_disp_char(i+0,1,character_1[i]);

}



for(i = 0;i<10;i++)  //判断第一个不为0的数

{

if(character[i]!=0)

break;

}



k = 8-i;



for(j = 0;j<k;j++)  //显示所有的数字

{

LCD_disp_num(4+j,1,character[i++]);

}



    for(i = 5;i<7;i++)  //显示Hz

{

  LCD_disp_char(j+4,1,character_1[i]);

j++;

}

}



  • 测试与总结

4.1系统测试

  1. 电路初始化如图5.1所示;

 

图4.1 系统电路初始化

  1. 锯齿波频率测试

 

图4.2 锯齿波频率测试

  1. 方波频率测试

 

图4.3 方波频率测试

  1. 正弦波频率测试

 

图4.4 正弦波频率测试

4.2 总结

本次课设的数字频率计的设计,结合硬件电路设计和软件程序设计,使得数字频率计能够正常工作,实现了频率的测量。

学习单片机课设有助于提高自己的动手能力,培养自己的解决问题的能力。在单片机课设过程中,掌握单片机基础知识,熟悉单片机的芯片及其特性,掌握其编程方法,掌握程序控制的基本原理,使自己能够运用单片机技术进行系统的设计。我们还要掌握电子元器件的基本知识,熟悉电子元器件的特性,熟悉电路的接线方法,使自己能够设计出符合要求的电路,实现系统的功能。这次单片机课程设计我使用的是AT89C52单片机芯片,对于当前智能电子仪器已经在当今生活中无处不在的情况下,尤其活跃于计算机领域中,我们更需要对单片机进行进一步的了解和掌握,以顺应时代的潮流,而目前祖国也需要大量的技术型人才,而我们这些二十一世纪的大学生将为以后对国家进行更大的贡献。

总之,通过此次课程设计的学习,让我巩固了学过的单片机知识,明白了自己的不足,让我明白我们不仅要学习理论知识,我们还要多参与实践,通过实践来巩固自己,与此同时,我还要感谢老师的耐心指导。

参考文献

  1. 张毅刚.《单片机原理及应用》(第三版)高等教育出版社
  2. 邓胡滨、陈梅、周洁、黄德昌. 《单片级原理与应用技术-基于keil c和 Proteus仿真》
  3. 张齐 朱宁西编著《单片机应用系统设计技术-基于C51的Proteus仿真》(第2版) 电子工业出版社;
  4. 林立 等编著《单片机原理及应用—基于Proteus和Keil C》电子工业出版社;
  5. 严敏.基于DS18B20电子温度计的设计与实现[J].宁波职业技术学院学报,2016,20(03):83-85.
  6. 吕萌,赵敏.基于DS18B20的单片机测温系统设计[J].中小企业管理与科技(中旬刊),2015(03):309.
  7. 金峰. 智能仪器设计基础. 清华大学出版社,2005.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MeetingService重构和ParticipantList性能优化实践

​ 一丶背景 1.1 现状 最初Rooms客户端只支持加入Rcv meeting这个meeting type&#xff0c;RcvMeetingStateService里写了一些加会的状态机转换和Audio, Video, Share相关的功能代码。后续有新的业务&#xff0c;需要增加支持Webinar, Sip等各种Meeting&#xff0c;MeetingS…

Linux Shell 实现一键部署ovirt4

ovirt 前言 oVirt是一个开源分布式虚拟化解决方案&#xff0c;旨在管理您的整个企业基础设施。oVirt使用可信的KVM管理程序&#xff0c;并基于其他几个社区项目构建&#xff0c;包括libvirt、Gluster、PatternFly和Ansible。 Ovirt仅支持系统Centos / Redhat ovirt download…

npm利用verdaccio工具发布到私有仓库的教程

文章目录 概要安装方式运行方式相关的配置淘宝源修改开发访问地址设置用户删除用户更换源设置发布当前包 概要 提示&#xff1a;用于将可复制和常用的方法打包发布 例如&#xff1a; 可以将我们的公共组件和工具类以及SDK等核心的代码发布到外网中&#xff0c;需要我们常见私…

小白到运维工程师自学之路 第三十五集 (MongoDB的基本使用)

一、概述 MongoDB是一个非关系型数据库管理系统&#xff0c;它使用文档模型存储数据。MongoDB中的文档类似于JSON对象&#xff0c;可以包含键值对和嵌套文档。MongoDB提供了强大的查询语言、聚合框架、索引和直接在数据存储中运行的计算。 MongoDB被广泛应用于许多领域&#x…

MySQL开启远程访问权限

默认情况下&#xff0c;MySQL只允许本地登录&#xff0c;即只能在安装MySQL环境所在的主机下访问。 但是在日常开发和使用中&#xff0c;我们经常需要访问远端服务器的数据库&#xff0c;此时就需要开启服务器端MySQL的远程连接权限。1、生成环境&#xff0c;连接MySQL 2、查看…

STM32单片机(六)TIM定时器 -> 第七节:TIM编码器接口

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

vue引入jszip下载多个图片并压缩下载

vue引入jszip下载多个图片并压缩下载 jszip官网地址 先进行jszip下载 npm install jszip然后废话不多说直接上代码 <template><div><button click"downloadImages">下载图片</button></div> </template><script> impo…

shell内置命令

目录 内置命令介绍内置命令列表alisa内置命令alias别名定义语法unalias 别名删除语法alias演示 echo内置命令echo命令介绍echo输出语法echo输出转义字符 read内置命令介绍语法options支持的参数示例1&#xff1a;多个变量赋值 exit内置命令介绍语法示例&#xff1a;Shell脚本文…

OPC AE server服务的实现

OPC AE server的实现 日前实现了OPC AE server&#xff0c;特此记录备查。 1、事件分三类&#xff0c;从下图可知每类都包含啥内容了&#xff0c;CONDITION看起来主要是一些越限&#xff0c;熟悉其它协议的朋友应该对这个不陌生&#xff0c;一般这种事件产生时&#xff0c;会…

通过Selenium实现Web自动化测试的研究

目录 前言&#xff1a; 1 自动化测试概念 1.2 自动化测试发展阶段 2 自动化测试工具Selenium简介 3 具体测试过程 4 总结 前言&#xff1a; Web自动化测试是Web应用程序测试的重要组成部分&#xff0c;它通过模拟实际用户行为&#xff0c;对Web应用程序进行自动化测试并…

chatgpt赋能python:Python拆包:提高编程效率的神器

Python拆包&#xff1a;提高编程效率的神器 在Python编程中&#xff0c;拆包&#xff08;unpacking&#xff09;是一项非常有用的技巧。它可以让你将一个可迭代对象&#xff08;iterable&#xff09;中的元素分离开来&#xff0c;赋值给多个变量。这个过程一般称为“解包”&am…

小白到运维工程师自学之路 第三十八集 (redis高可用集群)

一、概述 Redis高可用集群是一种分布式系统&#xff0c;它由多个Redis节点组成&#xff0c;可以提供高可用性和容错性。在Redis高可用集群中&#xff0c;每个节点都可以处理客户端请求&#xff0c;并且数据会在多个节点之间进行复制和同步&#xff0c;以确保数据的可靠性和一致…

Day_51-53kNN分类器

目录 Day_51&#xff1a;kNN分类器 一. 前言 二. 机器学习基本术语 三. kNN算法的原理 1. kNN算法的思想 2. kNN算法的具体实现过程 四. 代码实现 1. 导包 2. 参数初始化 3. 数据的导入 4. 数据的抽取 5. 对于测试集进行预测 6. 核心代码 Day_52&#xff1a;knn分类器&am…

LabVIEW开发微控制器控制的并行机器人的实时视觉图像处理

LabVIEW开发微控制器控制的并行机器人的实时视觉图像处理 通过相机视觉&#xff0c;以对目标物体的不同颜色进行分类&#xff0c;并与平行机器人一起拾取和放置物体。通过使用MATLAB Simulink模拟合适的机器人工作空间来研究使用相机的效率和机器人的准确性。机械臂以使用运动学…

OpenMMLab-AI实战营第二期——5-2. MMSegmentation代码课

文章目录 1. 自定义数据集1.0 整理数据集为特定格式1.1 持久化运行&#xff08;用文件定义&#xff09;1.2 运行时生效&#xff08;直接运行时定义一个class&#xff09;1.3 注意事项 2. 配置文件3. 运行训练和测试X. 其他语义分割数据集 视频链接&#xff1a;MMSegmentation代…

ThreadPoolExecutor源码

介绍 ThreadPoolExecutor 是 Java 中实现线程池的一个类&#xff0c;它是 ExecutorService 接口的一个实现类。线程池可以用来优化线程的使用&#xff0c;避免频繁地创建和销毁线程&#xff0c;以及限制并发线程的数量&#xff0c;从而提高应用程序的性能。 public class Thr…

读发布!设计与部署稳定的分布式系统(第2版)笔记06_用户

1. 系统的人类用户天生就具备进行创造性破坏的本事 1.1. 用户会消耗内存 1.2. 用户会做奇怪和随机的事情 1.2.1. fuzzing工具箱、基于属性的测试或模拟测试 1.3. 恶意用户总是存在的 1.3.1. 灾祸总会发生&#xff0c;坏人肯定存在 1.4. 用户会合伙对付你 2. 难伺候的用户…

【linux】opencv修改摄像头分辨率

起因 发现linux系统下调用opencv修改摄像头分辨率&#xff0c;一直修改不成功。 原本 正常在window下面读取摄像头数据是如下代码&#xff1a; # capture from web camcap cv2.VideoCapture(0)# set widthcap.set(3, 1280)# set heightcap.set(4, 720)while self._run_flag…

武职302303笔记-day01

这里写自定义目录标题 开发永和小票开发步骤1、对页面进行需求分析 使用CSS的方式 Order.html问题&#xff1a;html代码和css样式代码交织 idea开发后端程序使用chatGPT给我们打工QRCreate.java 开发永和小票 开发步骤 1、对页面进行需求分析 页面是很多文字组成&#xff0c;…

虹科分享丨如何保证我们的数据安全?|数据保护

一、数据安全 你可能已经正在寻找加密服务来帮助保护你的组织的数据&#xff0c;但如果你是一个不熟悉实践或管理数据的人员&#xff0c;"数据加密 "这个短语可能会感觉像技术术语或只是像一个模糊的概念&#xff0c;没有具体的解决方案。 但事实上&#xff0c;数据…