• 西北工控自动化网 专业的兰州PCB芯片级无图维修,电路板软硬件开发公司-甘肃先睿工控科技有限公司!欢迎你! 业务咨询电话:0931-8593134 技术支持电话:18609487812

 

先睿工控广告

编程开发
其它的类

首页 》 全屏查看 》


串口及定时器通用模块-编程篇

关键词: 串口及定时器通用模块,先睿工控,下位机C51,串口编程
描述:

主程序文件名:Seril.c //模块名称:串口及定时器通用模块 //作者:代码。灵魂 //单位:先睿工控 //来源:WWW.(西北工控自动化)


作者:代码灵魂  日期:2017/3/5

 串口及定时器通用模块

原创性声明:禁止用于商业用途,仅供学习和研究用,分享转载,请注明出处及原作者署名

 

    小编在写步进驱动之驱动信号设计篇之前,在需要调试的时候突然发现,原来小编所写的虽然很多,很精简,但引用起来需要计算,相当麻烦,小编想既然会用到串口和定时器,那写一个简单通用的吧,于是有此编程。 

    说明:该文件不能单独运行,需要引用,如果涉及到内存不足的问题,请精简,小编会在后续版本中,进行完整的测试和完善未完善的功能。

  1. //*************************:Seril.cc************************
  2. //主程序文件名:Seril.c
  3. //模块名称:串口及定时器通用模块
  4. //作者:代码。灵魂
  5. //单位:先睿工控
  6. //来源:WWW.(西北工控自动化)
  7. //入出口参数:                                                                                                        
  8. //基本描述:完成串口与定时器的通用编程部分。
  9. //备注:引用本程序或模块,请保留来源及原作者署名。
  10. //版本:Verion_1.0.0.0                                                                                             *
  11. //日期 :2017/03/4
  12. //***************************************************************/
  13. #include
  14. #include
  15. const uchar ODD=1;
  16. const uchar EVEN=2;
  17. const uchar NONO=0;
  18.  
  19. //以下为TMOD 定时,计数寄存器专用
  20. const bit COUNT=1;
  21. const bit TIMER=0;
  22. const bit OUTSIDE=1;
  23. const bit INSIDE=0;
  24. const bit Timer_ms=1;
  25. const bit Timer_us=0;
  26. //以下为TCON 中断寄存器专用
  27.  
  28. const bit Timer_Run=1;
  29. const bit Timer_Stop=0;
  30. const bit Flag_Set =1;
  31. const bit Flag_Cls=0;
  32. const bit TIMER1=1;
  33. const bit TIMER0=0;
  34. const bit OUT_INTERRUP=1;
  35. const bit OUTSIDE_TRIG_DOWN=1;
  36. const bit OUTSIDE_TRIG_LOW=0;
  37.  
  38.  
  39.  
  40.  
  41.  struct ComX
  42. {
  43.        uchar PortNum;
  44.        ulong Baud_Rate;
  45.        uchar Data_Bit;
  46.        uchar Start_Bit;
  47.        uchar Stop_Bit;
  48.        uchar Vericy_Bit;
  49.  
  50. };
  51.  
  52. void Serial_Init(struct ComX,bit);
  53.  
  54. void Com_init()
  55. {
  56.        struct ComX Com1;
  57.  
  58.  
  59.        //------------------------------------
  60.        //配置串口COM基本属性。该变量值由用户自定义。
  61.        bit Recive_ENA=0;// 允许接收标志。1:可接收,0,不可接收。
  62.  
  63.        Com1.PortNum=1;              
  64.        Com1.Baud_Rate=9600;
  65.        Com1.Start_Bit=1;
  66.        Com1.Stop_Bit=1;
  67.        Com1.Data_Bit=8;
  68.        Com1.Vericy_Bit=NONO;   //  ODD=1;EVEN=2;NONO=0;
  69.  
  70.  
  71.  
  72.         
  73.        //-------------------------------------
  74.     Serial_Init(Com1,Recive_ENA);
  75. }
  76.  
  77. void Serial_Init(struct ComX Com,bit Recive_ENA )
  78. {
  79.        uchar TempDateBit;
  80.        ulong maxTempBaut;
  81.       
  82.        maxTempBaut=CPU_frequency/192; //由定时器及倍频产生的最大波特率,FOSC/(16*12*(256-255))
  83.        TempDateBit= Com.Start_Bit+Com.Stop_Bit+Com.Vericy_Bit+Com.Data_Bit;
  84.        if ((TempDateBit>=4) && (TempDateBit<=11))
  85.        {
  86.               switch (TempDateBit)
  87.               {
  88.                      case 8:              //该模式下,可以用来程序调试,纯8位移位发送。波特率为:FOSC/12
  89.                      {
  90.                             if (Com.Start_Bit+Com.Stop_Bit +Com.Vericy_Bit==0)
  91.                                   SCON_init(0,Recive_ENA);
  92.                             else
  93.                                    ;//暂无判断数据位不为8位通信。
  94.                              break;
  95.                      }                         
  96.                      case 10:  //10位数据模式,该模式下有两种情况,波特率固定和可变
  97.                      {
  98.                              if ((Com.Start_Bit+Com.Stop_Bit ==2)&&(Com.Vericy_Bit==0))//BAUT,N,8,1
  99.                              {
  100.                                  
  101.                                    //配置定时器,配置
  102.                                   SCON_init(1,Recive_ENA);
  103.                              }
  104.                              else
  105.                                    ;//暂无判断其它参数通信。
  106.                           break;
  107.                      }                         
  108.                      case 11:  //11位数据模式,该模式下有两种情况,波特率固定和可变
  109.                      {
  110.              
  111.                              
  112.                              if (Com.Baud_Rate>maxTempBaut) //由定时器及倍频产生的最大波特率
  113.                              {
  114.                                      if(Com.Baud_Rate==CPU_frequency/32) PCON|=0X80;       //开波特率倍频=1/32
  115.                                       
  116.                                       else   PCON&=0X0f;           //不开波特率倍频=1/64
  117.                                       
  118.                                     SCON_init(2,Recive_ENA);     //固定1/32   1/64
  119.                              }
  120.                              else
  121.                              {
  122.                                  
  123.                                   SCON_init(3,Recive_ENA);
  124.                              }
  125.                           break;
  126.  
  127.  
  128.                      }
  129.               }
  130.  
  131.        }    
  132. }
  133.  
  134. void Seril_Int_Init()
  135. {
  136.        SCON_init(1,0);
  137.        ;;
  138. }
  139. //配置寄存器TMOD 用到位变量COUNT,TIMER,OUTSIDE,INSIDE   MODE=0.1.2.3
  140. //调用格式 TMOD_init(TIMER,2,INSIDE,0)
  141. /*----------------------------------------------
  142. 说明:配置定时器TMOD
  143. 功能:配置TMOD,全部位,不用再计算。
  144. 参数 MODE0.1.2.3 四种方式,位变量COUNT,TIMER,OUTSIDE,INSIDECT_num01(编号01
  145. 描述:013位最大81921:16位定时器655352:8位自动重载,255, 3:计数器用
  146.         
  147. -----------------------------------------------*/
  148. void TMOD_init(bit C_T,bit in_out_side,uchar mode,uchar CT_num01)
  149. {
  150.   
  151.       if (CT_num01==0)
  152.        {
  153.                     
  154.        //TMOD=TMOD|0x0004;     
  155.       
  156.               if (in_out_side==OUTSIDE)
  157.                       TMOD|=0x08;
  158.               else
  159.                      TMOD|=0x0; 
  160.               if (C_T==COUNT)
  161.                        TMOD|=0x04;
  162.              else
  163.                      TMOD|=0x0;
  164.               switch (mode)
  165.               {
  166.                      case 0:
  167.                             TMOD|=0x00;                                  
  168.                             break;
  169.                      case 1:
  170.                             TMOD|=0x01;             
  171.                             break;
  172.                      case 2:
  173.                             TMOD|=0x02;      
  174.                             break;
  175.                      case 3:
  176.                             TMOD|=0x03;      
  177.                             break;           
  178.               }
  179.        }
  180.        else
  181.        {
  182.               if (in_out_side==OUTSIDE)
  183.                       TMOD|=0x80;
  184.               else
  185.                      TMOD|=0x0; 
  186.               if (C_T==COUNT)
  187.                        TMOD|=0x40;
  188.              else
  189.                      TMOD|=0x0;
  190.               switch (mode)
  191.               {
  192.                      case 0:
  193.                             TMOD|=0x00;                     //130xfff   6553512MMAX=65.535MS      
  194.                             break;
  195.                      case 1:                                               //16 0xfffF
  196.                             TMOD|=0x10;      
  197.                             break;
  198.                      case 2:
  199.                             TMOD|=0x20;                     //8 0xff
  200.                             break;
  201.                      case 3:
  202.                             TMOD|=0x30;                     //计数用
  203.                     
  204.                             break;           
  205.               }
  206.        }
  207. }
  208.  
  209. /*-------------------------------------------------
  210. 说明:定时器的初值 初始化配置
  211. 功能:完成定时器的初值计算,省去计算过程。
  212. 参数:Num(要定的时间),CT_Num(定时器编号),TEMP1(不同模式的最大值),TEMP2 (微秒毫秒下的倍率)
  213.          供调用,不确定TMOD,无意义。   
  214.               FOSC=12M时,0方式MAX8.192ms 大于最大值,返回错误号。  
  215. 描述: 根据不同的模式,产生不同的模式下的初值。供 Timer_init调用。
  216.  
  217.  
  218. ----------------------------------------------------*/
  219. void  Timer_First(uint Temp1,uint Temp2,uchar CT_Num,uint Num)
  220. {    
  221.        if (CT_Num==1)
  222.        {
  223.              TH1=(Temp1-CPU_frequency/12*Num/Temp2)/255;  
  224.               TL1=(Temp1-CPU_frequency/12*Num/Temp2)%255;
  225.        }
  226.         if (CT_Num==0)
  227.        {
  228.             TH0=(Temp1-CPU_frequency/12*Num/Temp2)/255;  
  229.               TL0=(Temp1-CPU_frequency/12*Num/Temp2)%255;
  230.        }
  231. }
  232.  void T_init()
  233. {
  234.        uchar error;
  235.  
  236.    error=Timer_init(10,TIMER,1,Timer_ms);
  237.    TCON_init(TIMER1,Timer_Run,OUTSIDE_TRIG_DOWN);
  238. }
  239.  
  240. /*-------------------------------------------------
  241. 说明:定时器的初始化配置
  242. 功能:按输入关系配置定时器,省去计算方式。定时工作模式。
  243. 参数:Num(要定的时间),CT_Num(定时器编号),CT_Mode(模式),MS_US (微秒,毫秒)
  244.           NumUINT    型)CT_NumCOUNTTIMERCT_Mode0.1.2.3MS_US Timer_msTimer_us
  245.               以上括号中选一个。 
  246.               FOSC=12M时,0方式MAX8.192ms 大于最大值,返回错误号。  
  247. 描述:   会调用 TMOD_init(TIMER,INSIDE,CT_Mode,CT_Num); Timer_First(uTemp,uTemp2,CT_Num,Num);
  248.               完成成对定时器的TMOD初始化,初值的配置。
  249.  
  250.  
  251. ----------------------------------------------------*/
  252. uchar Timer_init(uint Num,uchar CT_Num,uchar CT_Mode,bit MS_US)
  253. {
  254.        uint uTemp,uTemp2;
  255.        bit bError;
  256.        bError=0;
  257.       
  258.        TMOD_init(TIMER,INSIDE,CT_Mode,CT_Num);
  259.        switch(CT_Mode)
  260.        {
  261.               case 0:                     //13
  262.               {
  263.                      if (MS_US==Timer_ms)
  264.                      {                         
  265.                             if (Num*1000>8192)    return 1;//错误,初值过大                       
  266.                            
  267.                             uTemp=0xfff;
  268.                             uTemp2=1000;      
  269.                             Timer_First(uTemp,uTemp2,CT_Num,Num);
  270.                      }
  271.                      else if (MS_US==Timer_us)
  272.                      {   
  273.                     
  274.                             if (Num>65535) return 2;//错误,初值过大
  275.  
  276.                             uTemp=0xfff;
  277.                             uTemp2=1000000; 
  278.                             Timer_First(uTemp,uTemp2,CT_Num,Num);
  279.                      }
  280.                      break;           
  281.               };
  282.               case 1:                   //16
  283.               {
  284.                      if (MS_US==Timer_ms)
  285.                      {                         
  286.                             if (Num*1000>65535)   return 3;//错误,初值过大
  287.  
  288.                             uTemp=0xfff;
  289.                             uTemp2=1000;      
  290.                           Timer_First(uTemp,uTemp2,CT_Num,Num);
  291.                      }
  292.                      else if (MS_US==Timer_us)
  293.                      {   
  294.                     
  295.                             if (Num>65535) return 4;//错误,初值过大
  296.  
  297.                             uTemp=0xffff;
  298.                             uTemp2=1000000; 
  299.                             Timer_First(uTemp,uTemp2,CT_Num,Num);
  300.                       
  301.                      }
  302.                      break;                         
  303.               }
  304.               case 2:                   //8
  305.               {
  306.                      if (MS_US==Timer_ms)
  307.                      {
  308. //                          uTemp=0xff;
  309. //                          uTemp2=1000;
  310. //                        Timer_First(uTemp,uTemp2,CT_Num,Num);
  311.                             return 5;  //错误,不足1ms
  312.                      }
  313.                      else if (MS_US==Timer_us)
  314.                      {   
  315.                             if (Num>255)return 1;//错误,初值过大
  316.  
  317.                             uTemp=0xff;
  318.                             uTemp2=1000000;
  319.                             Timer_First(uTemp,uTemp2,CT_Num,Num);
  320.                      }
  321.                      break;                         
  322.               }
  323.        }
  324.  
  325.        return 0;
  326. }
  327. /*-------------------------------------------------
  328. 说明:配置定时器中断控制器TCON
  329. 功能:按输入关系配置TCON中断寄存器,省去计算方式。
  330. 参数:Timer_NumTIMER1TIMER0,)Timer_StateTimer_RunTimer_Stop),
  331.      Interrupt_TrigOUTSIDE_TRIG_DOWNOUTSIDE_TRIG_LOW;)以上括号中选一个。
  332.      如启动定时器1,我们定义,TCON_init(TIMER1,Timer_Run,OUTSIDE_TRIG_DOWN)即可。
  333. 描述:因为TF,IE,为中断标志位,会自动清零,所以不用管。以上位变量已定义为常量。
  334.  
  335. ----------------------------------------------------*/
  336. void TCON_init(bit Timer_Num,bit Timer_State,bit Interrupt_Trig)
  337. {
  338.        if (Timer_Num==1)
  339.        {
  340.               if (Timer_State==Timer_Run)      TR1=1;
  341.               else TR1=0;          
  342.               if (Interrupt_Trig==OUTSIDE_TRIG_DOWN) IT1=1;
  343.               else  IT1=1;
  344.        }
  345.        else if(Timer_Num==0)
  346.        {
  347.               if (Timer_State==Timer_Run)      TR0=1;
  348.               else TR0=0;
  349.               if (Interrupt_Trig==OUTSIDE_TRIG_DOWN) IT0=1;
  350.               else  IT0=1;
  351.        }
  352.  
  353.  
  354. //     TCON|=TCON^6|1;
  355.  
  356. }
  357. /*----------------------------------------------
  358. 说明:配置串口中断控制器SCON
  359. 参数 MODE0.1.2.3 串口四方方式,Recive_ENA 1允许接收
  360. 描述:0FOSC*1/12作为波特率,1:10位定时器,2:FOSC*1/64,SMOD=1时,1/32311位定时器
  361. -----------------------------------------------*/
  362.  
  363. void SCON_init(uchar Mode,bit Recive_ENA)
  364. {
  365.        if (Recive_ENA==1) REN=1;
  366.        switch (Mode)
  367.        {
  368.               case 0:       //FOSC/12 固定 110592 921.600K  12M=1000000
  369.                      SM0=0;
  370.                      SM1=0;
  371.                       
  372.                      break;
  373.               case 1:        //可变,由定时器产生波特率
  374.                      SM0=0;
  375.                      SM1=1;
  376.                       
  377.                      break;
  378.               case 2:            //FOSC/32,FOSC/64 固定,若110592,则345.6K172.8K
  379.                      SM0=1;
  380.                      SM1=0;
  381.                      break;
  382.               case 3:          //可变,由定时器控制。
  383.                      SM0=1;
  384.                      SM1=1;
  385.                      break;
  386.        }
  387. }
  388.  
  389.  
  390. void printf_seril_config()
  391. {
  392.    /*说明一下,因为printf 工作时,需要先判断TI=1 即之前的串口操作是否结束,结束才开始,
  393.    8数据位      1停止位,1 起始位,为10位模式,故唯有SM0=0,SM1=1模式1
  394.    //10位模式和定时器配合使用,
  395.   
  396.        //TMOD_init(TIMER,INSIDE,2,1);
  397.        //TH1=0XFD;
  398.        //TL1=0XFD;
  399. //     TCON_init(TIMER1,Timer_Run,OUTSIDE_TRIG_DOWN);    */
  400.  
  401.        //TI=1;
  402.        SCON_init(2,0);    //mode=1 10bit  ,recive_ena=0 disable Recive
  403. }


本信息由  甘肃先睿工控科技有限责任公司 发表于 西北工控自动化网
注意: 转载或分享 请注明来源:西北工控自动化!

在全屏模式下分享,效果更好!


扫一扫 添加通信录 扫一扫 添加微信号


COPYRIGHT ©2008-2018 XBGHZDH CORPORATION ALL RIGHT RESERVED .
COPYRIGHT ©2008 XBGHZDH ALL RIGHT RESERVED .           

        西北工控自动化 © 版权所有

本网站由:甘肃先睿工控科技有限公司独家赞助


总访问量:343063
当前在线:97