压缩包中的内容:
 
  
 
 上位机以及完整程序在文件夹中,大家可自己下载
地址是:http://www.ruidan.com/bbs/dpj-19033-1.html
下面是接受端的源代码:
 #include 
 #include "string.h"
//液晶块
 #define LCM_RW P3_6 //定义引脚
 #define LCM_RS P3_5
 #define LCM_E P3_7
 #define LCM_Data P1
 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
 typedef int byte;
 typedef unsigned int word;
void Read_Temp(void);
 void mychar(char,char);
void WriteDataLCM(unsigned char WDLCM);
 void WriteCommandLCM(unsigned char WCLCM,BuysC);
 unsigned char ReadDataLCM(void);
 unsigned char ReadStatusLCM(void);
 void LCMInit(void);
 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
 void Delay5Ms(void);
 void Delay400Ms(void);
void delay(word useconds)
 {
 for(;useconds>0;useconds--);
 }
void mychar(char xx,char yy)
 {
DisplayOneChar(0,0,0x54);
 DisplayOneChar(1,0,0x65);
 DisplayOneChar(2,0,0x6D);
 DisplayOneChar(3,0,0x70);
 DisplayOneChar(4,0,0x65);
 DisplayOneChar(5,0,0x72);
 DisplayOneChar(6,0,0x61);
 DisplayOneChar(7,0,0x74);
 DisplayOneChar(8,0,0x75);
 DisplayOneChar(9,0,0x72);
 DisplayOneChar(10,0,0x65);
 DisplayOneChar(11,0,0x3A);
 ///////////////////////自定义字符
 WriteCommandLCM(0x48, 0); //第一行
 WriteDataLCM(0x06);
 WriteCommandLCM(0x49, 0); //第2行
 WriteDataLCM(0x09);
 WriteCommandLCM(0x4a, 0); //第3
 WriteDataLCM(0x09);
 WriteCommandLCM(0x4b, 0); //第4
 WriteDataLCM(0x06);
 WriteCommandLCM(0x4c, 0); //第5
 WriteDataLCM(0x00);
 WriteCommandLCM(0x4d, 0); //第6
 WriteDataLCM(0x00);
 WriteCommandLCM(0x4e, 0); //第7
 WriteDataLCM(0x00);
 WriteCommandLCM(0x4f, 0); //第8
 WriteDataLCM(0x00);
 DisplayOneChar(xx,yy,0x01);
 DisplayOneChar(xx+1,yy,0x43);
 }
 //写数据
 void WriteDataLCM(unsigned char WDLCM)
 {
 ReadStatusLCM(); //检测忙
 LCM_Data = WDLCM;
 LCM_RS = 1;
 LCM_RW = 0;
 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 LCM_E = 0; //延时
 LCM_E = 1;
 }
//写指令
 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 {
 if (BuysC) ReadStatusLCM(); //根据需要检测忙
 LCM_Data = WCLCM;
 LCM_RS = 0;
 LCM_RW = 0; 
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1; 
 }
//读状态
 unsigned char ReadStatusLCM(void)
 {
 LCM_Data = 0xFF; 
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
 while (LCM_Data & Busy); //检测忙信号
 return(LCM_Data);
 }
void LCMInit(void) //LCM初始化
 {
 LCM_Data = 0;
 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 Delay5Ms(); 
 WriteCommandLCM(0x38,0);
 Delay5Ms(); 
 WriteCommandLCM(0x38,0);
 Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 WriteCommandLCM(0x08,1); //关闭显示
 WriteCommandLCM(0x01,1); //显示清屏
 WriteCommandLCM(0x06,1); // 显示光标移动设置
 WriteCommandLCM(0x0C,1); // 显示开及光标设置
 }
//按指定位置显示一个字符
 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 {
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 X |= 0x80; //算出指令码
 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 WriteDataLCM(DData);
 }
//按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 {
 unsigned char ListLength,j;
 ListLength = strlen(DData);
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (X <= 0xF) //X坐标应小于0xF
 { 
 for(j=0;j
 DisplayOneChar(X, Y, DData[j]); //显示单个字符
 X++;
 }
 }
 }
 //5ms延时
 void Delay5Ms(void)
 {
 unsigned int TempCyc = 5552;
 while(TempCyc--);
 }
//400ms延时
 void Delay400Ms(void)
 {
 unsigned char TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
 {
 TempCycB=7269;
 while(TempCycB--);
 };
 }
sbit W_IN = P2^1;
 sbit W_OUT = P2^0;
unsigned char w_data;//接收时用于存储两次上升沿之间的时长,发送时存储前半周
 unsigned char send_busy = 0;//存储发送时后半周
 unsigned char recv_timer = 0;
 bit w_stat, last_w_stat;
unsigned char jiffies=0;
 void clock_timer(void) interrupt 1 using 1{
 if (send_busy){
 if(w_data){
 w_data--;
 w_stat = 0;
 }else{
 send_busy--;
 w_stat = 1;
 }
 W_OUT = w_stat;
 }else{
 w_stat = W_IN;
 if (w_stat != last_w_stat){
 last_w_stat = w_stat;
 if (w_stat){
 w_data = recv_timer;
 recv_timer = 0;
 }
 }
 if (~recv_timer)//if(recv_busy != 0xff)
 recv_timer++;
 }
 jiffies++;
 }
void clock_init(void){
 jiffies = 0;
 TMOD=0x02;
 TH0=TL0=0x0ce;//12M,50us
 //TH0=TL0=0x7a;//16M
 //TH0=TL0=0x75;//16.59M
 //TH0=TL0=0x72;//17M
 //TH0=TL0=0x37;//24M
 //TH0=TL0=0x47;//22.1844M, 100us
 //TH0=TL0=0xa3;//22.1844M, 50us
 EA=1;
 ET0=1;
TR0=1;
 }
 void init_serialcomm(void)
 {
 SC = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr 
 TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload 
 PCON |= 0x80; //SMOD=1; 
 TH1 = 0x0e6; //Baud:2400 fosc=11.0592MHz :f4
  = 0x0e6;
 //IE |= 0x90; //Enable Serial Interrupt 
 TR1 = 1; // timer 1 run
 RI=0;
 TI=1; 
 }
void serial_out(unsigned char d){
 while(!TI);
 TI=0;
 SBUF=(d);
 }
void send_string_com(unsigned char *str,int strlen)//串口程序
 { unsigned char sum;
 unsigned char k=0;
 //serial_out(02);
 do
 { //sum^=*(str+k);
 serial_out(*(str + k));
 //serial_out('a');
 k++;
 } while(k < strlen);
 //serial_out(sum);
 //serial_out('e');
 }
//等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
 //超时单位为time_out * 100uS
 bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
 unsigned int time=jiffies;
 unsigned char n=0;
 do{
 if (RI){
 p[n++]=SBUF;
 RI=0;
 if(n==len)
 return 0;
 time=jiffies;
 }
 }while(jiffies-time < time_out);
 return 1;
 }
sys_init(){
 clock_init();
 init_serialcomm();
 }
 //=============================================================
 //发送程序 开始
 //=============================================================
#define _0_WH 8//低电平脉宽
 #define PULS_1_WIDTH 16//高电平脉宽
 #define PULS_HEAD_WIDTH 8//前导信号脉宽
 #define PULS_ART_WIDTH 24//引导信号脉宽
 #define PULS_STOP_WIDTH 8//结束码脉宽
#define PULS_HEAD_COUS 16//前导信号长度
 unsigned char send_buf[16];
 #define send_byts send_buf[0]//剩余字节数,发送完后为0
 unsigned char sending_byte;//当前正在发送的字节
 unsigned char send_byte_p;//已发送字节数(含正在发送的字节)
 unsigned char send_bit_p;//当前正在发送的字节已发送位数(含正在发送的位)
#define SEND_PROGRENG 0x41
 #define SEND_FAILED 0x21
 #define SEND_SESS 0x31
 unsigned char send_stat = 0;//发送程序当前状态,为0时正常
 unsigned char head_counts;//前导信号(包括引导信号)
void start_send(){
 send_byte_p = 0;
 send_bit_p = 0;
 send_stat = SEND_PROGRESSING;
 head_coun

