当前位置:首页 > stc
  • 基于STC单片机的LED智能照明系统

    基于STC单片机的LED智能照明系统

     1 引言  LED被称为第四代照明光源或绿色光源,LED的发光器件是冷光源,具有节能、环保、寿命长、体积小等特点。白炽灯,卤钨灯的光效为12~24lm/W,荧光灯50~70lm/W,钠灯90~140lm/W,而且大部分的耗电变成了热耗。LED可达到50~200lm/W,而且单光的单色性好,光谱窄,无需过滤,可直接发出有色可见光。在相同照明效果的情况下,耗电量约为白炽灯的十分之一,荧光灯的二分之一。同样效果的一支日光灯40多瓦,而采用LED每支的功率只有8瓦。LED的平均寿命达10万小时,安全可靠性强,不含汞,钠元素等可能危害健康的物质,有利于环保,被称为“绿色照明光源”。  2 智能照明控制方案设计  利用光敏电阻检测室内光线的强弱,被动热释红外探测器可探测人体的特征,传感器将检测数据传送给控制核心———单片机,根据处理结果去控制照明设备的开启、关闭和照度。图1为智能照明控制方案原理框图。  该系统主要由三部分组成:传感器部分,控制器部分和LED驱动电路和照明系统,见图1。  3 系统硬件设计  3.1 传感器部分  3.1.1 被动式热释电红外探测器  该探测器有三个关键元件:菲涅尔滤光晶片,它通过截止波长8~12μm的滤光晶片,起带通滤波器的作用,使环境的干扰受到明显的控制;菲涅尔透镜,聚焦作用,即将热释的红外信号折射(反射)在热释电红外传感器上,第二个作用是将警戒区内分为若干个明区和暗区,使进入警戒区的移动物体能以温度变化的形式在热释电红外传感器上产生变化热释红外信号,这样热释电红外传感器就能产生变化的电信号;热释电红外传感器将透过滤光晶片的红外辐射能量的变化转换成电信号,即热电转换。  人体都有恒定的体温,一般在37度,所以会发出特定波长10μm左右的红外线,被动式红外探头就是靠探测人体发射的10μm左右的红外线而进行工作的。人体发射的10μm左右的红外线通过菲涅尔滤波片增强后聚集到红外感应源上。红外感应源通过采用热释电元件,这种元件在接收到人体红外辐射稳定发生变化时就会失去电荷平衡,向外释放电荷,经检测处理后就能产生电平的变化。  根据此原理应用性能稳定的红外模块,当有人走动时模块输出3.3V电压,没人时为低电平。模块有可调的延时,最多可达到18秒。  3.1.2 环境亮度传感模块  此传感模块的核心器件是光敏电阻。光敏电阻利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻小,入射光弱,电阻增大。光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化),见图2。  3.2 控制部分  STC12C5628AD系列单片机是宏晶科技生产的单时钟/机器周期(IT)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8~12倍,内部集成MAx810专用复位电路。4路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。  选择这个型号的单片机主要考虑到具有PWM和AD转换的作用,使得外围电路得到了大大的简化,同时产生的PWM信号可直接与驱动芯片相连,使得这个系统的成本降低了很多。  由于采用的是PWM调光的方式,为了减少不必要的外围的电路,选择的驱动芯片可直接由DIM管脚输入PWM方波。  LM3407是一款集成了N沟道功率MOS场效应管的脉冲宽度调制的浮动式降压转换器,其设计是为提供精准的恒定电流输出,以驱动高功率发光二极管(LED)。LM3407的显着特色是脉冲电平调制(PLM)控制方案,这一方案在使用一个外部1%精度的电流设定厚膜电阻时,能确保在整个输入电压和工作温度范围内恒定电流输出精度好于10%。转换器的另一个特点是具有一个可接收标准逻辑脉冲,控制LED阵列亮度的DIM引脚,使得LM3407成为精密功率LED驱动器或者恒流源的理想器件。  4 软件设计  本程序采用模块化设计思想,以主程序为核心设置了2个功能模块子程序,使一些功能在子程序中实现,简化了设计结构。运行过程中通过主程序调用个功能模块子程序。  该系统有2个功能模块:1是AD转换模块;2是PWM产生模块。在主函数中直接调用就可以了,大大简化了设计结构。其系统的流程图见图6。  5 结论  经过实验验证,此系统达到了很好的节能和改善照明环境的效果。既消除了居民楼道声控灯的扰民问题,又解决了能及时关灯大大节省能源的问题,选取的LED灯更是被称为“21世纪的绿色光源”。  该系统结构简单,实用性强。可适用于公寓,图6系统的总体流程图办公楼的楼道灯,卫生间的照明灯等,可以达到很好的照明,节能,环保的效果。

    时间:2019-01-18 关键词: 系统 智能 单片机 stc 嵌入式处理器

  • AVR、STC及51单片机的比较

    STC是改进型51。内部的EEPROM,对于参数的保存还是很方便的,EMC性能也要好一点,价格也相对便宜。 1、AVR单片机与8051的比较 AVR与8051主要区别是内核不同,指令集不同,io结构不同,外设不同。 AVR单片机比8051的硬件资源多得多,AVR单片中的MEGA系列内部还有AD转换器,在一些简单的电路中,有了AVR单片机就甚至是零外部元件了,使用非常方便,是主流的单片机,而价格又不贵! ATMEL公司的AVR单片机,是增强型RISC内载FLASH的单片机,芯片上的FLASH存储器附在用户的产品中,可随时编程,再编程,使用户的产品设计容易,更新换代方便。AVR单片机采用增强的RISC结构,使其具有高速处理能力,在一个时钟周期内可执行复杂的指令,每MHz可实现1MIPS的处理能力。AVR单片机工作电压为2.7~6.0V,可以实现耗电最优化。 2、STC与51 STC是改进型51,内部的EEPROM,对于参数的保存还是很方便的,EMC性能也要好一点,价格也相对便宜。 3、8051单片机 8051单片机最早由INTEL公司推出,其后,多家公司购买了8051的内核,使得以8051为内核的MCU系列单片机在世界上产量最大,应用也最广泛。 4、MICROCHIP单片机 MICROCHIP单片机的主要产品是PIC 16C系列和17C系列8位单片机,CPU采用RISC结构,分别仅有33,35,58条指令,采用Harvard双总线结构,运行速度快,低工作电压,低功耗,较大的输入输出直接驱动能力,价格低,一次性编程,小体积。

    时间:2018-11-21 关键词: AVR 51单片机 stc

  • 关于STC单片机的几点建议

    STC主要依靠高校学生市场和超低端小批量市场(51系列在工业用单片机上的份额并不大)生存多年,出了这么多产品。而且那个神奇的ISP工具越做越像客户端,也许有一天STC把编译器做进去,直接就在下载工具里面写程序了。STC最大的优势,就是超低的学习成本,就像一架高性能的教练机一样,非常适合作为单片机爱好者学习的入门机型。虽然这样导致了注定很难有惊艳的设计或者产品(不代表没有),但是低端市场也是市场,而且很大。这样的市场有这样的需求,STC满足了这个需求就很好,就像广场舞满足了普通大众的娱乐需求。51系列中,STC用的是最多的。但问题是:1、51的最大好处无非就是学习资料众多,学习条件比较好,但51单片机性能偏弱且价格高,因此性价比其实并不好。2、现在比较热门的是STM8或STM32,大有代替51之势,它的价格比STC51更便宜,性能也强得多(特别是STM32,性能非常高,根本不是STC这种8位单片机能比得了),稳定性也好。其他的还有PIC、AVR、MSP430系列单片机,飞思卡尔(去年已经被高通收购)也是很不错的单片机,工业上也有一定应用。3、另外一大领域是专用的工业用单片机,这种单片机往往突出某个方面的性能,比如AD,而简化了其他性能,但好处是价格非常便宜。但这种单片机资料往往要少得多,烧写器等都是专用的,比较贵,不适合学习者而更适合工业化大批量生产。比如三星、义隆、合泰的一些单片机都是这样,他们比51更便宜,性能上在自己的强项上一点不比51弱。4、说51好的,一般都是高校学生,毕业之后的人很少这么说。STC虽然性价比在51系列中算突出的了,但也有自身的缺陷,就是稳定性差,抗干扰能力比较弱(这也是它为何那么便宜,而很多上规模的正规企业不愿意用STC的关键原因。ATMEL公司的51 稳定性上要比STC好,但价格贵,功能弱)。5、个人理解,如果你要学单片机,51起步是很不错的,先学汇编把硬件底层搞熟,然后转到C语言编程(汇编扎实,转到C语言轻而易举,直接学C,表面上看进度很快,但实际上基础很不牢固,以后要吃苦头)。等51熟悉了之后,转到另外更实用,功能更强的单片机比如STM8,是一种比较好的途径。

    时间:2018-11-02 关键词: 单片机 stc

  • 基于STC串口通信和VC6.0MFC编程的电子琴设计

    基于STC串口通信和VC6.0MFC编程的电子琴设计

    电子实训课程实验项目                      --电子琴【前言】       为进一步激发学生对于硬件编程的兴趣而开展的课程“电子实训”课程到目前为止已经要告一段落了。将近四周的时间,从电路板印刷、贴片参观,到自己亲手将原件焊接到电路板上,再到一步一步熟悉STC编程当中的技巧,我们渐渐对硬件编程有了初步的认识,虽然并不一定能完成什么高级的设计,但是对目前所涉及到的数码管、LED、拨码开关、中断、定时器、传感器的应用已经有了初步认识,也可以写出一些简单的应用。为验证十几天的学习成果,每个人都会根据给出的53个例程当中选择自己比较熟悉或者擅长的方面进行一个创新设计或者扩展设计,也或者融合多个方面。   我完成的项目是一个“电子琴”,基于工程“电子音乐”改编而来,不过也做出了很多的改变,也增加了一些东西,使得整个项目看起来还算不错。【实验目的与要求】1、   熟练掌握定时器的应用,以及如何通过定时器驱动蜂鸣器发出一定频率的声音,掌握简谱与定时器重装值之间的关系,能够实现蜂鸣器谱乐;2、   熟悉下位机编程,usb转串口原理应用,相关寄存器的使用,并且实现该功能,为上、下位机通信奠定基础;3、   熟悉上位机编程方法,可以参考相关资料,设计并实现上位机;【设计概要】本案例的设计主要可以分为两个部分,上位机部分的设计和下位机部分的设计上位机:   案例的上位机是用MFC以及MFC中的串口控件来完成的。上位机中共有8个按键,一个下拉框,三个复选框,七个按键完成对音符频率的选择,对应简谱中的DO,RE,MI,FA,SO,LA,XI,每当一个按键被按下的时候,上位机会通过串口将一个字节发送到单片机,在发送的时候,上位机会检测被选中的复选框,若选中的是“低八度”,则会发送低八度对应的音节;若选中的是“中八度”,则会发送中八度对应的音节,高八度也类似。下拉框控制的是串口号的选择,列出了电脑主机所配置的串口号,串口号下面有一个“打开窗口”的按钮,当点击的时候,上位机会检测下拉框中选择的串口号,并将其对应的串口号打开。在点击的同时,上位机会设置串口的相关属性值,m_ctrlComm.SetSettings("9600,n,8,1");设置串口波特率为9600,无校验位,8个数据位,1个停止位,并设置以二进制方式捡取数据,清空缓冲区。下位机:  下位机设计的重要部分在于串口和蜂鸣器两个部分。串口部分使用的是串口1中断,串口1中断使用TH1和TL1作为串口中断的计时器,使用TL1=(65536-(Machine_Focs/4/BAUD1));TH1=(65536-(Machine_Focs/4/BAUD1))>>8作为重装值,当串口发生中断的时候,会触发中断处理程序。中断处理程序中会将已经转换成1的RI端口和TI端口转换成0,返回源程序,开始下一次中断的历程,并且会触发playmusic函数,将display中的音节在蜂鸣器中播放。测试方法:(1)打开“piano”工程文件,找到“hex”文件;(2)打开ISP下载器,选中该“hex文件”,选中对应的端口,点击下载;(3)下载完成,打开上位机“test.exe”,选中对应的端口,点击“打开串口”;(4)串口打开,选中对应的音阶,低八度,中八度,或者高八度,然后点击按钮,蜂鸣器发出声音;(5)测试完成; 【实验原理】1、实验原理图(1)无源蜂鸣器电路原理图                             (2)芯片相关引脚图 (3)单片机下载电路 2、USB转串口原理:单片机集成了USB转串口模块,对应使用RXD线接收数据,用TXD发送数据。每个串口由2个数据缓冲器(相互独立1收1发)、一个移位寄存器(一字节数据一位一位发送出去)、一个串行控制器和一个波特率发生器(这个比较重要,结合相关的定时器)组成。对应发送、接收数据完成(RI、TI硬件置1)都会触发串口中断,但是无法确定是哪个触发的,所以在串口中断中我们要判断是接收数据产生的中断还是发送数据产生的中断,对于发送数据产生的中断,我们要软件将TI清0,并将数据就绪标志清0,允许下一字节数据发送,发送数据函数中通过while循环,等待发送数据准备就绪,完了将就绪的数据复制给SBUF;对于接收数据产生的中断,我们要软件将RI清0,并从SBUF中读取数据。3、蜂鸣器原理:本实验板采用的是无源蜂鸣器,无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。相比与有源蜂鸣器,无源蜂鸣器的优点在于价格便宜,可以通过控制其振动频率来改变发出的声音,做出“多来米发索拉西”的效果。因此,无源蜂鸣器可以用于音乐的播放。而有源蜂鸣器的优点在于使用简单,不需要编写“乐谱”。本实验板使用的无源蜂鸣器是电磁式蜂鸣器,电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,接收到的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。蜂鸣器部分每个音符都有自己对应的频率,每个频率也多有自己对应的简谱码,每一个简谱码都对应了一个计时器重装值,比如说低1DO频率是262Hz,则振动周期T=1000ms/262Hz=3.817ms,要求定时器在3.817ms会产生一个周期振动,由于一个周期振动是两次电平变化,而每一次定时器中断只有一次电平变化,所以要将定时器设置成1.908ms震动一次,也就是1908us,因此可以得到定时器重装值为65536-1908=63628。 【源码展示与说明】下位机部分:/*文件名称piano.c通过串口用上位机控制单片机上面的蜂鸣器发出不同频率的声音*/#include"STC15F2K60S2.H"//宏定义#defineuchar unsigned char#defineuint unsigned int #defineMachine_Focs 11059200L             //晶振频率 11.0592MHz#defineBAUD1 9600                        //波特率,这里使用的是9600 sbitLED_SEL=P2^3;sbitbeep=P3^4;                            //蜂鸣器引脚uchartimeh,timel;                         //定时器的重装值 /*收发数据相关*/uchardisplay;                            //单片机上SBUF缓冲的数据ucharflag;intcount=0;                              //计数器,用来分频ucharduanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};                                          //段选信号,选择0-f/*蜂鸣器振动频率相关*/ucharcode quzi[] ={                      //此数组作为各个音符在定时器中的重装值//低八度0xf8,0x8c,0xf9,0x5b,0xfa,0x15,0xfa,0x67,0xfb,0x04,0xfb,0x90,0xfc,0x0c,//中八度0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,0xfd,0xc8,0xfe,0x06,//高八度0xfe,0x22,0xfe,0x56,0xfe,0x6e,0xfe,0x9a,0xfe,0xc1,0xfe,0xe4,0xff,0x03};/***************************************************************曲调****************************************************************/ucharquyin(uchar tem){    uchar qudiao,jp,weizhi;       //定义曲调,音符,位置    qudiao=tem/16;                //高四位为是曲调值    jp=tem%16;                    //低四位是音符    if(qudiao==1)                 //当曲调值为1的时候,低八度,低八度在quzi数组中的基址为0    qudiao=0;    else if(qudiao==2)            //当曲调值为2的时候,中八度,中八度在quzi数组中的基址为14       qudiao=14;    else if(qudiao==3)            //当曲调值为3的时候,高八度,高八度在quzi数组中的基址为28        qudiao=28;    weizhi=qudiao+(jp-1)*2;       //基址加上偏移量得到音符对应数组中的位置    return weizhi;                //返回位置值}/**********************函数名称:void delay(unsigned int xms)功能描述:延时入口参数:xms:输入需要延时的毫秒值出口参数:无***********************/voiddelay(uint xms){    uint i;    for(; xms>0; xms--)                          for(i=114; i>0; i--)       {}}   /**********************函数名称:Timer0功能描述:定时器0的中断响应函数,用来控制蜂鸣器***********************/voidTimer0() interrupt 1    {    count++;    if (count==4)    {       count=0;    }    TH0=timeh;    TL0=timel;    if(flag==1&&count==3)              //四分频    {     beep=~beep;    }}/**************************************************************函数名称:Uart1_Init功能描述:初始化串口中断***************************************************************/voidUart1_Init(void){    AUXR=0X80;                                //辅助寄存器,使T0x12=1,此时不分频    SCON|=0X50;                               //SM0=0,SM1=1,串口以方式1工作,8位Uart,串行口1用定时器1作为其波特率发生器且定时器1工作于模式0;REN=1,开启串口接收    TL1=(65536-(Machine_Focs/4/BAUD1));    TH1=(65536-(Machine_Focs/4/BAUD1))>>8;    AUXR|=0X40;                               //使T0x12=1,此时不分频    RI=0;                                     //接收终端标志位    TI=0;                                     //发送中断标志位    TR1=1;                                    //启动的定时器1    ES=1;                                     //串口中断允许位    EA=1;                                     //总中断允许位}/**************************************************************函数名称:Init功能描述:完成各部分功能模块的初始化***************************************************************/voidInit()                                   //初始化操作{    P3M0=0x00;                                //推挽模式    P3M1=0x00;    P2M0=0xff;    P2M1=0x00;    P0M0=0xff;    P0M1=0x00;    TMOD=0x01;                                //定时器0,方式1,要求每一次中断之后手动重装    ET0=1;                                    //开启定时器0中断    EA=1;                                    //开启总中断    TH0=0x00;    TL0=0x00;    TR0=1;                                     //启动定时器0    beep=0;                                   //蜂鸣器初始化0    flag=0;    P0=0;    Uart1_Init();                             //串口中断    display = 0x00;                            //初始化数据缓冲器    LED_SEL=0;                                //设置数码管显示状态}/**********************函数名称:void playmusic()功能描述:播放音乐***********************/voidplaymusic(uchar p)                       //p为音节{    uchar tem;                                      tem=quyin(p);                              //找到p音节在quzi数组中的位置    timeh=quzi[tem];                           //音节重装值的高八位    timel=quzi[tem+1];                        //音节重装值的低八位    TR0=1;                                    //开启定时器0中断    delay(0x10*180);                          //延时一个节拍     TR0=0;                                    //关闭定时器0中断}/*************************************************************串口1中断相应程序**************************************************************/voidUart1_fun() interrupt 4{    if(RI)                                   //接受完数据以后,RI自动转1    {       flag=1;       RI=0;       display=SBUF;       //TR0=1;       playmusic(display);    }    //if(TI)                                  //接受完数据以后,RI自动转1    //{       //TI=0;       //Uart1_Sendbusy=0;    //}}/**************************************************************主函数***************************************************************/voidmain()                                     {    Init();       while(1){}                                //执行死循环} 上位机部分:int nIndex =m_chuankou_select.GetCurSel();CString strCBText;m_chuankou_select.GetLBText(nIndex,strCBText);用来控制从下拉框m_chuankou_select中获得已经选择的串口号,并且将其存储在字符串strCBText中;if(strCBText=="")       AfxMessageBox("请选择串口");    else if(strCBText=="com1")       m_ctrlComm.SetCommPort(1);    else if(strCBText=="com2")       m_ctrlComm.SetCommPort(2);。。。。。。用来打开strCBText对应的串口号m_ctrlComm.SetSettings("9600,n,8,1");//波特率9600,无校验,8个数据位,1个停止位   m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据 m_ctrlComm.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 设置串口属性UpdateData(TRUE); //读取编辑框内容    if(flag==3)       m_ctrlComm.SetOutput(COleVariant((CString)0x31));//发送数据    else if(flag==2)       m_ctrlComm.SetOutput(COleVariant((CString)0x21));//发送数据    else if(flag==1)       m_ctrlComm.SetOutput(COleVariant((CString)0x11));//发送数据    else       AfxMessageBox("请选择一个音阶"); 控制发送高中低八度的DO,其他音节类似CStringstr[]={"com1","com2","com3","com4","com5","com6","com7","com8","com9"};    ((CComboBox*)GetDlgItem(IDC_chuankou_select))->ResetContent();    CString defaultstr=str[0];    SetDlgItemText(IDC_chuankou_select,defaultstr);    for(int i=1;i    {       ((CComboBox*)GetDlgItem(IDC_chuankou_select))->AddString(str[i]);    }填充下拉框【实验总结】1、   接收中断自动置1的问题:在串口传输的过程当中,使用RXD接收上位机传过来的数据,使用TXD传出数据,每当数据发送完成,TI会自动置位为1,请求接收中断处理;每当数据接收完成,RI会自动置位为1,请求发送中断处理,由于TI和RI以“或”逻辑关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理,因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件置零,否则将出现一次请求多次向英的错误。这里采用的是在中断处理程序中进行软件置位,也就是每一次中断结束时检测中断的类型,进而对对应的中断标志位进行置位。2、   音节的节拍的完成:即控制某一频率的震动在某一指定时间内完成。这一功能是通过控制定时器0的开关实现的,即当单片机接收到串口数据时,会执行playmusic函数,在默认情况下,定时器0开关TR0=0是关闭状态,执行playmusic的同时,打开定时器开关TR0=1,中间延时0x10*180ms一个节拍,延时结束后将定时器控制TR0置0,等待下一次输入。由于在之前的“电子音乐”工程当中是用数组存储音节和节拍的,每两个字节决定一个音阶和一个节拍,在串口中一次只能传输一个字节,所以如果要实现节拍功能就会给用户带来很多不便,所以在这里舍去了节拍的选择,转而采用固定的一个节拍。【实验心得】1、   单片机使用c语言进行编程,这样给嵌入式开发者带来了很大的方便,毕竟我们最初接触到的语言就是c语言,不过和之前的c语言编程相对比,现在编程语句结构相对分散或者说是独立而不像之前的编程当中体现的非常强的逻辑,但是由于新加入的中断定时器等会再各个结构之间产生影响,仍然需要非常注意,特别是对于中断概念的理解,可以参考“深入理解计算机系统”这本书;2、   要多编程,了解各个引脚,寄存器的用法、功能。虽说我们做硬件编程的时候可以随时查找数据手册寻找需要的知识,但是如果能记住这些寄存器、引脚的分布、用法,无疑会给硬件编程带来非常大的方便,这就要求我们多编程,才能比较好的掌握;3、   stc硬件编程入门很容易,也就是说很容易便可以掌握stc板的一些基本用法,像是数码管、led、定时器等等,但是要编出比较强大好用的硬件程序,就必须多去了解各种中断用法、编程技巧等,并且这些知识经验只能靠自己在编程的过程中发现,不是任何老师可以教授的,所以,学习单片机,要亲力亲为。

    时间:2018-10-12 关键词: stc 串口通信 电子琴 mfc

  • 关于STC单片机IO口的状态

     新入职一个公司,做智能家居的,只用宏晶51单片机。好长时间没搞了,今天就遇到一个问题之前没遇到过,就是配置IO口的工作类型。 数据手册里面是这样说的,在此多说一句,数据手册做的真烂。 这里举个例子。 如果给P1M1赋值0X03,给P1M0赋值0X05,那么P1口各个引脚对应的模式就是: { P1M1=0x03=00000011b P1M0=0x05=00000101b } P1M1 P1M0 IO口模式0 0 P1.7准双向口0 0 P1.6准双向口0 0 P1.5准双向口0 0 P1.4准双向口0 0 P1.3准双向口0 1 P1.2推挽输出1 0 P1.1高阻1 1 P1.0开漏

    时间:2018-08-07 关键词: 单片机 stc

  • 适合于STC单片机的EEPROM读写程序

    程序经过测试,可以直接引用就可以。欢迎大家下载使用。12C5AS32单片机测试过。EEPROM。H文件。。。#ifndef_EEPROM_H_#define_EEPROM_H_#include#defineuint16unsigned int#defineuint8 unsigned char//----------------------------------------------------//STC单片机IAP定义sfrIAP_DATA = 0xC2;sfrIAP_ADDRH = 0xC3;sfrIAP_ADDRL = 0xC4;sfrIAP_CMD = 0XC5;sfrIAP_TRIG = 0xC6;sfrIAP_CONTR = 0xC7;#defineISP_IAP_BYTE_READ1//字节读#defineISP_IAP_BYTE_PROGRAM2//字节编程#defineISP_IAP_SECTOR_ERASE3//扇区擦除#defineWAIT_TIME0//等侍时间#defineENABLE_IAP0x83//----------------------------------------------------uint8 Read_IAP(uint16 Adres);void Write_IAP(uint8 Value,uint16 Adres);voidSector_Erase_IAP(uint16 Sector);voidDISAble_IAP(void);#endifEEPROM。C文件。/*--------------------------------------------------------------------------------------------------------*/#include"EEPROM.h"//---------------------------------------------IAP处理部分开始---------------------------------------//--------------------------------------------------//读取IAP数据并返回//ADRES = 需要读出数据的地址//调用:关闭IAP功能函数//--------------------------------------------------uint8 Read_IAP(uint16 Adres){uint8 Value = 0;IAP_CONTR = ENABLE_IAP;//打开IAP功能IAP_CMD = ISP_IAP_BYTE_READ;//读IAPIAP_ADDRH = Adres >> 8;//取高位地址IAP_ADDRL = Adres &0x00FF;//取低位地址//EA = 0;//关中断IAP_TRIG = 0x5A;//触发寄存器IAP_TRIG = 0xA5;//IAP触发启动nop();Value = IAP_DATA;//读取字节数据//EA = 1;Disable_IAP();//关闭IAP功能return Value;}//--------------------------------------------------//字节编程//Value = 需要写进IAP内部的数据//ADRES = 需要写入数据的地址0//调用关闭IAP功能函数//--------------------------------------------------void Write_IAP(uint8 Value,uint16 Adres){IAP_CONTR = ENABLE_IAP;//打开IAP功能IAP_CMD = ISP_IAP_BYTE_PROGRAM;//字节编程IAP_ADDRH = Adres>>8;//取地址位IAP_ADDRL = Adres &0x00FF;IAP_DATA = Value;//写入数据//EA = 0;IAP_TRIG = 0x5A;//触发IAP功能IAP_TRIG = 0xA5;nop();//EA = 1;Disable_IAP();//关闭IAP功能}//--------------------------------------------------//擦除扇区功能//Sector = 需要擦除的扇区地址//调用函数:关闭IAP功能函数//--------------------------------------------------voidSector_Erase_IAP(uint16 Sector){IAP_CONTR = ENABLE_IAP;IAP_CMD = 0x03;IAP_ADDRH = Sector >>8;IAP_ADDRL = Sector & 0x00FF;//EA = 0;IAP_TRIG = 0x5A;IAP_TRIG = 0xA5;nop();//EA = 1;Disable_IAP();}//--------------------------------------------------//关闭IAP功能//--------------------------------------------------voidDisable_IAP(void){IAP_CONTR = 0;IAP_CMD = 0;IAP_TRIG = 0;IAP_ADDRH = 0xFF;IAP_ADDRL = 0xFF;}//---------------------------------------------IAP处理部分结束---------------------------------------/*--------------------------------------------------------------------------------------------------------*/

    时间:2018-07-02 关键词: 单片机 程序 stc eeprom

  • STC单片机PWM程序设计与应用

    /*==============================================================at12c2052所带的PWM功能演示,内部公用了一个定时器,当启动PWM时PCA定时器只工作在8位模式,匹配比较器也是按8位的。本程序演示了PWM启动的设置和调节。改用在tasking c51下面编译,并尝试了tasking 方便的在线汇编方式===============================================================*/#include "STC12C2052AD.h"/*#include*/#define uintunsigned int#define ucharunsigned charuint i;uchar upordn;/* 升降标志,1=上升 */void initall(void);_interrupt(1) void timers0(void);_interrupt (6) void PCA_LVD(void);void initall(void){TMOD= 0x11;/* 0000 0001 T0作为16位计数器*/TH0 = 0xc0;/* 定时器0初始值装入*/TL0 = 0x00;ET0 = 1;//开中断IE |= 0x40;/* 使能PCA定时功能*/EA= 1;AUXR = 0x80;/* 1000 0000|||| ||++-保留|||| |+---低电压中断允许:0=禁止,1=允许,5V..3.7V,3V..2.4V以下|||| +----SPI中断允许位:0=禁止,1=允许|||+------ADC中断允许位:0=禁止,1=允许||+-------串口模式0时时钟设定:0=传统1/12, 1=1/2 2分频;"+--------定时器ct1时钟源设定:0=传统1/12,1=1:1不分频;+---------定时器ct0时钟源设定:0=传统1/12,1=1:1不分频;*/P1 = 0xff;P1M0 = 0x00;/* P1口用传统51准双向口模式 */P1M1 = 0x00;CMOD = 0x03;/* 内部时钟,Fosc/2, PCA计数溢出中断使能*//* 0000 0011 PCA 模式寄存器|||| |||+--ECF...PCA计数溢出中断使能:ECF=1时,使能寄存器CCON CF位的|||| |||中断。ECF=0时,禁止该功能。|||| |++---CPS1,CPS0 选择PCA 时钟源输入(PCA计数脉冲选择)|||| |000,内部时钟,Fosc/12|||| |011,内部时钟,Fosc/2|||| |102,定时器0溢出,由于定时器0可以工作在1T方式,|||| |所以可以达到计一个时钟就溢出,频率反而|||| |是最高的,可达到Fosc|||| |113,ECI/P3.4脚的外部时钟输入(最大速率=Fosc/2)|+++-+-----保留+----------CIDL...计数器阵列空闲控制:CIDL=0时,空闲模式下PCA计数器继续工作。CIDL=1时,空闲模式下PCA计数器停止工作。*/CH = 0x00;/* PCA计数器初始值高8位 */CL = 0x00;/* PCA计数器初始值低8位 */CCAP0H = 0x00;/* 当出现捕获或比较时,它们用来保存16 位的计数值。当PCA 模块用在PWM 模式中时,它们用来控制输出的占空比。CCAP0H.CCAP0L分别为高低8位,组合使用*/CCAP0L = 0x00;CCAP1H = 0x00;/* 当出现捕获或比较时,它们用来保存16 位的计数值。当PCA 模块用在PWM 模式中时,它们用来控制输出的占空比。CCAP1H.CCAP1L分别为高低8位,组合使用*/CCAP1L = 0x00;CCAPM1 = 0x4c;/* PCA 比较/捕获模块寄存器1作为16位软件定时器。使能比较器,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF1,使能CCF1中断 *//*0100 1100功能说明|||| |||+---ECCF1.. 使能CCF1中断。使能寄存器CCON的比较/捕获标志CCF1,|||| |||用来产生中断。|||| ||+----PWM1... 脉宽调节模式。当PWMn=1时,使能CEXn脚用作脉宽调节输出。|||| |+-----TOG1... 翻转。当TOG1= 1时, PCA计数值与模块的比较/捕获寄存|||| |器的值的匹配将使CEXn脚翻转。(CEX1/P3.5)|||| +------MAT1... 匹配。当=1时, PCA计数值与模块的比较/捕获寄存器的值||||的匹配将置位CCON寄存器的中断标志位CCF1。|||+--------CAPN1.. 负捕获。CAPN1= 1时使能下降沿捕获。||+---------CAPP1.. 正捕获。CAPP1= 1时使能上升沿捕获。|+----------ECOM1.. 使能比较器。ECOM1= 1时使能比较器功能。+-----------CCAPM1^7保留使用的机种基本模式组合:ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1模块功能0000000无此操作X10000X16位捕获模式,由CEX1的上升沿触发X01000X16位捕获模式,由CEX1的下降沿触发X11000X16位捕获模式,由CEX1的跳变触发100100X16位软件定时器100110X16位高速输出10000108位PWM*/CCAPM0 = 0x42;/* PCA 比较/捕获模块寄存器0作为16位软件定时器。使能比较器,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF0,使能CCF0中断 寄存器位功能同上*/CR = 1;//Start PCA Timer.TR0 = 1;//启动计时i = 0;upordn = 1;}/* ------------- 定时器0用来定时调节PWM的输出占空比 ------------- */_interrupt(1) void timers0(void){TL0 = 0x00;TH0 = 0xc0;CCAP0H = i>>8;/* CCAP0L不用赋值,他不参与工作 */if(upordn)/* 逐步加宽PWM、加快脉冲输出*/{if(++i==65535)/* 到头 */{upordn=0;/* 调头 */}}else/* 逐步减窄PWM、减慢脉冲输出*/{if(--i==0)/* 到头 */{upordn=1;/* 调头 */}}P1 = ~(i>>8);/* 高8位输出LED指示,作监视用*/}/* ------------ PCA 定时中断,负责清除溢出标志并赋初值 ------------- *//* 摇晃编程板可以看到P3.5连接的led闪亮频率的缓慢变化,虚线在变长变短 */_interrupt (6) void PCA_LVD(void){CH = i>>8;CL = i&0xff;CF = 0;CCF0 = 0;//LedPCA ^= 1;/* 频率要求不高的时候这里可以插入用户代码 */}void main(void){initall();// 测试tasking c51的在线汇编功能#pragma asmmov r0,#0f0hv1:nopnopdjnz r0,v1nop#pragma endasm// 编译很顺利通过,不用作任何附加的设定while(1){};}

    时间:2018-07-02 关键词: 单片机 stc pwm

  • STC单片机AD和EEPROM的程序设计C代码

    /*----------------------------------------------------------------*File Name: stc_AD.c -*Description:A/D转换程序*Project: -*MCU type: STC12C5410AD - -*Company: WY -*Compiler: KEIL C51 -*DESINER: 郭准 06.2.7 ------------------------------------------------------------------------*/#include //定义的系统头文件和全局变量/*A/D SFR*/sfr ADC_LOW2 = 0xBE;sfr ADC_CONTR = 0xC5;sfr ADC_DATA = 0xC6;sfr CLK_DIV = 0xC7; //////////定义变量uchar code display_AD_channel_ID[2] = {0x00,0x01};uchar data AD_channel_result[2][5]; //各通道A/D转换结果。前是通道号;后是转换的值//定义引用外部extern void Delay(uint number);//晶振=11059200,机器周期=1.085069444us,"加"的机器周期=1extern void send_char_com(uchar ch);extern void send_string_com(uchar *str,uchar strlen);void Ad_Change(uchar channel);//------------------------------------------------------//功能:A/D转换//入口:channel = 通道号 .0:0通道;1:1通道。。。。。。。//出口:AD_channel_1_result: 10位的数据,16进制。//设计:郭准,伟业,2006/2/7//------------------------------------------------------void Ad_Change(uchar channel){uint AD_Result_Temp = 0 ;//---------------------将P1.0--P1.1设置成适合AD转换的模式/// P1 = 0xff; //将P1口置高,为A/D转换作准备ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源P1M0 = 0x03; //0000,0011用于A/D转换的P1.x口,先设为开漏P1M1 = 0x03; //0000,0011P1.0--P1.1先设为开漏。断开内部上拉电阻Delay(20); //20ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位ADC_CONTR = ADC_CONTR|(display_AD_channel_ID[channel]&0x07); //设置当前通道号Delay(1); //延时使输入电压达到稳定ADC_DATA = 0; //清A/D转换结果寄存器ADC_LOW2 = 0; ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换do { ; } while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换AD_Result_Temp = ((AD_Result_Temp|ADC_DATA)

    时间:2018-07-02 关键词: ad 单片机 stc eeprom

  • STC单片机AD转换程序设计

    #include #include sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器sfr ADC_DATA = 0xC6; //A/D转换结果寄存器sfr P1M0=0x91;sfr P1M1=0x92; #define uchar unsigned char ;#define uint unsigned int ;void delay(uchar delay_time) // 延时函数{ uchar n; uint m; for (n=0;n

    时间:2018-06-29 关键词: ad 单片机 stc

  • STC单片机AD转换,外部触发,数码管显示电路

    #include sfr ADC_CONTR=0xC5;/*A/D转换寄存器*/sfr ADC_DATA=0xC6;/*A/D 转换结果寄存器, 为10 位 A/D 转换结果的高8 位*/sfr ADC_LOW2=0x0BE;/*A/D 转换结果寄存器, 低2 位有效, 为10 位 A/D 转换结果的低2 位*/sfr P1M0=0x91;//P1 口模式选择寄存器0sfr P1M1=0x92;//P1 口模式选择寄存器1#define ADCPowerChannel_7 0xE7;/*P1.7 作为A/D 输入11100111B*/unsigned char ADC_Channel_7_Result;/*7 通道A/D 转换结果*/unsigned char ADC_Channel_72_Result;/*通道A/D 转换结果低2位*/unsigned char dis_0 ; // 个位值unsigned char dis_1 ; // 十位值unsigned char dis_2 ; // 百位值unsigned char dis_3; // 千位值unsigned char dis_4; // 万位值unsigned code dis_code1[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表 0 1 2 3 4 5 6 7 8 9unsigned code dis_code[10]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Delay(unsigned i) //;延时子程序{ unsigned a,b; for(a=i;a>0;a--) for(b=248;b>0;b--);}void ADC_Power_On(void) //开ADC电源, 第一次使用时要打开内部模拟电源开ADC 电源{ ADC_CONTR=ADC_CONTR|0x80; Delay(20);}void Set_P17_Open_Drain() //设置P1.7,设置A/D 通道所在的I/O 为开漏模式{ P1M0=0x80;//#10000000B P1M1=0x80;}void Set_ADC_Channel_7() // 设P1.7 作为A/D 转换通道{ ADC_CONTR=ADCPowerChannel_7; Delay(10);}void Set_P12_Normal_IO() //设置 P1.7 为普通IO{P1M0=0x7F;//01111111BP1M1=0x7F;}void Get_AD_Result() //;AD转换{ unsigned i="1"; ADC_CONTR=ADC_CONTR|0x08;//启动 AD 转换00001000B do{;} while((ADC_CONTR&0x10)==0);// 判断 AD 转换是否完成00010000B ADC_CONTR=ADC_CONTR&0xE7; //清0 ADC_FLAG, ADC_START 位, 停止A/D 转换 ADC_Channel_7_Result=ADC_DATA;//保存 AD 转换结果高8位 ADC_Channel_72_Result=ADC_LOW2;//保存 AD 转换结果低2位}void Deal_AD_Result() //10位高8与低2存储调整结果存入dis_0-dis_4变量{unsigned char q;unsigned int P; //调整结果存入dis_0-dis_4变量q=ADC_Channel_7_Result; //10位高8与低2存储调整ADC_Channel_7_Result=ADC_Channel_7_Result6;P=ADC_Channel_7_Result*256+ADC_Channel_72_Result;dis_4=P/10000;//存入dis_0-dis_4变量dis_3=(P-dis_4*10000)/1000;dis_2=(P-dis_4*10000-dis_3*1000)/100;dis_1=(P-dis_4*10000-dis_3*1000-dis_2*100)/10;dis_0=P-dis_4*10000-dis_3*1000-dis_2*100-dis_1*10;}void DisPlay(){ P1=0xFF; P1 = dis_code[dis_0]; // 取个位的段码 P3 = 0x01; // 开个位显示(P2.7口控制个位数码管) Delay(4); // 延时1ms使四位数码管动态显示时能看清 P1=0x80; P1 = dis_code[dis_1]; // 取十位的段码 P3 = 0x02; // 开十位显示(P2.6口控制十位数码管) Delay(4); // 延时1ms作用同上 P1=0x80; P1 = dis_code[dis_2]; // 取百位的段码 P3 = 0x04; // 开百位显示(P2.5口控制十位数码管) Delay(4); // 延时1ms作用同上 P1=0x80; P1 = dis_code[dis_3]; // 取千位的段码 P3 = 0x08; // 开千位显示(P2.4口控制十位数码管) Delay(4); // 延时1ms作用同上 P1=0x80; P1 = dis_code[dis_4]; // 取千位的段码 P3 = 0x10; // 开千位显示(P2.4口控制十位数码管) Delay(4); // 延时1ms作用同上 P1=0x80;}void int_0() interrupt 0 // 外部中断0中断服务程序{ EA="0";//关中断总开关P1=0xFF; ADC_Power_On();//开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源, 可适当加延时,1mS 以内就足够了 set_P17_Open_Drain();//设置 P1.7为开漏/实际上开 Set_ADC_Channel_7(); //;设置 P1.7 作为A/D 转换通道 while(1){ Get_AD_Result();//测量电压并且取A/D 转换结果//ADC_Channel_7_Result=0x02;//ADC_Channel_72_Result=0x01; Deal_AD_Result() ;//10位高8与低2存储调整结果存入dis_0-dis_4变量DisPlay();//显示到复位 }}void int_1() interrupt 2 // 外部中断1中断服务程序{ /*EA=0;//关中断总开关P1=0xFF; ADC_Power_On();//开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源, 可适当加延时,1mS 以内就足够了 set_P17_Open_Drain();//设置 P1.7为开漏/实际上开 Set_ADC_Channel_7(); //;设置 P1.7 作为A/D 转换通道 while(1){ Get_AD_Result();//测量电压并且取A/D 转换结果//ADC_Channel_7_Result=0x02;//ADC_Channel_72_Result=0x01; Deal_AD_Result() ;//10位高8与低2存储调整结果存入dis_0-dis_4变量DisPlay();//显示到复位 }*/ unsigned char p,q; EA="0";//关中断总开关 P1=0xFF; ADC_Power_On();//开ADC 电源, 第一次使用时要打开内部模拟电源开ADC 电源, 可适当加延时,1mS 以内就足够了 set_P17_Open_Drain();//设置 P1.7为开漏/实际上开 Set_ADC_Channel_7(); //;设置 P1.7 作为A/D 转换通道 Get_AD_Result();//测量电压并且取A/D 转换结果 p=ADC_Channel_7_Result;//比较本次与前次的AD转换值,小于则退出AD转换q=ADC_Channel_72_Result;do {p=ADC_Channel_7_Result;q=ADC_Channel_72_Result;Get_AD_Result(); }while((p>ADC_Channel_7_Result)||((p==ADC_Channel_7_Result)&&(q>ADC_Channel_72_Result)));Set_P12_Normal_IO();//设置 P1.7 为普通IO Deal_AD_Result() ;//10位高8与低2存储调整结果存入dis_0-dis_4变量while(1){DisPlay();//显示到复位}

    时间:2018-06-29 关键词: ad 单片机 stc 数码管

  • STC单片机AD和EEPROM的驱动C程序设计与编写

    stc单片机具有在应用编程,调试起来比较方便;带有10位AD;内部eeprom;可在1T/机器周期下工作,速度是传统51单片机的12倍;下面是我写的AD和EEPROM的驱动C代码:/*----------------------------------------------------------------*File Name: stc_AD.c -*Description:A/D转换程序*Project: -*MCU type: STC12C5410AD - -*Company: WY -*Compiler: KEIL C51 - -----------------------------------------------------------------------*/#include //定义的系统头文件和全局变量/*A/D SFR*/sfr ADC_LOW2 = 0xBE;sfr ADC_CONTR = 0xC5;sfr ADC_DATA = 0xC6;sfr CLK_DIV = 0xC7; //////////定义变量uchar code display_AD_channel_ID[2] = {0x00,0x01};uchar data AD_channel_result[2][5]; //各通道A/D转换结果。前是通道号;后是转换的值//定义引用外部extern void Delay(uint number);//晶振=11059200,机器周期=1.085069444us,"加"的机器周期=1extern void send_char_com(uchar ch);extern void send_string_com(uchar *str,uchar strlen);void Ad_Change(uchar channel);//------------------------------------------------------//功能:A/D转换//入口:channel = 通道号 .0:0通道;1:1通道。。。。。。。//出口:AD_channel_1_result: 10位的数据,16进制。//设计:郭准,伟业,2006/2/7//------------------------------------------------------void Ad_Change(uchar channel){uint AD_Result_Temp = 0 ;//---------------------将P1.0--P1.1设置成适合AD转换的模式/// P1 = 0xff; //将P1口置高,为A/D转换作准备ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源P1M0 = 0x03; //0000,0011用于A/D转换的P1.x口,先设为开漏P1M1 = 0x03; //0000,0011P1.0--P1.1先设为开漏。断开内部上拉电阻Delay(20); //20ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位ADC_CONTR = ADC_CONTR|(display_AD_channel_ID[channel]&0x07); //设置当前通道号Delay(1); //延时使输入电压达到稳定ADC_DATA = 0; //清A/D转换结果寄存器ADC_LOW2 = 0; ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换do { ; } while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换AD_Result_Temp = ((AD_Result_Temp|ADC_DATA)

    时间:2018-06-29 关键词: ad 单片机 stc eeprom

  • STC12C4052AD STC单片机ADC采样C程序

    #include"STC12C4052AD.h"typedefstruct{BOOLRun;//BOOL量作为定时采样标志,比如每隔3秒,置位一次该标志BYTECurch;//当前通道BYTEtempCvData[6];//转换结果临时缓冲 BYTECvTimes;//采样次数采样4次,去最大最小,保留4个取平均值BYTEADData[MAX_ADCH];//MAX_ADCH保存各通道最终采样数据}STADC;STADCADC;voidInitADC(){Uint16i;ADC_CONTR=0xC0;//ADC模块加电,420周期转换一次for(i=0;i

    时间:2018-06-27 关键词: 单片机 stc adc stc12c4052ad

  • 业界七大主流单片机最细剖析

    单片机现在可谓是铺天盖地,种类繁多,让开发者们应接不暇,发展也是相当的迅速,从上世纪80年代,由当时的4位8位发展到现在的各种高速单片机……各个厂商们也在速度、内存、功能上此起彼伏,参差不齐~~同时涌现出一大批拥有代表性单片机的厂商:Atmel、TI、ST、MicroChip、ARM…国内的宏晶STC单片机也是可圈可点…下面为大家带来51、MSP430、TMS、STM32、PIC、AVR、STC单片机之间的优缺点比较及功能体现……51单片机应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。51单片机之所以成为经典,成为易上手的单片机主要有以下特点:特性:1. 从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。2. 同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便,3. 乘法和除法指令,这给编程也带来了便利。很多的八位单片机都不具备乘法功能,作乘法时还得编上一段子程序调用,十分不便。缺点:(虽然是经典但是缺点还是很明显的)1. AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担2. 虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋3. 运行速度过慢,特别是双数据指针,如能改进能给编程带来很大的便利4. 51保护能力很差,很容易烧坏芯片应用范围:目前在教学场合和对性能要求不高的场合大量被采用使用最多的器件:8051、80C51了解8051微控制器全系列产品:全面剖析久经验证的8051架构微控制器MSP430单片机MSP430系列单片机是德州仪器1996年开始推向市场的一种16位超低功耗的混合信号处理器,给人们留下的最大的亮点是低功耗而且速度快,汇编语言用起来很灵活,寻址方式很多,指令很少,容易上手。主要是由于其针对实际应用需求,把许多模拟电路、数字电路和微处理器集成在一个芯片上,以提供“单片”解决方案。其迅速发展和应用范围的不断扩大,主要取决于以下的特点…特性:1. 强大的处理能力,采用了精简指令集(RISC)结构,具有丰富的寻址方式( 7 种源操作数寻址、 4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在 8MHz 晶体驱动下指令周期为 125 ns 。这些特点保证了可编制出高效率的源程序2. 在运算速度方面,能在 8MHz 晶体的驱动下,实现 125ns 的指令周期。 16 位的数据宽度、 125ns 的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的某些算法(如 FFT 等)3. 超低功耗方面,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。电源电压采用的是 1.8~3.6V 电压。因而可使其在 1MHz 的时钟条件下运行时, 芯片的电流会在 200~400uA 左右,时钟关断模式的最低功耗只有 0.1uA缺点:1. 个人感觉不容易上手,不适合初学者入门,资料也比较少,只能跑官网去找2. 占的指令空间较大,因为是16位单片机,程序以字为单位,有的指令竟然占6个字节。虽然程序表面上简洁, 但与pic单片机比较空间占用很大应用范围:在低功耗及超低功耗的工业场合应用的比较多使用最多的器件:MSP430F系列(中文资料)、MSP430G2系列、MSP430L09系列了解MSP430全系类产品:全面直击MSP430微控制器全家族成员TMS单片机这里也提一下TMS系列单片机,虽不算主流。由TI推出的8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复杂的实时控制场合。虽然没STM32那么优秀,也没MSP430那么张扬,但是TMS370C系列单片机提供了通过整合先进的外围功能模块及各种芯片的内存配置,具有高性价比的实时系统控制。同时采用高性能硅栅CMOS EPROM和EEPROM技术实现。低工作功耗CMOS技术,宽工作温度范围,噪声抑制,再加上高性能和丰富的片上外设功能,使TMS370C系列单片机在汽车电子,工业电机控制,电脑,通信和消费类具有一定的应用应用最多的器件:TMS370C256ASTM32单片机由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名…其强大的功能主要表现在:特性:1.内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法2.存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器3.时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振4、调试模式:串行调试(SWD)和JTAG接口。最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口使用最多的器件:STM32F103系列、STM32 L1系列、STM32W系列了解STM32全系类产品:沙场点兵STM32微处理器全系列成员PIC单片机PIC单片机系列是美国微芯公司(Microship)的产品,共分三个级别,即基本级、中级、高级,是当前市场份额增长最快的单片机之一,CPU采用RISC结构,分别有33、35、58条指令,属精简指令集,同时采用Harvard双总线结构,运行速度快,它能使程序存储器的访问和数据存储器的访问并行处理,这种指令流水线结构,在一个周期内完成两部分工作,一是执行指令,二是从程序存储器取出下一条指令,这样总的看来每条指令只需一个周期,这也是高效率运行的原因之一,此外PIC单片机之所以成为一时非常热的单片机不外乎以下特点:特点:1. 具有低工作电压、低功耗、驱动能力强等特点。PIC系列单片机的I/O口是双向的,其输出电路为CMOS互补推挽输出电路。I/O脚增加了用于设置输入或输出状态的方向寄存器,从而解决了51系列I/O脚为高电平时同为输入和输出的状态。2. 当置位1时为输入状态,且不管该脚呈高电平或低电平,对外均呈高阻状态;置位0时为输出状态,不管该脚为何种电平,均呈低阻状态,有相当的驱动能力,低电平吸入电流达25mA,高电平输出电流可达20mA。相对于51系列而言,这是一个很大的优点3. 它可以直接驱动数码管显示且外电路简单。它的A/D为10位,能满足精度要求。具有在线调试及编程(ISP)功能。不足之处:其专用寄存器(SFR)并不像51系列那样都集中在一个固定的地址区间内(80~FFH),而是分散在四个地址区间内。只有5个专用寄存器PCL、STATUS、FSR、PCLATH、INTCON在4个存储体内同时出现,但是在编程过程中,少不了要与专用寄存器打交道,得反复地选择对应的存储体,也即对状态寄存器STATUS的第6位(RP1)和第5位(RP0)置位或清零。数据的传送和逻辑运算基本上都得通过工作寄存器W(相当于51系列的累加器A)来进行,而51系列的还可以通过寄存器相互之间直接传送,因而PIC单片机的瓶颈现象比51系列还要严重,这在编程中的朋友应该深有体会使用最多的器件:PIC16F873、PIC16F877AVR单片机AVR单片机是Atmel公司推出的较为新颖的单片机,其显著的特点为高性能、高速度、低功耗。它取消机器周期,以时钟周期为指令周期,实行流水作业。AVR单片机指令以字为单位,且大部分指令都为单周期指令。而单周期既可执行本指令功能,同时完成下一条指令的读取。通常时钟频率用4~8MHz,故最短指令执行时间为250~125ns。AVR单片机能成为最近仍是比较火热的单片机,主要的特点:特点:1. AVR系列没有类似累加器A的结构,它主要是通过R16~R31寄存器来实现A的功能。在AVR中,没有像51系列的数据指针DPTR,而是由X(由R26、R27组成)、Y(由R28、R29组成)、Z(由R30、R31组成)三个16位的寄存器来完成数据指针的功能(相当于有三组DPTR),而且还能作后增量或先减量等的运行,而在51系列中,所有的逻辑运算都必须在A中进行;而AVR却可以在任两个寄存器之间进行,省去了在A中的来回折腾,这些都比51系列出色些2. AVR的专用寄存器集中在00~3F地址区间,无需像PIC那样得先进行选存储体的过程,使用起来比PIC方便。AVR的片内RAM的地址区间为0~00DF(AT90S2313) 和0060~025F(AT90S8515、AT90S8535),它们占用的是数据空间的地址,这些片内RAM仅仅是用来存储数据的,通常不具备通用寄存器的功能。当程序复杂时,通用寄存器R0~R31就显得不够用;而51系列的通用寄存器多达128个(为AVR的4倍),编程时就不会有这种感觉。3. AVR的I/O脚类似PIC,它也有用来控制输入或输出的方向寄存器,在输出状态下,高电平输出的电流在10mA左右,低电平吸入电流20mA。这点虽不如PIC,但比51系列还是要优秀的…缺点:1. 是没有位操作,都是以字节形式来控制和判断相关寄存器位的2. C语言与51的C语言在写法上存在很大的差异,这让从开始学习51单片机的朋友很不习惯3. 通用寄存器一共32个(R0~R31),前16个寄存器(R0~R15)都不能直接与立即数打交道,因而通用性有所下降。而在51系列中,它所有的通用寄存器(地址00~7FH)均可以直接与立即数打交道,显然要优于前者。使用最多的器件:ATUC64L3U、ATxmega64A1U、AT90S8515STC单片机说到STC单片机有人会说到,STC也能算主流,估计要被喷了~~我们基于它是国内还算是比较不错的单片机来说。STC单片机是宏晶生产的单时钟/机器周期的单片机,说白了STC单片机是51与AVR的结合体,有人说AVR是51的替代单片机,但是AVR单片机在位控制和C语言写法上存在很大的差异。而STC单片机洽洽结合了51和AVR的优点,虽然功能不及AVR那么强大,但是在AVR能找到的功能,在STC上基本都有,同时STC单片机是51内核,这给以51单片机为基础的工程师们提供了极大的方便,省去了学习AVR的时间,同时也不失AVR的各种功能…STC单片机是高速、低功耗、超强抗干扰的新一代8051单片机51单片机,指令代码完全兼容传统8051,但速度快8~12倍,内部集成MAX810专用复位电路。4路PWM 8路高速10位A、D转换,针对电机电机 的供应商控制,强干扰场合,成为继51单片机后一个全新系列单片机…特性:1. 下载烧录程序用串口方便好用,容易上手,拥有大量的学习资料及视频,最著名的要属于杜老师的那个视频了,好多对单片机有兴趣的朋友都是通过这个视频入门的,同时具有宽电压:5.5~3.8V,2.4~3.8V, 低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)2. STC单片机具有在应用编程,调试起来比较方便;带有10位AD、内部EEPROM、可在1T/机器周期下工作,速度是传统51单片机的8~12倍,价格也较便宜 3. 4 通道捕获/比较单元,STC12C2052AD系列为2通道,也可用来再实现4个定时器或4个外部中断,2个硬件16位定时器,兼容普通8051的定时器。4路PCA还可再实现4个定时器,具有硬件看门狗、高速SPI通信端口、全双工异步串行口,兼容普通8051的串口,同时还具有先进的指令集结构,兼容普通8051指令集PS:STC单片机功能虽不及AVR、STM32强大,价格也不及51和ST32便宜,但是这些并并不重要,重要的是这属于国产单片机比较出色的单片机,但愿国产单片机能一路长虹…使用最多的器件:STC12C2052AD(中文资料)Freescale单片机主要针对S08,S12这类单片机,当然Freescale单片机远非于此。Freescale系列单片机采用哈佛结构和流水线指令结构,在许多领域内都表现出低成本,高性能的的特点,它的体系结构为产品的开发节省了大量时间。此外Freescale提供了多种集成模块和总线接口,可以在不同的系统中更灵活的发挥作用!Freescale单片机的特有的特点如下:1.全系列:从低端到高端,从8位到32位全系列应有尽有,其推出的8位/32位管脚兼容的QE128,可以从8位直接移植到32位,弥补单片机业界8/32 位兼容架构中缺失的一环2.多种系统时钟模块:三种模块,七种工作模式。多种时钟源输入选项,不同的mcu具有不同的时钟产生机制,可以是RC振荡器,外部时钟或晶振,也可以是内部时钟,多数CPU同时具有上述三种模块!可以运行在FEI,FEE,FBI,FBILP,FBE,FBELP,STOP这七种工作模式3.多种通讯模块接口:Freescale单片机几乎在内部集成各种通信接口模块:包括串行通信接口模块SCI,多主I2C总线模块,串行外围接口模块 SPI,MSCAN08控制器模块,通用串行总线模块(USB/PS2)4.具有更多的可选模块:具有LCD驱动模块,带有温度传感器,具有超高频发送模块,含有同步处理器模块,含有同步处理器的MCU还具有屏幕显示模块OSD,还有少数的MCU具有响铃检测模块RING和双音多频/音调发生器DMG模块5.可靠性高,抗干扰性强,多种引脚数和封装选择6.低功耗、也许Freescale系列的单片机的功耗没有MSP430的低,但是他具有全静态的“等待”和“停止”两种模式,从总体上降低您的功耗!新近推出的几款超低功耗已经与MSP430的不相上下!使用最多的器件:MC9S12G系列如果真要在这些单片机中分个一二三等,那么如果你想跟随大众,无可厚非51单片机还是首选;如果你追求超高性价比,STM32将是你理想选择;如果你渴望超低功耗,MSP430肯定不会让你失望;如果你想支持国产,STC会让你兴奋…这七大主流单片机到底哪家强?相信现在的你应该知道了吧~~也有朋友会说瑞萨单片机是销量最大的,且在车载电子行业应用较多,稳定性好,但是我个人不怎么喜欢小日本的产品,所以也没用过瑞萨的东西。这个因人而异,但是不可否认它销售量大肯定有可取之处,这点还望同仁们了解~~PS:由于水平有限,可能有些地方写错了或者不全面的,希望各位同仁批评指出,感激涕零~在此感谢Datasheet5提供专业数据手册的支持~~更多关于单片机的技术资讯,欢迎访问 与非网单片机技术专区

    时间:2018-06-20 关键词: freescale pic 单片机 AVR stc 嵌入式处理器

  • 基于STC单片机的太阳能热水器智能节水控制系统设计

    基于STC单片机的太阳能热水器智能节水控制系统设计

    0引言太阳能热水器在北方家庭中应用非常普遍,但是普通的家庭太阳能热水器在节约电能的同时也存在一些缺点。因为一般的太阳能热水器基本放置在楼房的屋顶,从楼顶到出水龙头这一段距离较长,管道中存了大量水,北方的冬季空气比较寒冷,管道中的水温普遍较低。当人们用热水时,通常要将管道中的水排掉,出水龙头距离楼房顶部距离越远,需要排掉的冷水就越多,这部分水在普通家庭中通常会浪费掉。针对这一问题,我们设计出了冬季太阳能节水、蓄水控制系统,具有参数可以人工调节、到达合适温度自动声光报警、水充分利用等特点。安全可靠、成本低廉、节水效果显著。非常适合普通家庭的太阳能热水器,改造成本很低,具有很高的推广价值。1系统整体组成本系统主要有单片机控制模块、温度测量模块、电磁阀控制模块、按键模块、储水箱、抽水泵等组成。当人们需要热水时,按下启动按键,单片机监测管道中水的温度,当水温不超过设定温度时,打开冷水电磁阀,冷水先通过电磁阀流到一水箱中存储起来。当温度超过设定温度时,关闭冷水电磁阀,并同时发出声光报警,提醒人们现在可以利用热水进行洗漱。存储在水箱中的冷水可以利用水泵重新送到太阳能热水器中,也可以用来进行冲洗厕所等用途。系统组成框图如图1所示。图1 系统组成框图2系统主要电路组成本系统以STC15F2K60S2芯片为控制核心,由温湿度传感器SHT10、电磁阀、水温传感器DS18B20和语音提示电路、数码管显示电路、按键电路等部分组成。系统电路组成框图如图2所示。图2 系统电路组成框图2.1主控制器采用STC15F2K60S2单片机作为主控制芯片,这是一种低功耗、高性能的CMOS 8位微控制器,片内大容量2048字节SRAM,内部集成高可复位电路并可彻底省掉外部昂贵的复位电路,具有8K在系统可编程FLASH存储器,32个可设置四种模式的外部双向I/O口,运行速度快、价格便宜、性价比高。主控制器电路原理图如图3所示。图3 主控制器原理图2.2水温检测电路水温检测采用常用的DS18B20数字温度传感器,外面带有防水不锈钢护套。DS18B20是一种单总线传感器,其输出为数字量,可以直接利用单片机将代表温度的数字量读到单片机中进行处理,不需要额外增加AD转换器。其封装形式为TO-92,体积比较小。为方便测量水温,将DS18B20放入防水不锈钢套中,并用胶加以密封,便于我们测量水温。DS1B 20可以设置为12位的转换精度,测量温度的分辨率可以达到0.0625℃,测量精度为±0.5℃,满足家庭测量水温需要。DS18B20应用原理图如图4所示。图4 DS18B20应用原理图2.3数码管显示电路数码管显示采用0.5英寸共阳极数码管,显示直观,方便家庭中老年人查看。数码管驱动采用了串入并出74HC595芯片驱动,动态扫描,节省了宝贵的I/O资源。74LS595的驱动能力大,可以直接驱动数码管的显示。数码管显示电路原理图如图5所示。图5 数码管显示电路原理图2.4电磁阀及抽水泵控制电路当单片机电磁阀(或抽水泵)控制引脚输出低电平时,三极管导通,继电器动作,电磁阀(或抽水泵)打开;反之,三极管截止,继电器不动作,电磁阀(或抽水泵)关闭。电磁阀(或抽水泵)控制电路原理图如图6所示。图6 电磁阀或抽水泵控制电路2.5语音提示电路系统利用语音芯片ISD1820实现语音提示功能。美国ISD公司推出一种单片8~20s单段语音录放电路ISD1820,它采用CMOS技术,内含振荡器、话筒前置放大、自动增益控制、防混淆滤波器、扬声器驱动及FLASH阵列。其可以进行10s左右的语音录放高质量自然的语音还原、外围元件少、电路连接简单、控制方便、成本低,可以通过单片机控制操作。当系统检测到管道中水温超过设定温度时,在单片机的控制下,语音提示电路发出声音提醒。语音提示电路原理图如图7所示。图7 语音提示电路原理图2.6按键电路按键采用了独立式按键,主要有水温/环境温度切换按键、启动/停止键、温度上升键、温度下降键、水泵抽水键。按键功能直接,配合数码管显示,操作方便、直观。对家庭中老年人来讲,十分方便。按键电路原理图如图8所示。图8 按键电路原理图3控制系统软件设计在软件设计中充分利用了IAP15F2K60S2单片机的优势,根据DS18B20、SHT10传感器的特点,以及按键扫描、数码管动态显示的要求,利用时间触发机制进行软件设计。利用STC的单片机定时计数器0产生系统滴答时钟,然后产生不同的时间片,系统在不同的时间片执行不同的任务。系统分时调度程序框架如图9所示。图9 系统分时调度程序框架4结束语在调查家庭太阳能热水器用户应用需求和现在存在浪费水这个问题的基础上,设计了一种基于单片机控制的节水控制系统。本系统能够实现冷水流向控制、管道温度的实时显示、环境温湿度检测、语音提示等功能,具有良好的人机界面。通过本系统在家庭中的试运行,表明其较好地解决了家庭太阳能热水器冬季水浪费的困扰,经济实用,足以满足用户的节水需求,给人们的日常生活提供了极大便利。

    时间:2018-06-20 关键词: cmos 单片机 stc 嵌入式处理器 节水控制

  • 基于STC单片机的32*32点阵LED显示汉字

    图上摆放的是上面一排引脚是行,下面一排引脚是列。行是LED阳极。 行列各由四个74HC573控制,每个控制8个脚。同时注意单片机P0口上拉保持供电充足。 还有注意每行的扫描时间要合理设置。否则会有显示残缺。根据实际设置吧!!! 横向显示4个字:少占鱼制作 其实可以把这个程序和我另外的一个单片机串口与电脑通信的程序结合起来,加上我用VC做的上位机界面。可以自由输入显示内容,还可以反向控制电脑的一些操作。不过我还是热衷不用电脑输入显示内容,而用一只感应笔扫描一个32*32LED模板,实现自己点哪就让哪个LED亮的效果。简单有省事。等我做出实物来再发吧!!!其实就是加个光敏三极管,LED模板上各个LED点亮时间不同。通过测频达到取某点坐标的目的。 //32*32点阵LED显示,由8*8点阵组成。列高行低点亮 /*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/ #include #define uchar unsigned char #define uint unsigned int //少占鱼制作 河北正定欢迎您 长沙航空职业技术学院 2010 年QQ:411656434 //邮箱:ssou_1985@163.com sbit CS1=P1^0; sbit CS2=P1^1; sbit CS3=P1^6; sbit CS4=P1^7; sbit L1=P1^2; sbit L2=P1^3; sbit L3=P1^4; sbit L4=P1^5; uchar hang[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code tab[]={ 0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x20, 0x09,0x10,0x11,0x0C,0x11,0x04,0x21,0x10, 0x41,0x10,0x01,0x20,0x01,0x40,0x00,0x80, 0x01,0x00,0x02,0x00,0x0C,0x00,0x70,0x00, //少 0x02,0x00,0x02,0x00,0x02,0x08,0x03,0xFC, 0x02,0x00,0x02,0x00,0x02,0x10,0x3F,0xF8, 0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10, 0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x10, //占 0x04,0x00,0x04,0x00,0x0F,0xE0,0x10,0x40, 0x20,0x88,0x7F,0xFC,0xA1,0x08,0x21,0x08, 0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8, 0x20,0x08,0x00,0x04,0xFF,0xFE,0x00,0x00, //鱼 0x04,0x04,0x24,0x04,0x25,0x04,0x3F,0xA4, 0x24,0x24,0x44,0xA4,0xFF,0xE4,0x04,0x24, 0x3F,0xA4,0x24,0xA4,0x24,0xA4,0x24,0x84, 0x26,0x84,0x25,0x04,0x04,0x14,0x04,0x08 //制 }; void delay(uint); void delayus(); void xianshi(); void dis1(); void dis2(); void dis3(); void dis4(); /****************************************************************/ //主函数入口 main() { delayus(); delay(20); P0=0x00; P2=0xff; L1=0; L2=0; L3=0; L4=0; CS1=0; CS2=0; CS3=0; CS4=0; while(1) { xianshi(); } } void xianshi() { dis1(); dis1(); dis2(); dis2(); dis3(); dis3(); dis4(); dis4(); } /************第一个16*16点阵显示***************/ // void dis1() { //第一个16*16点阵开始显示 uchar i,j; /*****我在修改的时候,总是字显示不完整,一开始还以为是哪里有错,后来改延时程序也不行,最后每行连续扫描几次,可以了******/ //少占鱼 河北正定欢迎您 长沙航院 QQ:411656434 for(i=0;i

    时间:2018-06-08 关键词: 单片机 stc 点阵 汉字

  • STC内部EEPROM应用函数

    STC12C5410系列单片机内带2KEEPROM,分成4个扇区,每个扇区512byte。使用时注意以下几点:1、有三个基本命令:字节读,字节写,扇区擦除2、没有字节擦除,只有扇区擦除。如果要改变扇区中的某个字节,保留其它字节内容不变,必须先把其它字节读出来保存,然后擦除整个扇区,再把改动的字节内容和保存的其它字节内容写入扇区。3、扇区读写的时间短,擦除的时间比较长,要注意扇区擦除函数的调用位置,比如最好不要放在定时中断中。4、每个扇区用的越少越方便。以下是应用函数:#include#include#defineISP_IAP_BYTE_READ0x1;//字节读#defineISP_IAP_BYTE_PROGRAM0x2;//字节编程,可以将1写成0,要将1变成0,必须执行字节编程#defineISP_IAP_SECTOR_ERASE0x3;//扇区擦除,可以将0擦成1,要将0变成1,必须擦除整个扇区//定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数#defineENABLE_ISP0x81;//系统工作时钟>8;ISP_CONTR=ENABLE_ISP;//打开IAP功能,设置Flash操作等待时间ISP_CMD=ISP_IAP_BYTE_READ;//设置为IAP/ISP/EEPROM字节读模式命令//EA=0;ISP_TRIG=0x46;ISP_TRIG=0xb9;//先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此,送完B9h后,ISP/IAP命令立即被触发起动for(i=0;i>8;ISP_DATA=wr_data;//要编程的数据先送进ISP_DATA寄存器ISP_CONTR=ENABLE_ISP;//打开IAP功能,设置Flash操作等待时间ISP_CMD=ISP_IAP_BYTE_PROGRAM;//设置为IAP/ISP/EEPROM字节编程模式命令//EA=0;ISP_TRIG=0x46;ISP_TRIG=0xb9;//先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此,送完B9h后,ISP/IAP命令立即被触发起动for(i=0;i>8;ISP_CONTR=ENABLE_ISP;//打开IAP功能,设置Flash操作等待时间ISP_CMD=ISP_IAP_SECTOR_ERASE;//设置为IAP/ISP/EEPROM扇区擦除模式命令//EA=0;ISP_TRIG=0x46;ISP_TRIG=0xb9;//先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此,送完B9h后,ISP/IAP命令立即被触发起动for(i=0;i

    时间:2018-06-08 关键词: stc eeprom 函数

  • STC单片机解码HT6121/6122遥控器

    /*************功能说明**************红外接收程序。适用于市场上用量最大的HT6121/6122及其兼容IC的编码。对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。使用模拟串口发送监控显示编码,显示内容为ASCII码和中文。本接收程序基于状态机的方式,占用CPU的时间非常少。******************************************//*************用户系统配置**************/#defineMAIN_Fosc12000000L//定义主时钟,模拟串口和红外接收会自动适应。5~36MHz#defineD_TIMER0125//选择定时器时间,us,红外接收要求在60us~250us之间#defineUser_code0xFD02//定义红外接收用户码/*************以下宏定义用户请勿修改**************/#include"reg51.H"#defineucharunsignedchar#defineuintunsignedint#definefreq_base(MAIN_Fosc/1200)#defineTimer0_Reload(65536-(D_TIMER0*freq_base/10000))/*************本地常量声明**************//*************本地变量声明**************/sbitP_TXD1=P3^1;//定义模拟串口发送脚,打印信息用sbitP_IR_RX=P0^1;//定义红外接收输入端口bitP_IR_RX_temp;//LastsamplebitB_IR_Sync;//已收到同步标志ucharIR_SampleCnt;//采样计数ucharIR_BitCnt;//编码位数ucharIR_UserH;//用户码(地址)高字节ucharIR_UserL;//用户码(地址)低字节ucharIR_data;//数据原码ucharIR_DataShit;//数据反码bitB_IrUserErr;//UsercodeerrorflagbitB_IR_Press;//Keypressflag,includerepeatkey.ucharIR_code;//IRcode红外键码/*************本地函数声明**************/voidTx1Send(uchardat);ucharHEX2ASCII(uchardat);voidInitTimer(void);voidPrintString(unsignedcharcode*puts);/*************外部函数和变量声明*****************//*********************主函数*************************/voidmain(void){InitTimer();//初始化TimerPrintString("******STC系列MCU红外接收程序2010-12-10******rn");//上电后串口发送一条提示信息while(1){if(B_IR_Press)//有IR键按下{PrintString("红外码:0x");//提示红外键码Tx1Send(HEX2ASCII(IR_code>>4));//键码高半字节Tx1Send(HEX2ASCII(IR_code));//键码低半字节if(B_IrUserErr)//用户码错误,则发送用户码{Tx1Send(’’);//发空格Tx1Send(’’);//发空格PrintString("用户码:0x");//提示用户码Tx1Send(HEX2ASCII(IR_UserH>>4));//用户码高字节的高半字节Tx1Send(HEX2ASCII(IR_UserH));//用户码高字节的低半字节Tx1Send(HEX2ASCII(IR_UserL>>4));//用户码低字节的高半字节Tx1Send(HEX2ASCII(IR_UserL));//用户码低字节的低半字节}Tx1Send(0x0d);//发回车Tx1Send(0x0a);//发回车B_IR_Press=0;//清除IR键按下标志}}}/*********************十六进制转ASCII函数*************************/ucharHEX2ASCII(uchardat){dat&=0x0f;if(datD_IR_SYNC_MAX)B_IR_Sync=0;//largetheMaximSYNCtime,thenerrorelseif(SampleTime>=D_IR_SYNC_MIN)//SYNC{if(SampleTime>=D_IR_SYNC_DIVIDE){B_IR_Sync=1;//hasreceivedSYNCIR_BitCnt=D_IR_BIT_NUMBER;//Loadbitnumber}}elseif(B_IR_Sync)//hasreceivedSYNC{if(SampleTime>D_IR_DATA_MAX)B_IR_Sync=0;//datasamlpetimetolargeelse{IR_DataShit>>=1;//datashiftright1bitif(SampleTime>=D_IR_DATA_DIVIDE)IR_DataShit|=0x80;//devidedata0or1if(--IR_BitCnt==0)//bitnumberisover?{B_IR_Sync=0;//ClearSYNCif(~IR_DataShit==IR_data)//判断数据正反码{if((IR_UserH==(User_code/256))&&IR_UserL==(User_code%256))B_IrUserErr=0;//UsercodeisrigheelseB_IrUserErr=1;//usercodeiswrongIR_code=IR_data;B_IR_Press=1;//数据有效}}elseif((IR_BitCnt&7)==0)//onebytereceive{IR_UserL=IR_UserH;//SavetheUsercodehighbyteIR_UserH=IR_data;//SavetheUsercodelowbyteIR_data=IR_DataShit;//SavetheIRdatabyte}}}}}/****************Timer初始化函数******************************/voidInitTimer(void){TMOD=0;//forSTC15Fxxx系列Timer0as16bitreloadtimer.TH0=Timer0_Reload/256;TL0=Timer0_Reload%256;ET0=1;TR0=1;EA=1;}/**********************Timer0中断函数************************/voidtimer0(void)interrupt1{IR_RX_HT6121();}/**********************模拟串口相关函数************************/voidBitTime(void)//位时间函数{uinti;i=((MAIN_Fosc/100)*104)/140000-1;//根据主时钟来计算位时间while(--i);}//模拟串口发送voidTx1Send(uchardat)//9600,N,8,1发送一个字节{uchari;EA=0;P_TXD1=0;BitTime();for(i=0;i>=1;BitTime();}P_TXD1=1;EA=1;BitTime();BitTime();}voidPrintString(unsignedcharcode*puts)//发送一串字符串{for(;*puts!=0;puts++)Tx1Send(*puts);//遇到停止符0结束}

    时间:2018-06-08 关键词: 遥控器 单片机 stc

  • STC单片机控制DS1302 (1TMCU C程序)

    #include"REG51.H"#include"INTRINS.H"typedefunsignedcharBYTE;sbitSCLK=P1^0;//DS1302时钟口P1.0sbitIO=P1^1;//DS1302数据口P1.1sbitRST=P1^2;//DS1302片选口P1.2//秒分时日月星期年BYTEcodeinit[]={0x00,0x00,0x20,0x01,0x01,0x05,0x10};BYTEdatanow[7];voidDS1302_Initial();voidDS1302_SetTime(BYTE*p);voidDS1302_GetTime(BYTE*p);voidmain(){DS1302_Initial();//初始化DS1302DS1302_SetTime(init);//设置初始时间DS1302_GetTime(now);//读取当前时间while(1);}/**************************************延时X微秒(STC12C5A60S2@12M)不同的工作环境,需要调整此函数此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同**************************************/voidDelay(){_nop_();_nop_();}/**************************************从DS1302读1字节数据**************************************/BYTEDS1302_ReadByte(){BYTEi;BYTEdat=0;for(i=0;i>=1;//数据右移一位if(IO)dat|=0x80;//读取数据SCLK=1;//时钟线拉高Delay();//延时等待}returndat;}/**************************************向DS1302写1字节数据**************************************/voidDS1302_WriteByte(BYTEdat){chari;for(i=0;i>=1;//移出数据IO=CY;//送出到端口SCLK=1;//时钟线拉高Delay();//延时等待}}/**************************************读DS1302某地址的的数据**************************************/BYTEDS1302_ReadData(BYTEaddr){BYTEdat;RST=0;Delay();SCLK=0;Delay();RST=1;Delay();DS1302_WriteByte(addr);//写地址dat=DS1302_ReadByte();//读数据SCLK=1;RST=0;returndat;}/**************************************往DS1302的某个地址写入数据**************************************/voidDS1302_WritEDAta(BYTEaddr,BYTEdat){RST=0;Delay();SCLK=0;Delay();RST=1;Delay();DS1302_WriteByte(addr);//写地址DS1302_WriteByte(dat);//写数据SCLK=1;RST=0;}/**************************************写入初始时间**************************************/voidDS1302_SetTime(BYTE*p){BYTEaddr=0x80;BYTEn=7;DS1302_WriteData(0x8e,0x00);//允许写操作while(n--){DS1302_WriteData(addr,*p++);addr+=2;}DS1302_WriteData(0x8e,0x80);//写保护}/**************************************读取当前时间**************************************/voidDS1302_GetTime(BYTE*p){BYTEaddr=0x81;BYTEn=7;while(n--){*p++=DS1302_ReadData(addr);addr+=2;}}/**************************************初始化DS1302**************************************/voidDS1302_Initial(){RST=0;SCLK=0;DS1302_WriteData(0x8e,0x00);//允许写操作DS1302_WriteData(0x80,0x00);//时钟启动DS1302_WriteData(0x90,0xa6);//一个二极管+4K电阻充电DS1302_WriteData(0x8e,0x80);//写保护}STC单片机控制DS1302 (1TMCU C程序)

    时间:2018-06-08 关键词: 单片机 程序 stc tmcu

  • 基于STC单片机的ISP下载线设计

      本文首先介绍了在线编程技术,然后给出了基于STC单片机两种下载线设计电路,最后阐述了ISP下载线的性能特点。实践表明:本设计具有低成本、高灵活性,对单片机爱好者,尤其是初学者,具有很强的实用价值。  一.ISP技术  在单片机的实际应用中,往往要求系统能够脱机运行,这就要求必须将用户程序代码固化到非易失性的程序存储器中。把用户程序代码固化到程序存储器的过程称为编程。传统对程序存储器的编程是通过编程器完成的,用户需要将单片机从目标板上取下来放到编程器上,然后通过烧写软件将程序代码固化到程序存储器中,这种编程方式通常称为脱机烧写(也叫离线编程)。但随着芯片制造工艺的不断提高,贴片式封装得到快速发展,这就使得单片机不可能轻易取下来放到编程器上。目前普遍采用ISP技术,这种编程方式不用费劲把单片机从目标板上取下来,而是通过单片机上的相关接口就可以直接将编好的程序代码固化到程序存储器中,对于STC单片机,用的是它的UART接口,也就是串行口:对于AT89S51单片机,用的是它的SPI接口,接口标准不同,涉及的引脚和下载电路也就不同。本文介绍STC单片机的ISP下载电路。  二.串口ISP下载线设计  STC单片机是宏晶公司生产的新一代、增强型51单片机,具有较快的运行速度和丰富的片上资源,尤其是该系列单片机支持ISP下载,用户利用STC单片机自带的串行口(即P3.0和P3.1引脚),再配合简单的外围电路即可实现在系统编程,且片内Flash的擦写次数可达10万次以上,完全能够满足用户需求,下图即为串口ISP下载线电路原理图。  上图电路仅用了1个MA×232芯片、4个容量为104的去耦电容和一个9针的“D”型连接器,其中MA×232芯片用于RS232电平和TTL电平之间转换以及电气隔离,104电容主要用于滤除高频噪声,“D”型连接器是单片机和电脑进行RS232接口标准通信的物理接口。按照上述电路焊接完毕后,再到宏晶公司网站免费下载一个烧写软件(名称是“STC单片机PC端ISP下载控制软件”),最后用一条标准的RS-232数据线连接目标板和电脑即可完成程序代码的在线烧写。  三.USB口ISP下载线设计  随着计算机的发展,现在的笔记本电脑甚至一些台式计算机上面均不再配置RS232接口,取而代之的是USB接口,但在一些制作或设备中RS232接口仍很常见,因此有必要设计一个USB转串口电路。目前用于USB转串口的专用芯片很多,综合成本、性能和电路简单程度,笔者介绍由美国SILICon公司生产的高集成度USB转UART芯片CP2102。该芯片符合USB规范2.0,全速12Mbps,片内集成USB收发器,无须外部电阻,内部集成时钟,无需外部振荡器,因此其最重要的特点是单片集成转换器所需的全部电路,可以在不使用任何分离元件情况下独立实现接口转换功能。下图即为利用CP2102芯片设计的USB口ISP下载线电路原理图。  制作和使用该电路时应注意两点:一是CP2101的UART总线上的信号是TTL电平,能够被单片机直接识别,若目标板上使用的是RS232电平,应在本电路后面增加TTL电平转RS232电平电路;二是在使用该电路前应先安装CP2101的驱动程序,以后的使用方法与串口ISP下载方法基本相同,在此不再赘述。  四.结束语  随着可编程微处理器向贴片方向发展,ISP技术必将得到重视和普及,ISP技术不仅节省了通用编程器及适配器的高额费用,还减少了频繁插拔单片机的麻烦,从而大量节省了系统开发时间,且满足了用户程序在线更新的要求,对单片机爱好者,尤其是初学者,具有很强的实用价值。

    时间:2018-05-31 关键词: isp 单片机 stc

  • STC学习板程序烧录说明

      以下是烧录程序的主要界面。烧录过程非常简单,操作也非常简单。图中红色的五个大数字就表示了整个过程。简简单单的五步就可以了(实际上只需4步)。     启动本烧录程序后,第一步就是选择烧录器件。本烧录软件支持STC全系列的51单片机芯片,因此,第一步必须选择相对应的型号。由于本实验板选用的单片机芯片就是本烧录软件首次启动默认的型号,所以,本项一般都不需要选择。 另外,“AP Memory”是指该芯片的内存大小和起止地址,根据器件型号自动更改,不必理会。 字串2 选择了器件型号,第二步就应该选择将要被烧录的HEX机器码文件。HEX文件由 单片机 开发环境输入、编辑代码,最后编绎产生。 至于如何产生HEX文件,很多资料也都有介绍,本板STC光盘中有详细的说明,并且提供了多套开发软件(每套都能用)。通过对照自学完全可以很快掌握操作。并且,本实验板光盘也提供了多种 单片机 开发环境供大家学习研究。 本光盘中提供了一些例子程序,大家可以点“open file”按钮,弹出以下窗口(源程序也有,但这里不显示),先选择一些例子程序烧录实验。 选好了文件后,大家可以发现“文件校验和”中的数据发生了变化,大家可以通过留意这个数据是否变化来确定打开文件是否成功,或者文件刷新是否有更改。 当然,文件打开后,会显示在右边的数据区,大家也可以观查右边数据区是否有更改。不过,当数据太多时,更改的地方又很少时,观查“文件校验和”会更快更准确。    

    时间:2018-05-23 关键词: 程序 stc 烧录

首页  上一页  1 2 3 4 5 6 7 8 下一页 尾页
发布文章

技术子站

更多

项目外包