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

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
#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<------> LCM

sbit 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,
	0x20,0x3F,0x20,0x00,0x03,0x00,0x00,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,
	0x00,0x10,0x18,0x18,0x0C,0x04,0x02,0x01,
	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);//写数据或命令到LCD
void 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 ();									//初始化T0
	init_lcd ();								//初始化LCD
	measure (); 								//检测主机发送波特率
	init_uart();								//初始化串口
	disp();										//调用显示
	while (1)
	{
		disp_dat();								//修改接收数据
	}
}
/***********************us延时函数**********************/
void delay (uint us)
{
	while(us--);
}
/**********************T0初始化程序***********************/
void init_T0 (void)
{
	TMOD=0x01;									//工作方式1
	TH0=0x00;									//初始化定时器内部寄存器
	TL0=0x00;
}
/***************1bit数据发送时间测量程序*************/
void measure(void)
{
	while(RXD);									//等待主机发送起始位0
	TR0=1;										//启动定时器计时
	while(!RXD);								//等待主机发送最高位1
	TR0=0;										//定时器停止计时
	baud_set=TH0;								//将1bit的发送时间存入baud_SET
}
/**********************初始化串口程序********************/
void init_uart(void)
{
	SCON=0x50;									//工作方式1,允许接收
	TMOD=TMOD|0x20;								//T1为工作方式2
	TH1=255-baud_set;							//设置T1
	TL1=255-baud_set;
	ES=1;										//允许串行中断
	EA=1;										//开总中断
	TR1=1;										//启动定时器T1
	SBUF=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;									//接收中断,清零RI
		uart_data=SBUF;							//将接收数据存入temp,并将接收数据发送至上位机
		SBUF=uart_data;
		temp=uart_data;
	}
	else										//发送中断,清零RI
		TI=0;
}
/**************查询发送数据波特率程序***************/
void search(void)
{
	uchar i;
	switch(baud_set)
	{
		case 0x5f:
			for(i=0;i<5;i++)
				baud[i]=baudrate[0][i];			//波特率为300
			break;
		case 0x2f:
			for(i=0;i<5;i++)
				baud[i]=baudrate[1][i];			//波特率为600
			break;
		case 0x17:
			for(i=0;i<5;i++)
				baud[i]=baudrate[2][i];			//波特率为1200
			break;
		case 0x0b:
			for(i=0;i<5;i++)
				baud[i]=baudrate[3][i];			//波特率为2400
			break;
		case 0x05:
			for(i=0;i<5;i++)
				baud[i]=baudrate[4][i];			//波特率为4800
			break;
		case 0x02:
			for(i=0;i<5;i++)
				baud[i]=baudrate[5][i];			//波特率为9600
			break;
		case 0x01:
			for(i=0;i<5;i++)
				baud[i]=baudrate[6][i];			//波特率为14400
			break;
		default:
			for(i=0;i<5;i++)
				baud[i]=0x0e;		   			//超出测量范围,显示EEEEE
			break;
	}
}

⌨️ 快捷键说明

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