单片机程序温度测量报警系统 求程序

本视频由声明原创。51单片机多路DS18B20温度测量程序
> 51单片机多路DS18B20温度测量程序
51单片机多路DS18B20温度测量程序
仿真图:仿真文件和完整源码的下载地址:http://www.51hei.com/bbs/dpj-20600-1.html源代码:#include#include#include #include #define uchar unsigned char#define uint unsigned int本文引用地址:sbit RS= P2^0 ;//液晶显示引脚定义sbit RW= P2^1 ;sbit EN= P2^2 ;uint t=0,dian=0;uchar LCD_LINE_ONE[16]={"tp1: "};//定义显示屏幕uchar LCD_LINE_TWO[16]={"tp2: "};//uchar LCD_LINE_THR[16]={" "};int Tm;int fushu=0 ;sbit DQ= P3^3;static unsigned char get_serial[]={ //获取的八个DS18B20内部RAM64位序列号 224, 0,0,0, 184, 197, 50, 40, 215, 0,0,0, 184, 197, 51, 40 // 82, 0,0,0, 184, 197, 52, 40// 101, 0,0,0, 184, 197, 53,40, //60, 0,0,0, 184, 197, 54,40, //11, 0,0,0, 184, 197, 55,40, //47, 0,0,0, 184, 197, 56,40, //185, 0,0,0, 184, 197, 49,40,};void delay( ms ) //用于液晶显示的延时函数{ while(ms--) { for(i=0 ;i<5 ;i++ ) ; }}uchar Read_LCD_State() //读取液晶显示的状态{RS=0;RW=1;EN=1;delay(1);state=P0;EN = 0;delay(1);}void LCD_Busy_Wait() //如果忙则等待函数{while((Read_LCD_State()&0x80)==0x80);delay(5);}void Write_LCD_Zhilin(uchar zl) //液晶显示写指令函数{LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=EN=1;delay(1);EN=0;}void Write_LCD_shuju(uchar date) //液晶显示写数据函数{LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=EN=1;delay(1);EN=0;}void LCD_INIT()//液晶显示初始化{ Write_LCD_Zhilin(0x38); // 显示模式设置delay(1);Write_LCD_Zhilin(0x01); // 显示清屏delay(1);Write_LCD_Zhilin(0x06); // 光标移动设置delay(1);Write_LCD_Zhilin(0x0c); // 开及光标设置delay(1);}void Display_LCD_String(uchar p,uchar *s) //液晶显示写入函数{Write_LCD_Zhilin(p|0x80); //写地址高位为一//Write_LCD_Zhilin(0x40|0x80);for(i=0;i<16;i++){Write_LCD_shuju(s[i]);delay(1); }}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一博客分类:
#include "my51.h"
#include "smg.h"
#include "ds18b20.h"
void main()
//测试 ,6位数码管显示温度值
u16 temp=0;
temp=ds18b20_readTemperaData();
for(i=0;i&100;i++)
displaySMG(ds18b20_processTempData(temp));
_DS18B20_H
_DS18B20_H
extern u8 smgWela[7];
//数码管位选数据
sbit DQ=P2^2;
//总线定义
bool ds18b20_init();
//初始化函数
ds18b20_processTempData(u16 temp);//将temp数据处理成数码管可显示数据
ds18b20_readTemperaData();
ds18b20_readByte() ;
//读一个字节
void ds18b20_writeByte(u8 dat);
//mcu向18b20写一个字节
#include "ds18b20.h"
/******************************************************************
当主机总线t0时刻从高拉至低电平时就产生写时间隙
从to 时刻开始的1us之后,15us之前将所需写的位送到总线上
DSl820 在t0后的15-60us 对总线采样若低电平写入的位是0 ,若高电平写入的位是1
连续写2 个位之间的间隙应大于1us
写1,总时间大于60us,在t0开始延时1us就可以写1,15us之后ic来采样,采样时间最大45us
写0,总时间是60~120us,15~60us是ic在采样,120以外就没必要了,mcu总得释放总线吧
不管写1还是写0,大于60us的话,ic肯定已经采样完成了,那mcu就可以释放了
*******************************************************************/
void ds18b20_writeByte(u8 dat)
//mcu向ic写一个字节
for(i=0;i&8;i++)
//产生读写时序的起始信号
//要求至少1us的延时
DQ=dat & 0x01; //对总线赋值,从最低位开始写起
delayXus(10);//延时74us,写0在60~120us之间释放,写1的话大于60us均可释放
//释放总线,为下一次mcu送数据做准备,
//有效数据移动到最低位,2次写数据间隙至少需1us
/**************************************************************************
下降沿产生读时序
整个读时序必须至少有60us的持续时间,相邻两个读时序必须要有至少1us的恢复时间
DS18B20在读时序产生1us后输出数据到总线上,也有可能需要2~3个微秒,但不会更多
而要求主机释放总线和采样总线等动作要在15μs内完成,那么让mcu采样的最佳时机
是读时序产生后的5~13us之间,在15~60us这段时间是18b20的私有时间,它会在这段
时间内的任意时刻释放总线,是不稳定期,我们不要让mcu在这段时间里对总线操作
*******************************************************/
u8 ds18b20_readByte()
//mcu读一个字节
u8 i,value=0;
for(i=0;i&8;i++)
//起始信号
value&&=1;
//顺便延时3~4个机器周期
//mcu释放总线
_nop_();_nop_();_nop_(); //再延时3.3us
value|=0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0
delayXus(8); //延时60.76us
u16 ds18b20_readTemperaData()
//读取温度值
u16 temp=0;
if(ds18b20_init())
ds18b20_writeByte(0xcc);
//写指令:跳过rom检测
ds18b20_writeByte(0x44);
//写指令:温度转换
//delayms(750);// 转换延时需要750ms以上,我们不等它
//首次转换未完成时,得到的初始化数据是85度,处理一下就可以了
//温度转换电路是硬件独立的,不会阻塞初始化功能
if(ds18b20_init())
ds18b20_writeByte(0xcc);
//写指令:跳过检测rom
ds18b20_writeByte(0xbe);
//写指令:读取温度值
temp=ds18b20_readByte();
//先读低8位数据
temp|=(u16)ds18b20_readByte()&&8; //再读高8位数据,然后合并
temp&= 0x0FFF; //高4位数据反正没用上,我们用来存放错误码
//调试代码
temp=0x2000; //错误码,初始化失败
//调试代码
temp=0x1000;
//错误码,初始化失败,可能器件损坏
bool ds18b20_init()
u8 checkState=0;
//总线初始状态
_nop_();_nop_();
//mcu先将总线拉低
delayXus(80);
//延时530us,要求480us~960us的低电平信号
//当ic接受到此复位信号后会回发一个存在信号
//mcu若要接收此存在信号则先要释放总线,让ic控制该总线
//当mcu释放总线后的15~60us之后,ic才向总线发一个低电平信号
//该信号存在时间为60~240us
//mcu释放总线
delayXus(10);
//mcu释放15~60us以上,(8+6*10)*1.085=73us,
//这时DS18B20已经拉低信号,大约60~240us应答保持时间,
checkState=DQ;
//在这段60~240us时间内,mcu采样是否有器件响应,0表示有响应
delayXus(70);
//延时464us,加上之前的73us,共537us
//虽然ic在拉低电平60~240us之后,会释放总线,但整个时间至少480us
//故我们共用时537us,这样是为了不影响后续的操作
if(checkState)
//checkstate为0说明有器件响应,为1无器件响应
return FALSE;
return TRUE;
//初始化成功
u8* ds18b20_processTempData(u16 temp) //返回数码管可直接显示的数据指针
if(0x0550==temp)
//如果初始化温度数据是85度的话
//亮灯报警,调试
smgWela[5]=18;
//当温度是85度,第6个数码管显示负号
//一般刚上电时能看到这个负号
if(1==(temp&0x0800))
//检测第11位是否为1,为1是负温度
temp&=0x07
//只取第0~10共11个位
temp=(~temp+1) & 0x07//将补码还原
smgWela[0]=18;
//第一个数码管显示18号元素,即负号
smgWela[0]=
//正温度的话这个数码管就不要显示了
temp=(u16)(temp*6.25);
//精度的1000倍,我们将小数点另外叠加显示
if(temp&=10000)
smgWela[1]=1;
//第二个数码管显示1,是百位上,100度以上啊
smgWela[1]=
//百位上是0的话不要显示这个0
smgWela[2]=temp%;
//第三个数码管 十位
smgWela[3]=temp%;
//第四个数码管 个位叠加小数点
smgWela[4]=temp%100/10;
//第五个数码管
smgWela[5]=temp%10;
//第六个数码管
smgWela[6]=0xf7;
//第4个数码管叠加小数点
return smgW
//返回数组
#ifndef _51SMG_H_
#define _51SMG_H_
#include &reg52.h&
#include "mytype.h"
sbit dula =P2^6;
//段选锁存器控制
sbit wela =P2^7;
//位选锁存器控制
#define dark 0x11//在段中,0x11是第17号元素,0x00是低电平,数码管不亮,即table[17]
#define dotDark 0xff//小数点全暗
void displaySMG(u8* pWela); //数码管显示函数,参数是数组指针
#include "smg.h"
#include "my51.h"
static u8 code table[]= {
//0~F外加小数点和空输出的数码管编码
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40
// . 空 负号
空为第17号元素
由于此表只能一次显示一个小数点,故已注释掉,仅供查询
例如想要第一个和第六个数码管小数点同时点亮,
则执行 pWela-&dot = 0xfe & 0xdf
u8 code dotTable[]={
//小数点位置,某一位置0时,小数点亮
0xfe , 0xfd , 0xfb ,
0xf7 , 0xef , 0xdf
u8 data smgWela[7]={0,0,0,0,0,0,0}; //第一位到第六位,最后一个是小数点位置控制
//P0口的数码管位选控制锁存器只用了低6位,我们保留高2位的数据,留作它用
void displaySMG(u8* pWela)
//控制6位数码管显示函数,不显示的位用参数dark
u8 preState=P0|0x3f;
//保存高2位状态,其中最高位是ADC0804的片选信号
wela=0;dula=0;_nop_();//先锁定数据,防止吴亮及位选锁存器高2位数据被改变
//由于数码管是共阴极的,阳极送低电平,灯不亮
dula=1;_nop_();
//段选数据清空并锁定
//共阴极数码管是阴极置高不亮,低6位置1,高2位保留
wela=1;_nop_();
//注:wela和dula上电默认为1
//位选锁定,初始保留高2位的数据,低6位置高不亮
for(i=0;i&6;i++)
//显示6位数码管
P0=table[pWela[i]]|(((1&&i) & pWela[6])?0x00:0x80);
dula=1;_nop_();
//送段数据,叠加小数点的显示,0x00点亮小数点
P0=preState&~(1&&i); //不影响高2位数据,低6位是数码管位选,低电平有效
wela=1; _nop_();
//送位选号
delayms(1);
//稍作延时,让灯管亮起来
//消除叠影及误亮,阴极置1不亮,低6位置1,高2位保留并锁定
wela=1; _nop_();
#ifndef _MY51_H
#define _MY51_H
#include &reg52.h&
//#include &math.h&
#include &intrins.h&
#include "mytype.h"
#define high 1
#define low
#define led P1
//灯总线控制
sbit led0=P1^0;
//8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //led锁存的状态,0锁定 ,1不锁定
sbit beep=P2^3;
void delayms(u16 ms);
void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#include "MY51.h"
void delayms(u16 ms)
//毫秒级软延时函数
for(i=i&0;i--)
for(j=113;j&0;j--)
/****************************************************************
若使用12分频模式的mcu,晶振频率为Hz
则每个机器周期用时12/.085微秒
keil4编译,在默认的8级优化方式下
参数us=0时,函数执行9个机器周期,即t=9*1.085=9.77 us
参数us!=0时,函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085 us
*****************************************************************/
void delayXus(u8 us) //微秒级软延时函数
//这种写法有利于减小us=0时的机器周期
浏览 15536
楼主,你的 "mytype.h"&& 文件呢?
#ifndef&& _MYTYPE_H
#define&& _MYTYPE_H
/////////////////////////////////////////////
typedef float&&&&&&&&&&&&&&&&&&&&&&&&&&&& f32&& ;
typedef double
&&&&&&&&&&&&&&&&& d64& ;
typedef float& const&&&&&&&&&&&&&&&&&& fc32 ;
typedef double& const&&&&&&&&&&&&&& dc64& ;
typedef volatile float&&&&&&&&&&&&&&& vf32&& ;
typedef volatile double&&&&&&&&&&&& vd64& ;
//typedef volatile float&&&& const&& vfc32&& ;
//typedef volatile double& const&& vdc64& ;
//////////////////////////////////////////////
typedef signed long& s32;
typedef signed short s16;
typedef signed char&& s8;
typedef signed long& const sc32;& /* Read Only */
typedef signed short const sc16;& /* Read Only */
typedef signed char& const sc8;&& /* Read Only */
typedef volatile signed long& vs32;
typedef volatile signed short vs16;
typedef volatile signed char& vs8;
//typedef volatile signed long& const vsc32;& /* Read Only */
//typedef volatile signed short const vsc16;& /* Read Only */
//typedef volatile signed char& const vsc8;&& /* Read Only */
typedef unsigned long& u32;
typedef unsigned short u16;
typedef unsigned char& u8;
typedef unsigned long& const uc32;& /* Read Only */
typedef unsigned short const uc16;& /* Read Only */
typedef unsigned char& const uc8;&& /* Read Only */
typedef volatile unsigned long& vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char& vu8;
//typedef volatile unsigned long& const vuc32;& /* Read Only */
//typedef volatile unsigned short const vuc16;& /* Read Only */
//typedef volatile unsigned char& const vuc8;&& /* Read Only */
typedef enum {FALSE = 0, TRUE = !FALSE} BOOL;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITS
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalS
////////////////////////////////////////////////////////////////////////////////////////////
#define bool BOOL
#define false FALSE
#define true& TRUE
typedef enum {CLOSE = 0, OPEN = !CLOSE} OPEN_CLOSE;
typedef enum {GND = 0, VCC = !GND} GND_VCC;
typedef enum {NO = 0, YES = !NO} YES_NO;
typedef enum {STOP = 0, START = !STOP} START_STOP;
typedef enum {LOCK = 0, UNLOCK = !LOCK} LCOK_UNLOCK;
////////////////////////////////////////////////////////////////////////////////////////////
#define U8_MAX&&&& ((u8)255)
#define S8_MAX&&&& ((s8)127)
#define S8_MIN&&&& ((s8)-128)
#define U16_MAX&&& ((u16)65535u)
#define S16_MAX&&& ((s16)32767)
#define S16_MIN&&& ((s16)-32768)
#define U32_MAX&&& ((u32)uL)
#define S32_MAX&&& ((s32))
#define S32_MIN&&& ((s32)-)
xouou_53320
浏览: 414622 次
void T0_Work()
//T0定时器调用的工作函数
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'基于AT89C51的自动温度测量报警系统设计
12:40:50来源: 互联网 关键字:&&
&&& 目前,无论是在工业生产中还是在科研实验中通过对温度测量来进行自动控制的设备越来越普及,应用场合也越来越多。随之而来的问题是,如何能够测得精确的温度以保证自动控制设备能够正确地发出控制指令来控制生产过程。另一方面,如果温度过高可能会对一些设备中的一些半导体元器件造成损坏。因此,对于自动高温报警的需求也在逐渐增加。本文基于以上方面的考虑,研究并设计了一种基于单片机的自动温度测量与报警系统。
  1 系统硬件设计
  尽管目前市场上单片机的品种多样,功能也越来越多,但是受成本约束,性能优良的8位单片机仍然是工业检测与控制应用领域的首选。
  本系统就是以ATMEL公司的单片机为中心,通过模数转换器AD7812对温度传感器的输出电压进行模数转换,再将转换结果送入单片机进行相应的处理,通过编程分析处理的结果,最后决定是否报警。下面分别介绍各个硬件功能模块的设计。
  1.1 温度传感器设计
  温度传感器是感知外部环境中温度变化的重要元件,它是外界与本系统的接口。它将外界温度的变化转化成电压的变化,这样通过对电压的处理与分析就可以间接地测量出外界温度。本系统采用的温度传感器为LM35,该温度传感器由美国国家半导体公司生产,在常温下,不需要额外的校正处理就可以到达0.25℃的准确率。其输出电压与摄氏温度成线性关系,并且这种关系可以表示为:
  式中,Vo为传感器的输出电压,单位V,T是外界环境中的温度,单位℃。由于LM35能够测量的最高温度是150℃,由式(1)可得其最大输出电压为1.5 V。为了能够与AD7812的输入进行匹配,故需要对传感器的输出电压进行放大,放大的倍数约为3.33倍。可采用集成运放连接成同向放大器来实现电压放大的功能。经过放大后的电压约为5 V,恰好能够与模数转换部分的输入相匹配。该部分电路设计如图1所示。
  1.2 A/D转换设计
  经过温度传感器转换后的输出电压值不能直接送入单片机中进行处理,还必须在它们之间增加A/D转换装置。本文中选择AD7812作为A/D转换器。AD7812是由Analog Devices公司生产的一种串行接口的10位8通道A/D转换器。与一般的并行接口A/D转换器相比,它的优点在于能够节省处理器的引脚资源。节省下来的引脚资源可以进一步的对系统进行扩展,以使其功能更加强大。在AD7812内部有8路模拟开关可以采集8路模拟信号,这里只需要将经放大的传感器输出信号输入到其中任意一路即可,为了简便起见,就取其中的第1路模拟开关作为输入信号的通道。由于AD7812内部具有转换时钟源,因而不需要外部提供时钟源。单片机只需要通过它的串行时钟输入、数据输出、数据输入、转换输入4根引脚就可以对其进行控制。该部分电路设计如图2所示。
图2& A/D转换电路
  1.3 单片机处理器电路设计
  AT89C系列单片机是一款低电压,高性价比8位单片机。与MCS-51单片机相比,它有两大优势:第一,片内存储器采用闪速存储器,使程序的写入更加方便;第二,推出了更小尺寸的芯片,使电路的尺寸更小。
  AT89C51是该系列中一种带4 KB容量可编程可擦除只读存储器和128字节随机存取数据存储器(RAM)的高性能8位单片机。它采用ATMEL的高密度非易失存储器制造技术,与工业标准的MCS-51指令集和输出管脚兼容。总之,ATMEL的AT89C51单片机为嵌入式控制系统提供了一种高性价比的实现方案。
  AT89C51提供以下标准功能:4 K字节的Flash闪存存储器,128字节内部RAM,32个I/O口线,2个16位定时/计数器,1个5向量两级中断结构,1个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0 Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。在本文中该中央处理电路如图3所示。
  1.4 异常情况报警电路设计
  报警电路的作用是在出现异常情况时及时地提醒工作人员尽快采取措施,减少危险,避免灾难性后果的出现。因此,在设计报警电路时,应该让它的报警行为能够迅速被人察觉,以进一步采取相应措施,避免或减少危害带来的损失。现代科学研究证明,通过刺激人的视觉与听觉能够较好地达到报警的目的。并且,闪烁的灯光与断续的声响最能够引起人们的注意。基于上面的这种考虑,在设计中使用了74LS0 0、74LS04等集成门电路芯片组成的脉冲信号发生器来控制声音的断续和灯光的亮灭。
  外界环境中的温度被温度传感器所采集,温度传感器会将此时的温度转换成电压值,该电压值经过匹配后送入A/D转换器,经过转换之后的数据送入单片机进行处理。单片机按照编制好的程序进行处理,如果确实此时的温度超过了人们凭借经验设定的阈值,单片机将通过指令使P0.0、P0.1两口输出为高电平(约为+5 V),使得扬声器与发光二极管产生报警信号。该部分的电路设计如图4和图5所示。
图4 声音报警电路
图5 灯光报警电路
  2 系统软件设计
  为了便于程序的修改,将系统按照模块化的方法进行设计。该系统由温度采集、A/D转换、数据处理、报警输出4个模块部分组成。温度采集是由温度传感器LM35完成,A/D转换和报警输出是由单片机进行控制的。而数据处理部分则是单片机接收到A/D转换器送来的数据后,在单片机内部完成的,其结果将决定报警输出模块是否工作。
  系统的工作流程是:LM35采集温度,并且将温度信号转换成电信号:A/D转换将线性放大后的模拟电信号进行A/D转换,使之成为单片机能够处理的数字信号;单片机通过处理转换后的数字信号来分析采样的温度值,并将分析结果送到报警输出电路中;报警输出电路根据分析的结果做出相应的反应。系统的软件设计流程图如图6所示。
图6 系统设计流程图
  2.1 A/D转换模块
  A/D转换器在启动之前需要对其进行初始化,否则会影响后面的使用。根据图2的连接方式,初始化时将单片机的P1.4口置1,然后软件启动一次转换过程即可。在转换的过程中。由于任何A/D转换器都会有一定的转换时间,所以在转换时要设置一定的延时,并且该延时要略长于器件的转换时间。由于AD1812的转换时间约为2.3 μs,在程序中可以将延时设置为3μs,以保证转换过程的顺利进行。
  2.2 中央处理模块
  这部分模块的软件设计主要包括单片机对A/D转换模块的控制、单片机处理送来的数据以及单片机对报警系统的控制3大部分。
  对A/D模块的控制主要包括对AD7812进行有关控制字的写入以及对P1口的引脚的置位与清零操作;数据处理部分主要是将外界温度转换过来的电压值与预先的经验阈值进行比较,进而决定是否启动报警系统;报警系统的设计则是根据数据处理的结果对P0口进行清零或是置位,来启动或停止报警电路。
  3 结束语
  本文主要设计了一种自动系统,该系统的设计主要基于AT89C51单片机,中央处理单元与外围扩展模块的构造简单,整个系统实现成本较低。由于LM35是采用单电源供电方式,因此该系统只能够在5~150℃的范围内工作,可以作为常温下的报警装置使用,尤其是在一些对温度较敏感的电气设备内部,可以起到防止设备故障的作用,故而具有一定的实用价值。在设计中没有使用并口的A/D转换AD0 809而是使用了串口转换的AD7812为单片机节约了许多端口资源,可以利用这些资源扩展LED或LCD显示系统,也可制成温度的测量与报警系统,使其功能更加完善。
关键字:&&
编辑:小来
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
网友正在学习IC视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
相关关键词
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。Sina Visitor System}

我要回帖

更多关于 单片机程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信