main.c

来自「3、LCD12864不能显示或不能清楚显示: 1)重新按住复位键和KEY A 2」· C语言 代码 · 共 153 行

C
153
字号
/*****************************************************************/ 
/*                                                               */                                                                
/*名称:                串口对ds1302读写程序                     */                                                                                                                                                                           
/*功能:           读写DS1302,通过串口返回给电脑                */                                                    
/*难度等级:                   中                                */                                                                     
/* 作者:                  zengrenliang                          */
/* 版权:           http://www.51kaifa.com                       */
/*编写日期:        2006.05.21                                   */                                                                                                                                                                                                             
/*****************************************************************/
#include <reg52.h>
#include "ds1302.h"
#define uchar  unsigned char

bit receive;//接收标志
bit re_finish;//接收一串字符完成标志
sbit LED = P1^3;//LED指示灯

uchar  i,buffer[8],str[8];//串口缓冲区
uchar  sbuffer,number;//发送字符个数
uchar  sendFINS ;//发送完成标志
uchar  copyOK , cmd_numb ;//发送缓冲区填充完成

/*********************************系统初始化*****************************/

void initial()
{  unsigned char j;
  
   SCON=0x50;           //串口工作方式1,允许接收
   PCON=0x80;           //波特率翻倍
   TCON=0;              
   TMOD=0x26;           //T1用于串口波特率控制
   TL1=0xfa;            //初始化T1,波特率为9600(晶振11.0592M)
   TH1=0xfa;                    
   TR1=1;               //开定时器
   EA=1;                //开总中断
   ES=1;                //开串口中断
   copyOK = 0;         //缓冲区准备好标志清零
   receive = 0;        //接收标志清零
   re_finish = 0;      //接受完成标志清零
   cmd_numb = 0;       //接受计数器清零

  for(j=0; j<8; j++){   //串口缓冲区清空
      buffer[i] = 0xff;  //table[18]为空显示 
      str[i] = 0xff;
    }   
 }                        


/*************************************向串口发送字符串****************************/


void  send(void)
 { 
   
   if(copyOK)  //串口准备好且缓冲区准备好
    { 
     i = 0;                 
     REN = 0;               //发送过程中禁止接收数据
     copyOK = 0;            //清缓冲区准备好标志
     SBUF = str[i++];      //发送字符串首字符
     number = 7;            //置发送计数器
      }
   else
       return;              //没准备好则返回
  }


/**************************************串口中断响应*********************************/

void serial(void) interrupt 4
{ 
  LED = ~LED;//LED闪烁
  if(RI)//为接收中断
     {      
      RI=0;                                         //清接收中断标志
      sbuffer = SBUF;                               //读取串口缓冲区数据

      if((sbuffer == 0x55) && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
       {     
           receive = 1;     //开始接收标志                         
           cmd_numb = 0;    //清接收计数器
           re_finish = 0;   //清接收完成标志
          }
      else if(sbuffer == 0xaa)   //判断数据尾     
        { 
          re_finish = 1;         //置接收完成标志      
          receive =0;            //清接收标志
          }
      else if(receive){     //判断当前是否处于接收状态
                   
          buffer[cmd_numb++] = sbuffer;  //当前字符送缓冲区
         }      
      else                    //无效命令则返回
         return;
       }
    else{ 
     TI=0;                   //为单个字符发送完中断
     if(!number)             //字符串发送完
      { REN = 1;             //允许接收
       }
     else{                  //字符串未发送完
        SBUF = str[i++];   //发送下一字符
		number--;           //发送字符数减一
       }             
     }
   }

/*************************************执行PC端命令*******************************/
void DispatchCmd(void)
 { uchar p;
   switch(buffer[0])                             
    {											
       case 1:       //设置DS1302
          v_Set1302(&buffer[1]);
          for(p=0;p<8;p++)
           str[p] = 0x55;
          copyOK = 1;
          send();
          break;

       case 2:       //读取DS1302
          for(p=0;p<8;p++)
           str[p] = 0x00;
          v_Get1302(&str);
          copyOK = 1;
          send();
          break;

      default:
          return;
     }
  }

/***************************************主函数************************************/
main()
{ 
  P0 = 0xff;
  P2 = 0xff;
  P1 = 0xff;
  initial();

  while(1){//主循环

    if(re_finish){//接收完成
      re_finish = 0;//清接收完标志
      copyOK = 0;//清填充完标志
      DispatchCmd();//执行命令
    }
   }
 }

/**************************************结束***************************************/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?