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

📄 51

📁 51单片机应用系统典型模块开发大全
💻
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>           				
#include<stdio.h>
#include<intrins.h>
#include<absacc.h>
#define uchar 		unsigned char
#define uint 		unsigned int
#define sint        signed int
#define disp_off  	0x3e     				//显示关
#define disp_on   	0x3f     				//显示开
#define disp_x   	0xb8     				//页地址为0页
#define disp_z   	0xc0     				//行地址为0行
#define disp_y   	0x40     				//列地址为0列
#define comm     	0     					//命令标志位
#define dat1      	1     					//数据标志位
#define data_ora   	P0     					//液晶12864的数据端与单片机的P0相连
sbit di =P2^0; 								//数据命令选择短,H:写数据,L:写指令
sbit rw =P2^1; 								//读写端,H:read,L:write
sbit e 	=P2^4; 								//读写使能
sbit cs1=P2^2; 								//cs1=H,选择左半屏
sbit cs2=P2^3; 								//cs2=H,选择右半屏
sbit clk=P1^0;        						//8563 clk
sbit dat=P1^1;        						//8563 data
sbit SDA=P2^6;								//2416的数据端
sbit SCL=P2^5;								//2416的时钟端
#define adin XBYTE[0x7ff8+chnn]				//AD转换地址
uchar chnn;									//水压力数据路号0~7
uint Vi[8];
uchar fen=0x42,miao=0x38,shi=0x17,riqi=0x02,//设置时间用
    yuefen=0x08,xingqi=0x18,nian=0x09,zhongduan;//设置时间用
uchar code tabma[10][16]=
//阴码点阵格式、取模方式为列行式、逆向取模(低位在前),
//十六进制输出,中文16*16,英文8*16 宋体
{
//0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9)
    {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
	 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},	/*"0",0*/
    {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
     0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},	/*"1",1*/
    {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
     0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},	/*"2",2*/
    {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
     0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},	/*"3",3*/
    {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
     0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},	/*"4",4*/
    {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
     0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},	/*"5",5*/
    {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
     0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},	/*"6",6*/
    {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
     0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},	/*"7",7*/
    {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
     0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},	/*"8",8*/
    {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
     0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},	/*"9",9*/
};
uchar code tab2ma[7][32]=
//  日(0) 一(1) 二(2) 三(3) 四(4) 五(5) 六(6)
{
    {0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,
     0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,
     0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00},	/*"日",0*/
    {0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
     0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},	/*"一",1*/
    {0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,
     0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,
     0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
     0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00},	/*"二",2*/
    {0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,
     0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
     0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},	/*"三",3*/
    {0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,
     0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,
     0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,
     0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00},	/*"四",4*/
    {0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,
     0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,
     0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,
     0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00},	/*"五",5*/
    {0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,
     0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
     0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,
     0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00},	/*"六",6*/
};
uchar code nianma[]=
//年(0) 月(1) 日(2) 星(3) 期(4)
    {0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,
     0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
     0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,
     0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00};	/*"年",0*/
uchar code yuema[]=
    {0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,
     0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
     0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,
     0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00};	/*"月",1*/
uchar code rima[]=
    {0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,
     0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,
     0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00};	/*"日",2*/
uchar code xingqima[]=
    {0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,
     0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,
     0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,
     0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,	/*"星",3*/
     0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,
     0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
     0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,
     0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00};	/*"期",4*/
//时(0) 分(1) 秒(2)
uchar code shima[]=
    {0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,
     0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
     0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,
     0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00};	/*"时",0*/
uchar code fenma[]=
    {0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,
     0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
     0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,
     0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00};	/*"分",1*/
uchar code miaoma[]=
    {0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,
     0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
     0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,
     0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00};	/*"秒",2*/
void delay(sint n);             			//延时程序
void start_bit(void);						//IIC开始条件
void stop_bit(void);						//IIC停止条件
void mast_ack(void);						//IIC应答
bit write_8bit(uchar ch);					//IIC写8位数据
uchar read24c16(uint address,uchar *shu);	//IIC读字节数据
uchar write24c16(uint address,uchar ddata);	//IIC写字节数据
uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad);//IIC页写
uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);//IIC页读

void xie_start();            				//开始条件
void xie_stop();           					//停止条件
bit xie1(uchar shu);           				//向8563中写入1个字
uchar du1();           						//从8563中读出1个字
uchar du();           						//从8563中读出时间和日期
uchar xie();           						//向8563中设置时间和日期
void delay1 (uint ms);           			//延时
void wr_lcd (uchar dat_comm,uchar content);	//向12864中写命令
void chk_busy ();							//忙闲检测
void lat_disp (uchar data1,uchar data2);	//写点阵
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn);
//显示汉字
void init_lcd ();							//12864初始化
void disp();								//时间显示程序
void ad0to7();								//8路转换 且转换为压力
uchar ad_action(uchar chn);					//1路AD转换
void dispVi();								//显示压力
//-------------主函数--------------------
void main()
{
    uchar m=0,k=0;
    init_lcd ();							//LCD初始化
    lat_disp(0x00,0x00);
    xie(); 									//预设时间用,设置好时间后可以屏蔽
    du(); 									//读8563的时间
	m=miao;									//暂存秒
	for (;;)
    {
        du(); 								//读8563的时间
		if(m!=miao)							//1秒时间到
		{
			m=miao;							//暂存秒
			if (miao%5==0)					//每五秒读一次压力 并显示
			{
				ad0to7();					//8路转换 且转换为压力
				lat_disp(0x00,0x00);		//清屏
				dispVi();					//显示压力
				if((fen%6==0)&(miao==0))	//每六分钟存储一次
				{
					page_wr(8*k,8,&Vi[0]==0);//存储压力数据 2416共2048个字节	10*24=240次数据	
					k++;
					if(k==240)				//1天后数据清零
					{
						page_wr(0,240,0);
						k=0;
					}						
				}					
			}
			else
			{
				lat_disp(0x00,0x00);		//清屏		
				disp();						//显示时间
			}
		}		
	}        
}

uchar ad_action(uchar chn)					//1路AD转换
{
	uchar read_data;
	chnn=chn; 								//把输入路号给变址CHNN
	adin=chn; 								//写 启动转换
	delay(15); 								//延时
	read_data=adin;							//读AD转换结果
	return read_data;						//返回AD转换数据
}

void ad0to7()								//8路转换 且转换为压力
{
	uchar i;
	for(i=0;i<8;i++)
	Vi[i]=(ad_action(i)/255)*500;	 		//转换为压力0~500Kpa 单位为Kpa
} 

/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:2416开始位
-----------------------------------------------*/
void start_bit(void)
{
	SCL=1;_nop_();
	SDA=1;_nop_();
	SDA=0;_nop_();
	SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:2416停止位
-----------------------------------------------*/
void stop_bit(void)
{
	SDA=0;_nop_();
	SCL=1;_nop_();
	SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:2416主答函数
-----------------------------------------------*/
void mast_ack(void)
{
	SCL=0;_nop_();
	SDA=0;_nop_();
	SCL=1;_nop_();
	SCL=0;_nop_();
	SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:2416写一个字节(8位)数据
-----------------------------------------------*/
bit write_8bit(uchar ch)
{
	uchar i=8;
	bit fan_w;
	SCL=0;_nop_();
	while(i--)
	{
		SDA=(bit)(ch&0x80); 				//取字节的最高位
		_nop_();
		ch<<=1;             				//字节左移一位
		SCL=1;_nop_();     	 				//上升沿锁存数据
		SCL=0;_nop_();
	}
	SDA=1;_nop_();
	SCL=1;_nop_();
	fan_w=SDA;             					//读应答信号
	SCL=0;_nop_();
	return(fan_w);         					//返回应答信号
}


/*----------------------------------------------
调用方式:uchar read24c16(uint address,uchar *shu)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read24c16(uint address,uchar *shu)
{
    uchar data rdata;
    uchar i=8;
    EA=0;									//避免与中断冲突
    start_bit();							//起始条件
    if (write_8bit(0xA0)!=0) 				//写操作
	{
		stop_bit();EA=1;return(0); 			//不成功时 停止 返回0
    }
    if (write_8bit(address)!=0) 			//写地址操作
	{
        stop_bit();EA=1;return(0); 			//不成功时 停止 返回0
    }
    start_bit();
    if (write_8bit(0xA1)!=0) 				//读操作
	{
        stop_bit();EA=1;return(0); 			//不成功时 停止 返回0
    }
    while (i--) 							//8位数据
    {
        rdata<<=1; 							//左移 先读高位
        SCL=1;_nop_();						//上升沿读数据
        if (SDA) rdata|=0x01; 				//读入数据
        SCL=0;_nop_();						//时钟拉低
    }
    stop_bit();								//停止条件
    EA=1;
    *shu=rdata; 							//存读入数据
    return (1); 							//成功 返回1
}

/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
uchar write24c16(uint address,uchar ddata)
{
    EA=0;  									//避免与中断冲突
    start_bit();							//起始条件
    if (write_8bit(0xA0)!=0) 				//写
	{
        stop_bit();EA=1;return(0); 			//不成功时 停止 返回0
    }
    if (write_8bit(address)!=0) 			//写地址
	{
        stop_bit();EA=1;return(0); 			//不成功时 停止 返回0
    }
    if (write_8bit(ddata)!=0) 				//写数据
	{
		stop_bit();EA=1;return(0); 			//不成功时 停止 返回0
    }
    stop_bit();								//停止条件
    EA=1;
	return(1); 								//成功 返回1
}

/*-----------------------------------------------
调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)
函数说明:2416页面写函数,firstw_ad为写入字节单元的首地址,
          *firstr-ad为被写入数据所在首地址指针
          counter为写入数据字节数
-----------------------------------------------*/
uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad)
{
	uchar data *ufirstr_ad;
	ufirstr_ad=firstr_ad;
	start_bit();                                        	//写开始位
	if(write_8bit(0xA0)!=0){stop_bit();return(0);}      	//写命令
	if(write_8bit(firstw_ad)!=0){stop_bit();return(0);}		//写首地址 
	while(counter--)                                      	//写字节数减1 
	{

⌨️ 快捷键说明

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