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

📄 computer2.c

📁 AT89S52串口多字节接收,可以接收任意字节.
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************/
/*                            2006-05-24 						    */
/******************* RS232接收不定数据长度的程序 ********************/
/***************************** Ver 1.0 ******************************/

#include <reg51.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
/* 直接访问方式地址定义,根据用户平台接口修改 */
//PARA1    EQU     20H      ; 应用于DMF682(256*128)
//PARA1	   EQU     28H	   ; 应用于DMF50081/50174(320*240)
//PARA1    EQU     50H	   ; 应用于DMF50036(640*200)
 
#define  wcadd1   XBYTE[0xbf00]  /* 写指令代码地址 */
#define  wdadd1   XBYTE[0x3f00]  /* 写参数及显示数据地址 */
#define  rdadd1   XBYTE[0xbf00]  /* 读参数及显示数据地址 */
#define  rbadd1   XBYTE[0x3c00]  /* 读忙状态地址 */
#define  Io8155   XBYTE[0xef00]
#define  M8155    XBYTE[0xcf00]
#define  M8155_1  XBYTE[0xcf10]
#define  Io8155_A XBYTE[0xef01]
#define  Io8155_B XBYTE[0xef02]
#define  Io8155_C XBYTE[0xef03]

/* 程序参数定义,根据用户选择的LCM型号修改 32K(7FFFH)*/
#define  True              1
#define  False             0
#define  PARA              0x28;
#define  AD_Value          0x2c;

#define  Rs232_Input_LEN   10
#define  Rx_start_data     0x81

typedef  unsigned char uchar;
typedef  unsigned int  uint;
sfr16    DPTR  = 0x82;
sfr16    flash = 0xb3;
sfr      SMOD = 0x87;
sfr      SFCF = 0xb1;
sfr      SFCM = 0xb2;
sfr      SFAL = 0xb3;
sfr      SFAH = 0xb4;
sfr      SFDT = 0xb5;
sfr      SFST = 0xb6;

sbit     RS485        = P1^2;				//S52
sbit     MCU_LED      = P1^0;
sbit     MCU_LED2     = P0^0;
sbit     Ds1302_clock = P2^2;
sbit     Ds1302_data  = P2^1;
sbit     Ds1302_rst   = P2^0;


//sbit     RS485        = P3^5;				 //C2051
//sbit     MCU_LED      = P1^7;
//sbit     Ds1302_clock = P1^6;
//sbit     Ds1302_data  = P1^5;
//sbit     Ds1302_rst   = P1^4;
sbit     Video        = P3^7;
/*********************************/

/* 定义调用子程序 */
void   Close_write_bit(void);
void   Open_write_bit(void);
void   Init_ds1302(void);
void   Read_ds1302();
void   Write_ds1302(uchar address,uchar numb);

uchar  TXD_pc(uchar icode);
void   delay_2();
void   delay(uint count0);
void   delay_3(uchar count0);

//;-------------- DMF-50081/50174 的SYSTEM SET 参数 --------------
//SYSTAB:	DB 30H,87H,07H,27H,42H,0F0H,28H,00H       ; P1-P8参数
//SCRTAB:	DB 00H,00H,0F0H,00H,30H,0F0H,00H,60H,00H,00H ; P1-P10参数
/*-------------------240128的SYSTEM SET 参数-------------------------------*/
//code   uchar SYSTAB[8]={0x30,0x87,0x07,0x1e,0x21,0x80,0x1f,0x00};
//code   uchar SCRTAB[10]={0x00,0x00,0x80,0xf0,0x01,0x80,0x00,0x00,0x00,0x00};
/*-------------------320240的SYSTEM SET 参数-------------------------------*/
code     uchar SYSTAB[8]  = {0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
code     uchar SCRTAB[10] = {0x00,0x00,0xf0,0x00,0x30,0xf0,0x00,0x60,0x00,0x00};
//code   uchar SCRTAB[10]={0x00,0x00,0xf0,0xce,0x04,0xf0,0x80,0x00,0x00,0x00};
/* 在此可以观察文本方式下的字符及光标的显示效果(写入内容为"Sevicer tel:") */
code     uchar DRAG_1[6][5] = {0,1,2,3,0xfe,0,1,4,5,0xfe,6,7,8,9,0xfe,10,8,4,5,0xfe,11,12,13,14,0xfe,53,54,55,56,0xff};
code     uchar TXT_2[] = {0x84,0x84,0x84,0x84,0x84,0x84,0xff};
code     uchar TXT_1[] = {0x80,0x80,0x80,0x80,0x80,0x82,0xff};
code     uchar TXT_3[] = {23,23,23,23,23,23,0xff};
code     uchar TXT_4[] = {59,57,58,60,0xff};
code     uchar TXT_5[] = {67,68,69,63,64,0xff};
/* 文本方式下的汉字显示方法
 在文本方式下显示汉字, 需要在SED1335 等显示RAM 内建立一个自定义字符库
 CGRAM,然后通过在相应的单元写入相应的字符代码来实现汉字的显示.
 SED1335 等的字符代码对应的是8x8 点阵的字符块, 而一个汉字需要四个8x8
 点阵的字符块组合显示, 所以在建立汉字的CGRAM 时, 需要四个字符代码管理一个
 汉字, 一般是按左上部, 左下部, 右上部和右下部四部分分配代码. 比如在演示程
 序中建立 "清华" 两个汉字的CGRAM,那么这两个汉字的代码为80H(81H,82H,83H)和
 84H(85H,86H,87H). */

uchar  menu = 0;
uchar  TH0_T,TL0_T;
uchar  Buffer;
uint   V_ml;
uchar  Speed_V;
uchar  bdata AD;
uint   bdata Adend;
sbit   AD_0    = AD^0;
sbit   AD_1    = AD^1;
sbit   AD_7    = AD^7;

bit    Read_Flag;
bit    Write_Flag; 

bit    Stop;
bit    Stop1;
bit    Ack;
bit    Work;
bit    Work1;
/**************************/
/*******串口接收设置*******/
bit    Rs232_Rece_Error;
bit    Start_Rxd;
uchar  Rs_buf[Rs232_Input_LEN];
uchar  M_D[8];
unsigned char g_cReceNum;  
bit    Rs232_Flag;
/*********************/
/*     演示主程序    */
/*********************/
void main()
{ 

 
  
    	
         TH1 = TL1 = 0xFD;    //9600Kbps
		 Ack  = False;
		 g_cReceNum = 0;
		 Work = False;
         Stop = False;
         TH0_T = 0; TL0_T = 0;
  	     delay_2();
	     _nop_();
	     

	MCU_LED = 0;
	delay(500);
	MCU_LED = 1;
	delay(500);
	MCU_LED = 0;
	delay(500);
	MCU_LED = 1;
	delay(500);
	MCU_LED = 0;
	delay(500);
	MCU_LED = 1;
	Init_ds1302();															  


                 
	     
	     ES = 1;
		 delay_3(1);         
         SCON = SCON|0x50;
 while(1)
 {                         
	     
         TMOD = TMOD|0x21;
		 //PCON |= 0x80;
         TR1  = True; EA  = True;
		 TR0  = True; ET0 = True;
		 ES   = True;
		 if (Rs232_Rece_Error) 	{
		              Rs232_Rece_Error = False;
		              TXD_pc(0xBD);TXD_pc(0x90);TXD_pc(0x90);
				      TXD_pc(0x90);TXD_pc(0x90);TXD_pc(0x90);
		 }
          if (Rs232_Flag)
               {   
                     Rs232_Flag = 0;
					 if (Rs_buf[2] == 0xB1)
                     { 
				           RS485    = False;
						   MCU_LED = 0;
						   Work     = True;
						   TXD_pc(0xBD);TXD_pc(0xA0);TXD_pc(0xA0);
				           TXD_pc(0xA0);TXD_pc(0xA0);TXD_pc(0xA0);
				     }
	                 if (Rs_buf[2] == 0xB2)
                     { 
				           RS485    = True;
	                       MCU_LED = 1;
						   Stop     = True;
						   TXD_pc(0xBD);TXD_pc(0xA3);TXD_pc(0xA3);
				           TXD_pc(0xA3);TXD_pc(0xA3);TXD_pc(0xA3);
				     }
		             if (Rs_buf[2] == 0xB3) 
		             {
				           Ack = True;
				     }
		             if (Rs_buf[2] == 0xB4)     //读时间秒 ,分,小时,日,月,年
		             {
				           MCU_LED = 0;
	                       delay(10);
	                       MCU_LED = 1;
				           Read_ds1302();
				           TXD_pc(M_D[0]);
				           TXD_pc(M_D[1]);
				           TXD_pc(M_D[2]);
				           TXD_pc(M_D[3]);
				           TXD_pc(M_D[4]);
				           TXD_pc(M_D[6]);
				      }
		              if (Rs_buf[2] == 0xB5)   //写秒
		              {
				           MCU_LED = 0;
	                       delay(10);
	                       MCU_LED = 1;
				           Open_write_bit();
				           Write_ds1302(0,Rs_buf[1]);	    
				           Close_write_bit();
                       }
					   if (Rs_buf[2] == 0xB6) 	 //写分
		              {
					       MCU_LED = 0;
	                       delay(100);
	                       MCU_LED = 1;
				           Open_write_bit();
				           Write_ds1302(1,Rs_buf[1]);	    
				           Close_write_bit();
					   }
					   if (Rs_buf[2] == 0xB7) 	 //写时
		              {
					       MCU_LED = 0;
	                       delay(10);
	                       MCU_LED = 1;
				           Open_write_bit();
				           Write_ds1302(2,Rs_buf[1]);	    
				           Close_write_bit();
					   }
					   if (Rs_buf[2] == 0xB8)    //写日
		              {
					        MCU_LED = 0;
	                       delay(10);
	                       MCU_LED = 1;
				           Open_write_bit();
				           Write_ds1302(3,Rs_buf[1]);	    
				           Close_write_bit();
					   }
					    if (Rs_buf[2] == 0xB9)   //写月
		              {
					       MCU_LED = 0;
	                       delay(10);
	                       MCU_LED = 1;
				           Open_write_bit();
				           Write_ds1302(4,Rs_buf[1]);	    
				           Close_write_bit();
					   }
					    if (Rs_buf[2] == 0xBA)   //写年
		              {
					       MCU_LED = 0;
	                       delay(10);
	                       MCU_LED = 1;
				           Open_write_bit();
				           Write_ds1302(6,Rs_buf[1]);	    
				           Close_write_bit();
					   }
					   if (Rs_buf[2]== 0xBB)  //开视频切换
					   {
					        Video = False;
							MCU_LED = 0;
	                        delay(10);
	                        MCU_LED = 1;
						}
						if (Rs_buf[2]== 0xBC)  //关视频切换
					   {
					        Video = True;
							MCU_LED = 0;
	                        delay(10);
	                        MCU_LED = 1;
						}
						if (Rs_buf[2] == 0xBE)
						{
						   MCU_LED = 0;
	                        delay(10);
	                        MCU_LED = 1;
						   TXD_pc(Rs_buf[0]);
				           TXD_pc(Rs_buf[1]);
				           TXD_pc(Rs_buf[2]);
				           TXD_pc(Rs_buf[3]);
				           TXD_pc(Rs_buf[4]);
				           TXD_pc(Rs_buf[5]);
						   Rs_buf[2] = 0;
						}
					  
				 }
         
 }
}



 uchar count; 
/******************/
/*产生输液量的定时*/
/******************/

void Time_0(void) interrupt 1
{ 
       

       TR0 = 0;
       EA = 0;
       TH0 = TH0_T;
       TL0 = TL0_T;
	   
       if (count>=25)  
       {    
	          count = 0;
			  if (!Ack) 
			          {
						 RS485   = True; 
						 MCU_LED = True;
						 Work    = False;
					  }
			  Ack = False;
			  
	   }
             else count++;
       EA  = 1;
       TR0 = 1;
}
/*******************************/
/***********串口接收************/
/*******************************/
/*********接收不固定长度********/
/*void RS232(void) interrupt 4 using 1
{     
   unsigned char Rece_data = SBUF;
   uchar i;
   uchar verify = 0;
	  
	   EA         = False;
	   ES         = False;  
	   MCU_LED2  = False;
       count      = 0;
              RI = 0;
	  		  if (Start_Rxd) 
			  {
			             g_cReceNum ++;
						 Rs_buf[g_cReceNum] = Rece_data;
			             if (Rs_buf[1] == g_cReceNum+1) 
						 {
								   for (i=0;i<Rs_buf[1]-1;i++)
								   {
									       verify^=Rs_buf[i];
								   }
									   if (verify == Rs_buf[g_cReceNum])
								   {
						                   Rs232_Flag = True;
						                   g_cReceNum = 0;
								   }
							          else 
								   {

⌨️ 快捷键说明

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