#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define disp_off 0x3e //关显示#define disp_on 0x3f //开显示#define disp_x 0xb8 //页地址#define disp_z 0xc0 //行地址#define disp_y 0x40 //列地址#define comm 0 //命令标志#define dat 1 //数据标志#define data_ora P0 //MCU P0<------> LCMsbit cs1=P2^0; //cs1=L,选择左半屏sbit cs2=P2^1; //cs2=L,选择右半屏sbit rs =P2^2; //H:写数据,L:写指令sbit rw =P2^3; //H:读,L:写sbit e =P2^4; //读写使能sbit bf =P0^7; //执行操作标志sbit res=P0^4; //复位初始化标志uchar uart_data,temp,baud_set=0x00;uchar dispnum[90];uchar baud[5]={0x00,0x09,0x06,0x00,0x00};uchar r_dat[4]={0x00,0x10,0x00,0x00};uchar code baudrate[7][5]={{0x00,0x00,0x03,0x00,0x00},{0x00,0x00,0x06,0x00,0x00},{0x00,0x01,0x02,0x00,0x00},{0x00,0x02,0x04,0x00,0x00},{0x00,0x04,0x08,0x00,0x00},{0x00,0x09,0x06,0x00,0x00},{0x01,0x04,0x04,0x00,0x00},}; //波特率大小uchar code hz11[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,/*-- 文字: 送--*/0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,/*-- 文字: 数--*/0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,/*-- 文字: 据--*/0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,};uchar code hz12[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 波--*/0x00,0x80,0x20,0x20,0x40,0x40,0xE0,0x20,0x20,0xF0,0x30,0x20,0x20,0xC0,0x00,0x00,0x00,0x19,0x09,0x0D,0x14,0x18,0x27,0x31,0x13,0x0D,0x0D,0x1B,0x18,0x30,0x30,0x10,/*-- 文字: 特--*/0x00,0xC0,0x60,0x40,0xF0,0x60,0x40,0xA0,0xA0,0xF0,0xF0,0xA0,0xA0,0x80,0x80,0x00,0x00,0x02,0x02,0x02,0x3F,0x01,0x01,0x12,0x26,0x2E,0x2A,0x3F,0x1A,0x02,0x00,0x00,/*-- 文字: 率--*/0x00,0x00,0x20,0x60,0x60,0xA0,0x60,0xB0,0x70,0xA0,0xA0,0x60,0x20,0x20,0x00,0x00,0x00,0x04,0x04,0x07,0x05,0x04,0x05,0x3F,0x1F,0x05,0x05,0x05,0x0C,0x0C,0x04,0x00,/*-- 文字: 为--*/0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,0x00,0x10,0x18,0x18,0x0C,0x04,0x02,0x01,0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,};uchar code num[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=8x16 --*/ /*-- 文字: 0 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*-- 文字: 1 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*-- 文字: 2 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, /*-- 文字: 3 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 4 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, /*-- 文字: 5 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 6 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: 7 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, /*-- 文字: 8 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, /*-- 文字: 9 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, /*-- 文字: a --*/0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, 0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20, /*-- 文字: b --*/0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00, 0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00, /*-- 文字: c --*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00, /*-- 文字: d --*/0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00, 0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00, /*-- 文字: e --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, 0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, /*-- 文字: f --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,/*-- 文字: x --*/0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,};uchar code dispunit[]={/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ /*-- 文字: b --*/0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: p --*/0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: s --*/0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,};uchar code hz13[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 发--*/0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,/*-- 文字: 送--*/0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,/*-- 文字: 数--*/0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,/*-- 文字: 据--*/0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,};uchar code hz14[]={/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/ /*-- 文字: 为--*/0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,};/************************函数声明***********************/void chk_busy (void); //判断LCD工作状态void delay (uint us); //us延时函数void init_uart(void); //初始化串口程序void wr_lcd (uchar dat_comm,uchar content);//写数据或命令到LCDvoid init_lcd (void); //初始化LCD程序void lat_disp (uchar data1,uchar data2);//LCD写点阵程序void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn);//写字符函数void change(void); //调整波特率显示码程序void change_dat(void); //调整接收到的数据为显示码程序void disp (void); //LCD显示程序void measure(void); //1bit数据发送时间测量程序void search(void); //查询发送数据波特率程序void init_T0 (void); //T0初始化程序void disp_dat(void); //数据显示程序/**********************主程序***********************/void main (){init_T0 (); //初始化T0init_lcd (); //初始化LCDmeasure (); //检测主机发送波特率init_uart(); //初始化串口disp(); //调用显示while (1){disp_dat(); //修改接收数据}}/***********************us延时函数**********************/void delay (uint us){while(us--);}/**********************T0初始化程序***********************/void init_T0 (void){TMOD=0x01; //工作方式1TH0=0x00; //初始化定时器内部寄存器TL0=0x00;}/***************1bit数据发送时间测量程序*************/void measure(void){while(RXD); //等待主机发送起始位0TR0=1; //启动定时器计时while(!RXD); //等待主机发送最高位1TR0=0; //定时器停止计时baud_set=TH0; //将1bit的发送时间存入baud_SET }/**********************初始化串口程序********************/void init_uart(void){SCON=0x50; //工作方式1,允许接收TMOD=TMOD|0x20; //T1为工作方式2TH1=255-baud_set; //设置T1TL1=255-baud_set;ES=1; //允许串行中断EA=1; //开总中断TR1=1; //启动定时器T1SBUF=0x0d; //向主机发送确认码}/********************判断LCD工作状态********************/void chk_busy (void){data_ora=0xff;rs=0; //命令标志rw=1; //读数据e=1;while(bf||res==1);e=0;}/*******************写数据或命令到LCD******************/void wr_lcd (uchar dat_comm,uchar content){chk_busy (); //查看LCD是否处于忙状态rs=dat_comm; //写入命令/数据rw=0; //写数据data_ora=content; //送命令/数据e=1;e=0;}/*********************初始化LCD程序********************/void init_lcd (void){delay(50);cs1=0;cs2=0;wr_lcd (comm,disp_off);wr_lcd (comm,disp_on); //开显示lat_disp(0x00,0x00); //清屏}/********************LCD写点阵程序*********************/void lat_disp (uchar data1,uchar data2){uchar i,j;cs1=0;cs2=0;wr_lcd (comm,disp_on);for(j=0;j<8;j++){wr_lcd (comm,disp_x+j); //设置页地址wr_lcd (comm,disp_z); //设置起始行wr_lcd (comm,disp_y); //设置列地址for(i=0;i<32;i++){wr_lcd (dat,data1);wr_lcd (dat,data2);}}}/**********************写字符函数**********************/void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn) {uchar i,j,k,l,a;wr_lcd (comm,disp_on); //开显示for(l=0;l<row_xl;l++) //行数循环{for(k=0;k<row_yl;k++) //字数循环{for(j=0;j<xl;j++){wr_lcd (comm,disp_x+x+l*xl+j); //行数调整wr_lcd (comm,disp_z); //列数调整wr_lcd (comm,disp_y+y+k*yl); //字数调整a=l*xl*yl*row_yl+k*xl*yl+j*yl;for(i=0;i<yl;i++) //写数据wr_lcd (dat,chn[a+i]);}}}}/****************调整波特率显示码程序******************/void change(void){uchar temp,i,j,n=0;for(j=0;j<5;j++){temp=baud[j];if((j==0&baud[0]==0x00)|((j==1&baud[1]==0x00))){for(i=0;i<16;i++)dispnum[n++]=0x00;}else{for(i=0;i<16;i++)dispnum[n++]=num[i+temp*16];}}}/*************调整接收到的数据为显示码程序*************/void change_dat(void){uchar temp,i,j,n=0;r_dat[2]=uart_data/16; //将高四位存入r_dat[2]r_dat[3]=uart_data%16; //将低四位存入r_dat[3]for(j=0;j<4;j++){temp=r_dat[j];for(i=0;i<16;i++)dispnum[n++]=num[i+temp*16];//转换显示码}}/*********************LCD显示程序*********************/void disp (void){lat_disp(0x00,0x00); //清屏search(); //查询波特率显示码change(); //调整显示码cs1=0;cs2=1; //显示LCD屏幕左侧前三行信息chn_disp (0,0,2,16,1,4,hz11);chn_disp (2,24,2,8,1,5,dispnum);chn_disp (4,0,2,16,1,4,hz13);cs1=1;cs2=0; //显示LCD屏幕右侧前三行信息chn_disp (0,0,2,16,1,4,hz12);chn_disp (2,8,2,8,1,3,dispunit);chn_disp (4,0,2,16,1,1,hz14);}/*********************数据显示程序*********************/void disp_dat(void){change_dat(); //调整显示cs1=0;cs2=1;chn_disp (6,24,2,8,1,4,dispnum); //将接收到得数据显示在屏幕左侧第四行}/********************串口中断程序********************/void serial_TI(void) interrupt 4{if(RI==1){RI=0; //接收中断,清零RIuart_data=SBUF; //将接收数据存入temp,并将接收数据发送至上位机SBUF=uart_data;temp=uart_data;}else //发送中断,清零RITI=0;}/**************查询发送数据波特率程序***************/void search(void){uchar i;switch(baud_set){case 0x5f:for(i=0;i<5;i++)baud[i]=baudrate[0][i]; //波特率为300break;case 0x2f:for(i=0;i<5;i++)baud[i]=baudrate[1][i]; //波特率为600break;case 0x17:for(i=0;i<5;i++)baud[i]=baudrate[2][i]; //波特率为1200break;case 0x0b:for(i=0;i<5;i++)baud[i]=baudrate[3][i]; //波特率为2400break;case 0x05:for(i=0;i<5;i++)baud[i]=baudrate[4][i]; //波特率为4800break;case 0x02:for(i=0;i<5;i++)baud[i]=baudrate[5][i]; //波特率为9600break;case 0x01:for(i=0;i<5;i++)baud[i]=baudrate[6][i]; //波特率为14400break;default:for(i=0;i<5;i++)baud[i]=0x0e; //超出测量范围,显示EEEEE break;}}。