📄 computer2.c
字号:
/********************************************************************/
/* 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 + -