tag 标签: 51单片机

相关帖子
相关博文
  • 热度 2
    2024-10-23 18:53
    74 次阅读|
    0 个评论
    【原创】XD08M3232接近感应单片机对小家电及消费类电子应用领域
    XD08M3232 是一款 多的接近感应单片机 ,适用于 智能卫浴、感应开关、感应垃圾桶、烟感及接近感应 的应用领域。以下是对该产品的详细解析: 一、 产品描述 该单片机是一款 A/D 型具有 8 位高性能精简指令集的 Flash 型单片机,专门为接近感应应用而设计。此单片机具有一系列的功能和特性,其 Flash 存储器可多次编程的特性给用户提供了较大的方便。存储器方面,还包含了一个 RAM 数据存储器和一个可用于存储序号、校准数据等非易失性数据的 True EEPROM 存储器。 内置主动式 IR 近接感应电路,可大量减少外部组件(如 OPA 、 DAC 、晶体管、电阻及电容),降低产品体积和 BOM 成本。 由于其小巧的体积和丰富的功能,又整合了主动式 IR 近接感应电路, XD08M3232 非常适合应用于卫浴(如自动感应水龙头、马桶等)、家居(如智能照明、安防系统等)和安防(如门禁系统、自动门等)以及近接感应相关产品或需求小体积产品 / 模块。 在模拟特性方面,该单片机包含一个多通道 12 位 A/D 转换器,两个运算放大器,一个比较器和其他专门为接近感应应用而设计的电路。较为灵活的定时器模块,可提供定时功能、脉冲产生功能及 PWM 产生功能。内建完整的 SPI, I2C 和 UART 接口功能,这种流行的接口为设计人员提供了易与外部硬件通信的方式。内部看门狗定时器、低电压复位和低电压检测等保护特性,外加优秀的抗干扰和 ESD 保护性能,确保单片机在恶劣的电磁干扰环境下可靠地运行。 该单片机内部集成了的高 / 低速振荡器,在应用中不需要外围元器件。使用不同的时钟源在不同工作模式之间动态切换的能力,为用户提供了一个优化单片机操作和减少功耗的能力。外加 I/O 使用灵活、时基功能等其它特性,使该单片机可以广泛应用于各种接近感应产品。‌ ‌ 二、 典型应用 在智能卫浴上面,该产品的对阳光的抗干扰性强,防止误触发或者失灵。 因为 XD08M3232 自带 恒流驱动电路可以使相关感应部件的工作电流保持稳定, 减少因外部因素(如阳光等光线变化可能引起的电流波动)而产生的干扰。对于智能卫浴设备而言,稳定的工作状态有助于防止误触发或失灵情况的发生,从而避免水源的不必要浪费,这与智能卫浴节约用水的初衷相契合。 在智能垃圾桶上面, XD08M3232单片机内置继承了两路轨到轨运算放大器。在智能垃圾桶的接近感应应用场景中,这些运算放大器可以对低幅度的输入信号进行有效放大。在放大信号的同时,也可以对信号进行一定的整形和滤波处理。例如,当外界存在电磁干扰时,可能会叠加在接近感应信号上,通过运算放大器对信号的处理,可以过滤掉一部分干扰信号,提高信号处理的效率和准确性,增强对外部电磁干扰的抵抗能力。 在烟感上面, 典型待机睡眠功耗 3uA@3.3V 大大加长了工作时间。 内置的两路轨到轨运算放大器可对烟雾报警器接近感应低幅度输入信号有效放大、整形和滤波。外界电磁干扰叠加在接近感应信号上时,能过滤部分干扰信号,提高信号处理效率和准确性,增强抗干扰能力。自带的恒流驱动电路可避免烟雾报警器感应器的光衰问题,使接近感应更稳定,减少 漏判和误判 影响,提高 产品的稳定性和加长使周期 。 综上所述 XD08M3232 接近感应单片机应用在中高端感应类产品上,产品整体的功能及参数对开发者和产品的品质方面还是特别的友善的,大大减少了外围元器件和开发者的开发周期,又加强了产品的稳定性,获得很多工程师及产品经理的喜爱。
  • 热度 7
    2024-7-1 16:08
    1014 次阅读|
    0 个评论
    前言 最近购入了一台示波器,想着示波器到了总得做个小项目,不然怎么发挥示波器的作用。正好用到之前限制下来的一块51单片机的学习板,还有一块DHT11温湿度传感器,所以决定做一个基于51单片机的温度计,然后用oled屏显示出来。所以本期文章会有 DHT11传感器的解析,以及代码全部开源,欢迎大家来参考 下载地址 【源码】 https://mbb.eet-china.com/download/315900.html 【DHT11文档】 https://mbb.eet-china.com/download/315901.html 材料准备 (一)51单片机 (二)DHT11温湿度传感器 (三)0.96OLED屏,4针脚 (四)示波器(选配,用来分析DHT11) DHT温湿度传感器 简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。 引脚 串行通信(理论,文档) 【单总线说明】 DHT11器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制 均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许 设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主 机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序 列混乱,器件将不响应主机。 【单总线传送数据位定义】 DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送 40位数据 , 高位先出。 【数据格式】 8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位 注:其中湿度小数部分为0。 【校验位数据定义】 “8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”8bit校验位等于所得结果的末8位 【数据时序图】 用户主机(MCU)发送一次开始信号后,DHT11从低功耗模式转换到高速模式,待主机开始 信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信采集。 【读取步骤】 串行通信(示波器实操) 光看理论肯定没这么通俗易懂,所以我直接上示波器给大家演示一下数据是如何传输的,可能有误,欢迎指正! (示波器测量的光标可能没对准,但是差的不多,误差1-3us内) (一)开始时,要求MCU将电平拉低18ms以上,我这里拉了20ms (二)当DHT11检测到MCU的低电平信号后,等待低电平信号结束,然后拉高电平,等待DHT11相应 (三)但83us的应答低电平发出后,再发出87us的高电平通知muc准备接收数据 (四)DHT会发送0和1数据,让我们看看如何区分0和1的。每个信号都有两部分组成,54us低电平的主机信号 + 0或1高电平的从机信号,0的高电平为23us,1的高电平为68us 所以数据1的电平为54+68=122us,数据0的电平为54+23=77us (五)数据分析 由图可以分析出5段8bit的数据,湿度高位,湿度低位,温度高位,温度低位,校验位 校验为等于4项相加 0011 0001(湿度高位)0000 0000(湿度低位) 0001 1101(温度高位)0000 1000(温度低位) 0101 0110(校验) 正确数据接收: 0011 0001 + 0000 0000 + 0001 1101 + 0000 1000 = 0101 0110 湿度:0011 0001 = 49(十进制整数部分)0000 0000 = 0(十进制小数部分) 湿度为:49.0 温度:0001 1101 = 29(十进制整数部分)0000 1000 = 8(十进制小数部分) 温度为:29.8 代码解析 【完整的代码在文章开头有下载地址,免费】 (一)延迟函数,一个为us,一个为ms 0;j--); } (二)MCU拉低电平20ms,并等待DHT11响应 void start() { Data=1; //初始拉高电平 delay_us(5); Data=0; //发送开始信号 delay_as(20); //延时18ms以上 Data=1; //拉高等待 delay_us(30); } (三)接收数据,通过延时,判断高电平的数据是0还是1 uchar DHT11_rec_byte() { uchar i,dat=0; for(i=0;i<8;i++) //从高到低依次接收8位数据 { while(!Data); //等待50us低电平过去 delay_us(8); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //移位使正确接收8位数据,数据为0时直接移位 if(Data==1) //数据为1时,使dat加1来接收数据1 dat+=1; while(Data); //等待数据线拉低 } return dat; } (四)整合数据,并校验,然后保存在变量中 void shou() { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; start(); if(Data==0) { while(Data==0); //等待拉高 delay_us(40); //拉高后延时80us R_H=DHT11_rec_byte(); //接收湿度高八位 R_L=DHT11_rec_byte(); //接收湿度低八位 T_H=DHT11_rec_byte(); //接收温度高八位 T_L=DHT11_rec_byte(); //接收温度低八位 revise=DHT11_rec_byte(); //接收校正位 delay_us(25); //结束 if((R_H+R_L+T_H+T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } wendu = TH; shidu = RH; } } (五)通过oled屏幕显示,具体位置可看源码附带的oled函数 void xianshi() { OLED_ShowCHinese(30,5,2); OLED_ShowCHinese(50,5,3); OLED_ShowCHinese(30,10,0); OLED_ShowCHinese(50,10,1); OLED_ShowNum(70,2,wendu,2,16); OLED_ShowNum(70,5,shidu,2,16); } 总结 51单片机温度计,这个项目是非常适合新手朋友的,一方面是51单片机入门很简单,另一方面是学习示波器的使用方法 通过小项目,可以学到很多知识,特别是二进制的计算方法,进制转换也是电子入门必学的 DHT11的分析方法,在任何单片机里面都可以用,不局限51单片机
  • 热度 2
    2024-2-23 21:30
    727 次阅读|
    0 个评论
    51单片机大学生入门记录【1-1流水灯】
    成果展示----流水灯 代码展示 #include void Delay1ms(unsigned int xms) //@12.000MHz { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main() { while(1) { P1=0xFE; Delay1ms(500); P1=0xFD; Delay1ms(500); P1=0xFB; Delay1ms(500); P1=0xF7; Delay1ms(500); P1=0xEF; Delay1ms(500); P1=0xDF; Delay1ms(500); P1=0xBF; Delay1ms(500); P1=0x7F; Delay1ms(500); } } 硬件解析 我们可以看到8颗LED灯分别接在了 P1-P1.7 引脚上面,并且都出串联了限流电阻(起保护作用) P1-P1.7全部都在P1总线上面,所以在代码部分只需要控制P1的"开关"即可控制全部LED灯 并且可以看到,电路采用的是"灌电流"输出,意味着io口相当于接地的作用 所以 LED灯低电平点亮,高电平熄灭 代码解析----点亮一个LED 首先我们需要搞清楚,LED灯在什么时候才能点亮,由上面的硬件解析可以得出,LED灯在P1处于低电平时点亮,处于高电平的时候是熄灭状态 所以p1-p1.7在熄灭时候对应的二进制为 1111 1111 (1为高电平,0为低电平) p1-p1.7全部都位于1高电平,所以全部熄灭 若二进制为 1111 1110 第一位p1为0,其余p1.1-p1.7为1,则p1对应的LED灯亮,因为p1此时为0低电平,其余都为1高电平 所以在代码部分,我们应该写 P1=11111110,但是软件是基于c语言编程的,所以c语言不能识别二进制,所以我们需要把 二进制转换成十六进制 11111110转十六进制就是 FE 所以我们在代码上就应该写FE 因为 是便于解释器的识别, 是十六进制的标志 所以FE前面我们应该把十六进制的前缀加上,则 0xFE 此时上传代码应该可以看到,LED的第一个灯被点亮了 代码解析----循环函数 首先,我们可以在stc-isp里面生成一个1ms的循环函数 然后我们可以自己定义一个函数(xms) 这样我们输入多少,就会循环多少次1ms达到这样一个效果 假如,我xms输入一个500 首先会进行500次循环 每循环一次,函数会自己减去1 则,我输入500,循环一次完成后,就自动变成499次循环 这个函数是软件给我们生成的1ms的循环 如果500次1ms,那就是500ms,相当于0.5秒的循环 所以,我们在main函数里面引用这个延迟函数,然后在延迟函数里面给他定义一个500次 相当于延迟了0.5秒然后跳转到下一步 代码解析----流水灯的循环 我们在知道灯的原理,同时也知道循环的原理之后,就可以做一个相关的流水灯 现在的代码就非常好理解了,在第一个LED灯亮了之后,然后延迟500ms,自动跳到下一个灯,以此类推,一直循环下去 这里再细细讲解一下 第一个灯,对应的二进制为1111 1110 【FE】 第二个灯,对应的二进制为1111 1101 【FD】 第三个灯,对应的二进制为1111 1011 【FB】 。。。以此类推 所以到最后一个灯就应该是 0111 1111 【7E】 总结 51单片机对于新手来说还是比较友好的,基本上懂了LED点亮的原理,以及二进制转换十六进制的方法之后,这个项目就非常容易做了! 而且要理解一下循环函数的原理。简单来说如果我要定时500ms,其实相当于是把1ms循环了500遍这样 最后,祝大家学有所用!
  • 热度 20
    2015-12-21 18:14
    1009 次阅读|
    0 个评论
    1、理论知识   PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要通过设置相应的寄存器就可实现周期和占空比的控制。但是如果要用51单片机的话,也是可以的,但是比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。      用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。      下面重点介绍用一个定时器的实现PWM的方法。因为市面上的智能小车所采用的电机大多数为TT减速电机,通过反复的实验,此电机最佳的工作频率为1000HZ(太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms(1000HZ)进行举例,要产生其它频率的PWM波,程序中只需作简单修改即可。   用一个定时器时(如定时器T0),首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。   因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间间隔为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:   1、当time=100时,time清零(此语句保证频率为1000HZ), 2、当timen时(n应该在0-100之间变化开),让单片相应的I/O口输出高电平,3、当time   2、程序1,使单片机的I/O口输出固定频率的PWM波   下面按上面的思路给出一个具体程序: /*******************************************************************/ /* 程序名:单片机输出固定频率的PWM波*/ /* 晶振:11.00592 MHz CPU型号:STC89C52 */ /* 功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*/ /*****************************************************************/ #include #define uint unsigned int #define uchar unsigned char   sbit PWM1=P2^0;//接IN1 控制正转 sbit PWM2=P2^1;//接IN2 控制反转 uchar time;   void main() {        TMOD=0x01;//定时器0工作方式1        TH0=0xff;//(65536-10)/256;//赋初值定时        TL0=0xf7;//(65536-10)%256;//0.01ms        EA=1;//开总中断        ET0=1;//开定时器0中断        TR0=1;//启动定时器0        while(1)        {                              }                      }   void delay(uint z) {        uint x,y;        for(x=z;x0;x--)               for(y=500;y0;y--); }   void tim0() interrupt 1 {        TR0=0;//赋初值时,关闭定时器        TH0=0xff;//(65536-10)/256;//赋初值定时        TL0=0xf7;//(65536-10)%256;//0.01ms        TR0=1;//打开定时器          time++;        if(time=100) time=0;//1khz        if(time=20) PWM1=0;//点空比%80        else PWM1=1;        PWM2=0; }   程序说明:   1、关于频率的确定:对于11.0592M晶振, PWM输出频率为1KHZ,此时设定时器0.01ms中断一次,时中断次数100次即为1KHZ( 0.01ms*100=1ms,即为1000HZ)此时, 定时器计数器赋初值为TH0=FF,TL0=F7。   2、关于占空比的确定:此时我们将来time的值从0-100之间进行改变,就可以将占空比从%0-%100之间进行变化,上面程序中time=20时 PWM1=0; else PWM1=1;意思就是%20的时间输出低电平,%80的时间输出高电平,即占空比为%80。如需得到其它占空比,如%60,只需将time的值改为40即可。(程序为if(time=40) PWM1=0;else PWM1=1;)   当然编写程序时也可以定义一个标志位如flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 n ,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了 n' 如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到你想要的PWM波形,这种方法我们这里不在举例,请自己去试着书写。   3、程序2,使用单片机I/O口输出PWM波,并能通过按键控制正反转     在程序中我们通常需要控制电机的正反转,如通过一个按键控制正反转,此时我们也可以设置一个标志位如flag。在主程序中当按键每次被按下时,flag相应取反。然后在子程序中当flag为1时,进行正转程序,当flag为0时执行反转程序。下面的程序功能为单片机I/O口P2^0、P2^1输出1000HZ,占空比为%50,并能过P3^7按键控制正电机的正反转。   /*******************************************************************/ /* 程序名:PWM直流电机调速 */ /* 晶振:11.00592 MHz CPU型号:STC89C52 */ /* 功能:直流电机的PWM波控制,可以通过按键控制正反转 */ /*****************************************************************/ #include   #define uint unsigned int #define uchar unsigned char   uchar time,count=50,flag=1;//低电平的占空比   sbit PWM1=P2^0;//PWM 通道 1,反转脉冲 sbit PWM2=P2^1;//PWM 通道 2,正转脉冲 sbit key_turn=P3^7; //电机换向   /************函数声明**************/ void delayxms(uint z); void Motor_turn(void); void timer0_init(void);   /*********主函数********************/ void main(void) {         timer0_init();         while(1)         {                Motor_turn();         } }   /****************延时处理**********************/ void delayxms(uint z)//延时xms程序 {     uint x,y;         for(y=z;x0;x--)                for(y=110;y0;y--); }   /************电机正反向控制**************/ void Motor_turn(void) {         if(key_turn==0)         {                 delayxms(2);//此处时间不能太长,否者会的中断产生冲突                 if(key_turn==0)                 {                 flag=~flag;                 }                 while(!key_turn);         } }   /***********定时器0初始化***********/ void timer0_init(void) {         TMOD=0x01; //定时器0工作于方式1         TH0=(65536-10)/256;         TL0=(65536-10)%256;         TR0=1;         ET0=1;         EA=1; }   /**************定时0中断处理******************/ void timer0_int(void) interrupt 1 {                 TR0=0;//设置定时器初值期间,关闭定时器         TH0=(65536-10)/256;         TL0=(65536-10)%256;         TR0=1;                 if(flag==1)//电机正转         {                 PWM1=0;                 time++;                 if(time div=""                 {                 PWM2=1;                 }             else             PWM2=0;                     if(time=100)             {                 time=0;             }         }         else //电机反转         {                PWM2=0;                 time++;             if(time div=""             {                 PWM1=1;             }             else                 PWM1=0;                         if(time=100)             {                 time=0;             }         } }   4、程序4、使单片机输出PWM,并能控制正反转和实现调速   为了使大家彻底掌握此方面,下面再给出一个复杂一点的程序,实现的功能为通过一个按键控制正反转并通过另外两个按键使之可以在0到20级之间调速的程序。   /*******************************************************************/ /* 程序名:PWM直流电机调速 */ /* 晶振:11.00592 MHz CPU型号:STC89C52 */ /* 直流电机的PWM波控制,可以通过按键控制正反转并在0到20级之间调速 */ /*****************************************************************/ #include   #define uint unsigned int #define uchar unsigned char   uchar time,count=50,flag=1;//低电平的占空比   sbit PWM1=P2^0;//PWM 通道 1,反转脉冲 sbit PWM2=P2^1;//PWM 通道 2,正转脉冲 sbit key_add=P3^5;//电机加速 sbit key_dec=P3^6;//电机减速 sbit key_turn=P3^7;//电机换向   /************函数声明**************/ void delayxms(uint z); void Motor_turn(); void Motor_add(); void Motor_dec(); void timer0_init();   /*********主函数********************/ void main() {     timer0_init();     while(1)     {        Motor_turn();        Motor_add();        Motor_dec();     } }   /****************延时处理**********************/ void delayxms(uint z)//延时xms程序 {     uint x,y;     for(y=z;x0;x--)        for(y=110;y0;y--); }   /************电机正反向控制**************/ void Motor_turn() {     if(key_turn==0)     {         delayxms(2);//此处时间不能太长,否者会的中断产生冲突         if(key_turn==0)         {            flag=~flag;         }         while(!key_turn);     } }   void Motor_add()//电机加速 {     if(key_add==0)     {         delayxms(2);//此处时间不能太长,否者会的中断产生冲突         if(key_add==0)         {            count+=5;            if(count=100)            {               count=0;            }         }         while(!key_add);     } }   void Motor_dec()//电机加减速 {     if(key_dec==0)     {         delayxms(2);//此处时间不能太长,否者会的中断产生冲突         if(key_dec==0)         {            count-=5;            if(count=100)            {               count=0;            }         }         while(!key_dec);     } }   /***********定时器0初始化***********/ void timer0_init() {     TMOD=0x01; //定时器0工作于方式1     TH0=(65536-10)/256;     TL0=(65536-10)%256;     TR0=1;     ET0=1;     EA=1; }   /**************定时0中断处理******************/ void timer0_int() interrupt 1 {         TR0=0;//设置定时器初值期间,关闭定时器     TH0=(65536-10)/256;     TL0=(65536-10)%256;     TR0=1;         if(flag==1)//电机正转     {        PWM1=0;        time++;         if(time div=""         {            PWM2=1;         }         else         PWM2=0;             if(time=100)         {            time=0;         }     }     else //电机反转     {        PWM2=0;         time++;         if(time div=""         {            PWM1=1;         }         else            PWM1=0;                 if(time=100)         {            time=0;         }     } }   5、利用单片机输出PWM简单控制小车直行   相信通过上面的讲解,大家已经能够很好的撑握如何利用51单片机产生PWM波下面给出一个程序,通过单片机两个I/O口输出PWM波,让小车直行。 #include #define uint unsigned int #define uchar unsigned char   sbit PWM1=P2^0;//接IN1 控制正转 sbit PWM2=P2^1;//接IN2 控制反转   sbit PWM3=P2^2;//接IN3 控制正转 sbit PWM4=P2^3;//接IN4 控制反转   sbit PWM5=P2^4;//接IN3 控制正转 sbit PWM6=P2^5;//接IN4 控制反转   sbit PWM7=P2^6;//接IN3 控制正转 sbit PWM8=P2^7;//接IN4 控制反转   uchar time;   void main() {     TMOD=0x01;//定时器0工作方式1     TH0=0xff;//(65536-10)/256;//赋初值定时     TL0=0xf7;//(65536-10)%256;//0.01ms     EA=1;//开总中断     ET0=1;//开定时器0中断     TR0=1;//启动定时器0     while(1)     {                }          }   void delay(uint z) {     uint x,y;     for(x=z;x0;x--)        for(y=500;y0;y--); }   void tim0() interrupt 1 {     TR0=0;//赋初值时,关闭定时器     TH0=0xff;//(65536-10)/256;//赋初值定时     TL0=0xf7;//(65536-10)%256;//0.01ms     TR0=1;//打开定时器       time++;     if(time=100) time=0;//1khz     PWM2=0;     PWM4=0;        if(time=75) PWM1=1;     else PWM1=0;     if(time=80) PWM3=1;     else PWM3=0;       PWM6=0;     PWM8=0;        if(time=50) PWM5=1;     else PWM5=0;     if(time=50) PWM7=1;     else PWM7=0;      }   本文转自51hei,单片机教程 ) ) ) ) 时,让单片相应的i
  • 热度 23
    2015-6-4 14:58
    1445 次阅读|
    2 个评论
    1、单片机IO口上电后默认是高电平。(P1、P2、P3口内部上拉,若P0口未接上拉电阻的话,默认是高阻态) 2、单片机工作频率=晶振频率/12,即使用12MHz的晶振,实际工作频率为1MHz,一个机器周期为1us。 3、单片机常用11.0592MHz的晶振,主要是保证串口通信的同步。比如说在9600波特率下每位数据电平持续96个机器周期,因为是整数值,不会产生误差。若使用12MHz的晶振,高波特率下通信容易产生误码。 4、三极管的使用:在模拟电路中,输入为高频模拟信号时,三极管一般工作在放大模式下。在数字电路中,三极管一般作为开关用,工作在饱和模式下。 5、在单片机数据线和地址线复用的情况下必须使用锁存器,可在工作时锁住地址信号,传输数据信号,以防止传数据时地址线被数据所影响。 6、普通发光二极管正向压降为1.6v-2.1v,工作电流为3-20mA。计算LED限流电阻时必须使用到此参数,一般取压降为1.7v,电流为3mA,使用5V电压的情况下限流电阻为:(5v-1.7v)/3mA=3.3v/3mA=1.1kohm,可取1kohm。
相关资源