⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 上位机是VB设置成的界面;下位机是用C编释的51单片机的温度采集模块。
💻 C
字号:
   #pragma    SRC
   #include  <stdio.h>
   #include <reg51.h> 
   #define  TURE    1
   #define  FALSE   0
   #define  LampComm      P0_0         //主机正在通信
   #define  selectComm1   P0_1        //定义主机通信的从机号
   #define  MACHINECOMM_OK  0x11    //主机通信传送握手信号
   #define  MACHINECOMM_RET  0x88  //从机回复通信握手信号
   #define  MACHINECOMM_DATAHEAD  0x5a    //定义数据包的头
   #define  MACHINECOMM_DATAEND    0xa5    //定义数据包的尾
   #define  DELAY_VALUE  3
   sbit   	P0_0 = P0^0;
   sbit   	P0_1 = P0^1;
   bit   EvRcv = FALSE;           //是否收到串行数据的标志

 unsigned  char  rcvdata = 0;     //从串口存储接收的变量
 void  send(char *temp,int j);     //发送子程序
 void initial(void);                        //初始化子程序
 void delay(short i);                     //延时子程序
 void  Rcv_INT(void)  interrupt 1

 void main(void)
 {
    unsigned  char  datacomm[6],datarecv[6];
    unsigned  char  count = 0,datahand;
    datahand = MACHINECOMM_RET;
    datacomm[0] = MACHINECOMM_DATAHEAD;
    datacomm[1] = 'w';
    datacomm[2] = 'o';
    datacomm[3] = 'r';
    datacomm[4] = 'k';
	 datacomm[5] = MACHINECOMM_DATAEND;
    initial();
    SelectComm6 = 1;             //选择与PC机进行通信
    while(1)
     {
     if(EvRcv)                    //如果接收到主机端发过来的握手信号
       {
         if(rcvdata==MACHINECOMM_OK)
            {
             LampComm = True;
             delay(DELAY_VALUE);
             LampComm = FALSE;          
             }                      //指示灯闪烁
        EvRcv =  FALSE;
         break;                     //退出等待
            }
    send(&datahand,1);              // 返回一个握手信号
    break;
}
  for(; ;)
  {
while(1)
   {
    if(EvRcv)
     {
      datarecv[count] = recvdata;
      count++;
      EvRcv = FALSE;
      }
   if(count==5) break;                  //如果已经收到6个数据,则认为是收到一个数据包
    }                                   //接收一个数据包
   if(datarecv[0]==MACHINECOMM_DATAHEAD&&datarecv[5]==MACHINECOMM_DATAEND)
    send(datacomm,6);               //如果数据包正确,则返回一个数据包
   }
 }

void    initial()                          //初始化子程序
{
   IP =0x10;                           //定义串口为高优先级中断
   IE = 0x97;                        //允许串口,中断0、1定时器 0 
   TCON = 0x05;
   TMOD =0x21;                   //定时器1为自动装入方式
   PCON = 0;                         //SMOD(PCON.7)=1时,波特率翻倍                                         //SMOD=1(晶振为11.0592时为0)
   SCON = 0xD0;                 //串口工作方式:9位UART,波特率可变
   TH1= 0xf3;
   TL1 = 0xf3;
   PCON = 0x80|PCON;           //SMOD =1
                                            //波特率设置为9600,晶振为24MHZ
                                           //SMOD=0=4.8kbit/s
                                          //th1= tl1=fd,smod=0=19.2kbit/s
   TR1 = 1;                         //启动定时器1
   SelectComm1 = 0;
   SelectComm2 = 0;
   SelectComm3 = 0;
   SelectComm4 = 0;
   SelectComm5 = 0;
   SelectComm6 = 0;
}
 

void send(unsigned char *temp,int j)
{
  int i =0;
  LampComm = TRUE;
  EA= 0;
  for(i=0;i<j-1;i++)   // 按发送数据的长度来发送数据
   {
   ACC=*(temp+i); 
   TB8 = P;
   SBUF = ACC;     //发送数据
   while(TI = 0);  //发送完数据,TI会自动置1
   TI=0;           //发送数据完毕,将TI清零,准备下一次发送
    }
EA=1;
LampComm = FALSE;
}


void  Rcv_INT(void)  interrupt 1
                                                  //串口优先级为1
{
   LampComm = TRUE;
   if(RI)                           //如果收到数据则进行下面的操作
   {
   ACC=SBUF;             //将串行通信的缓存中的数据存入寄存器A
   if(P==RB8)
    {
      rcvdata= ACC;     //将寄存器A中的数据存入变量rcvdata
      EvRcv = TRUE;   //将已经接收到数据的标志位置高
    }
   RI= 0;                  //RI清零
 }
 LampComm = FALSE;
}

void delay(int i)      //延时子程序
  {
   int j;
   i=i*DELAY_VALUE;
   while(j<i)
   j++;
}

⌨️ 快捷键说明

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