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

📄 048v2.c

📁 检测设备是否具备高压端口的控制程序 ,能实时上报设备端口的状态
💻 C
字号:
#include "stdio.h"
#include "reg51.h"
#include "ctype.h"
#include "absacc.h"

#define uchar unsigned char 
#define ACK 0X06                        /*  遥控肯定应答*/
#define NAK 0X15                        /*  遥控否定应答*/ 

#define COM8155 XBYTE[0x80f0]		/*定义8155命令口地址*/
#define PA8155 XBYTE[0x80f1]		/*定义8155 A口(段码输出)地址*/
#define PB8155 XBYTE[0x80f2]		/*定义8155 B口(位码输出)地址*/
#define PC8155 XBYTE[0x80f3]		/*定义8155 C口(位码输出)地址*/
#define DSSECOND XBYTE[0x4000]		/*定义DS12C887秒寄存器地址*/	
#define DSMINUTE XBYTE[0x4002]		/*定义DS12C887分寄存器地址*/
#define DSHOUR XBYTE[0x4004]		/*定义DS12C887时寄存器地址*/
#define DSDAY XBYTE[0x4007]			/*定义DS12C887日寄存器地址*/
#define DSMONTH XBYTE[0x4008]		/*定义DS12C887月寄存器地址*/
#define	DSYEAR XBYTE[0X4009]		/*定义DS12C887年寄存器地址*/
#define DSA	XBYTE[0x400A]			/*定义DS12C887 A寄存器地址*/
#define DSB XBYTE[0x400B]			/*定义DS12C887 B寄存器地址*/
#define DSD XBYTE[0x400D]			/*定义DS12C887 D寄存器地址*/
int bright;
uchar idata r_buf[15];				/*接收缓冲区*/
uchar idata t_buf[4];				/*发送缓冲区*/
sbit p1_7=P1^7;						/*WATCHDOG 清零脉冲输出脚*/
bit flag;							/*接收完整一条命令中断标志*/
int r_in,r_out,t_num,t_out,n;
bit r_full;

/*************************************************************************************************
* 		将每一位数值转换为相应的数码管显示代码,并送去8155的PA口显示			*
*************************************************************************************************/
void getsegmentcode(int digitvalue)
{
	switch(digitvalue){
	case 0x00:
		PA8155=0xC0;
		break;
	case 0x01:
		PA8155=0xF9;
		break;
	case 0x02:
		PA8155=0xA4;
		break;
	case 0x03:
		PA8155=0xB0;
		break;
	case 0x04:
		PA8155=0x99;
		break;
	case 0x05:
		PA8155=0x92;
		break;
	case 0x06:
		PA8155=0x82;
		break;
	case 0x07:
		PA8155=0xF8;
		break;
	case 0x08:
		PA8155=0x80;
		break;
	case 0x09:
		PA8155=0x90;
		break;
	default:
		PA8155=0xff;
		break;
	}
}
/*************************************************************************************************
*	delay()延迟程序是用来产生每位显示所需的时间						*
*	delay1()延迟程序是等待系统外围器件进入稳定后再执行主程序的时间				*
*       delay2()用于片选信号的延迟处理                                                          *  
*************************************************************************************************/
void delay()
{
	int i,k;
	for(i=0;i<2;i++)
		for(k=0;k<10;k++){}
}

void delay2()
{
	int i,k;
	for(i=0;i<2;i++)
		for(k=0;k<18;k++){}
}

void delay1()
{
	int i,k;
	for(i=0;i<10;i++)
		for(k=0;k<50;k++){}
}


/*************************************************************************************************
*	串口发送程序,向上端程序发送数据或对收到命令的应答. t_buf[]为发送缓冲区			*
*************************************************************************************************/
void senddata(void)
{
	for(t_out=0;t_out<=t_num;t_out++){
		SBUF=t_buf[t_out];
		while(TI==0);
		TI=0;
	}
}
/*************************************************************************************************
*	处理查询当前亮度值或修改当前亮度值的命令						*
*************************************************************************************************/
void processbright(void)
{
 switch(r_buf[2]){
	case '?':                                       			
		t_buf[0]=0x02;                          			
		t_buf[1]=bright;                        			
		t_buf[2]=0x03;                          			
		t_num=2;                                			
		senddata();                             			
		break;                                  			
	case '0':                                       			
		bright=0x30;P1=0X10;                    			
		t_buf[0]=0x06;t_num=0;senddata();break; 			
	case '1':                                       			
		bright=0x31;P1=0X11;                    			
		t_buf[0]=0x06;t_num=0;senddata();break; 			
	case '2':                                       			
		bright=0x32;P1=0X12;                    			
		t_buf[0]=0x06;t_num=0;senddata();break; 			
	case '3':                                       			
		bright=0x33;P1=0X13;                    			
		t_buf[0]=0x06;t_num=0;senddata();break; 			
	case '4':                                       			
		bright=0x34;P1=0X14;                    			
		t_buf[0]=0x06;t_num=0;senddata();break; 			
	case '5':                                       			
		bright=0x35;P1=0X15;                      			
		t_buf[0]=0x06;t_num=0;senddata();break;   			
	case '6':                                         			
		bright=0x36;P1=0X16;                      			
		t_buf[0]=0x06;t_num=0;senddata();break;   			
	case '7':                                         			
		bright=0x37;P1=0X17;                      			
		t_buf[0]=0x06;t_num=0;senddata();break;   			
	default:                                          			
		t_buf[0]=NAK;                            			
		t_num=0;                                  			
		break;                                    			
	}                                                 			
	                                                        	
}

/*************************************************************************************************        
        判断r_buf()的值是否合法,返回0为不合法 ,yyh Add 2/2/2001                     
**************************************************************************************************/
int rbufOK(void)
{
	int i;
	for(i=2;i<=7;i++){	
		if((r_buf[i]&0x0f)>0x09) {
			t_buf[0]=NAK;                                   	
			t_num=0;                                         	
			senddata(); 
			return 0;   	
		}
	}	
	return 1;
}


/*************************************************************************************************
* 					处理修改日期的命令					*
*************************************************************************************************/
void processdate(void)
{
	if(rbufOK()==0) return;
	DSB=0X82;

	DSYEAR=((r_buf[2]<<4)&0xf0)|(r_buf[3]&0x0f);     
	DSMONTH=((r_buf[4]<<4)&0xf0)|(r_buf[5]&0x0f);    	
	DSDAY=((r_buf[6]<<4)&0xf0)|(r_buf[7]&0x0f);      	
	                                                 	
	DSB=0X02;                                        
	t_buf[0]=0x06;                                   	
	t_num=0;                                         	
	senddata();                                      	
		
}

/*************************************************************************************************
*					处理修改时间的命令					*
*************************************************************************************************/
void processtime(void)
{
	if(rbufOK()==0) return;
	DSB=0X82;

	DSHOUR=((r_buf[2]<<4)&0xf0)|(r_buf[3]&0x0f);          	
	DSMINUTE=((r_buf[4]<<4)&0xf0)|(r_buf[5]&0x0f);        	
	DSSECOND=((r_buf[6]<<4)&0xf0)|(r_buf[7]&0x0f);        	
	                                                      
	DSB=0X02;                                             	
	t_buf[0]=0x06;                                        	
	t_num=0;                                              	
	senddata();                                           	
}

/*************************************************************************************************
*			处理收到的命令,判断是何种命令,并调用相关命令处理程序			*
*************************************************************************************************/

void processcommand(void)
{
	switch(r_buf[0]){
		case 0x02:
				
			switch(r_buf[1]){
				case 'b':
					processbright();						
					break;
				case 'd':
					processdate();
					break;
				case 't':
					processtime();
					break;
				default:
						t_buf[0]=NAK;
						t_num=0;
						senddata();
						break;
			}
		case ACK:
				break;
		default:
				t_buf[0]=NAK;
				t_num=0;
				senddata();
				break;
	}
}

/*************************************************************************************************
*					初始化程序						*
*************************************************************************************************/
void init()
{
	flag=0;					/*中断标志*/
	
	COM8155=0x0f;				/*8155命令口编程为PA、PB、PC皆为输出口*/
	TMOD=0x20;				/*设置4800波特率的定时器一及其初始值*/
	TL1=0xfa;TH1=0xfa;
	SCON=0x50;PCON=0x00;			/*工作于方式一10位异步收发方式*/
	TR1=1;					/*使定时器一开始工作*/
	bright=0x36;P1=0X16;           	/*设置亮度初始值*/
	IE=0x90;r_in=r_out=0;r_full=0;
	PA8155=0xFF;PB8155=0xFF;PC8155=0xFF;	
	ACC=DSD;				/*时钟芯片初始化*/
	DSA=0x20;
	DSB=0x02;
	
}

/*************************************************************************************************
*					主程序							*
*************************************************************************************************/
void main(void)
{	
	int lsdvalue,msbvalue,f;

	delay1();
	init();
	
	while(1)
	{
		p1_7=1;				/*产生看门狗清零脉冲*/
		p1_7=1;
		p1_7=0;

		f=DSSECOND;			/*显示时间程序开始*/
		lsdvalue=f&0x0f;;
		PB8155=0xFF;
		delay2();
		getsegmentcode(lsdvalue);
		PB8155=0xFE;
		delay();
		msbvalue=f>>4;
		PB8155=0xFF;
		delay2();
		getsegmentcode(msbvalue);
		PB8155=0xFD;
		delay();

		f=DSMINUTE;
		lsdvalue=f&0x0f;
		PB8155=0xFF;
		delay2();
		getsegmentcode(lsdvalue);		
		PB8155=0xFB;
		delay();
		msbvalue=f>>4;
		PB8155=0xFF;
		delay2();
		getsegmentcode(msbvalue);		
		PB8155=0xF7;
		delay();

		f=DSHOUR;
		lsdvalue=f&0x0f;
		PB8155=0xFF;
		delay2();
		getsegmentcode(lsdvalue);		
		PB8155=0xEF;
		delay();
		msbvalue=f>>4;
		PB8155=0xFF;
		delay2();
		getsegmentcode(msbvalue);		
		PB8155=0xDF;
		delay();
		PB8155=0xFF;	
			
		f=DSDAY;				/*显示日期程序开始*/
		lsdvalue=f&0x0f;
		PC8155=0xFF;
		delay2();
		getsegmentcode(lsdvalue);
		PC8155=0xFE;
		delay();
		msbvalue=f>>4;
		PC8155=0xFF;
		delay2();
		getsegmentcode(msbvalue);
		PC8155=0xFD;
		delay();

		f=DSMONTH;
		lsdvalue=f&0x0f;
		PC8155=0xFF;
		delay2();
		getsegmentcode(lsdvalue);
		PC8155=0xFB;
		delay();
		msbvalue=f>>4;
		PC8155=0xFF;
		delay2();
		getsegmentcode(msbvalue);
		PC8155=0xF7;
		delay();

		f=DSYEAR;
		lsdvalue=f&0x0f;
		PC8155=0xFF;
		delay2();
		getsegmentcode(lsdvalue);
		PC8155=0xEF;
		delay();
		msbvalue=f>>4;
		PC8155=0xFF;
		delay2();
		getsegmentcode(msbvalue);
		PC8155=0xDF;
		delay();
		PC8155=0xFF;
		
		if(flag==1)
		{					/*判断是否有中断产生*/
			processcommand();
			flag=0;          
		}
	}
}

/*************************************************************************************************
*		串口接收中断程序								*
*************************************************************************************************/
void serial() interrupt 4 using 1
{
	r_buf[r_in]=SBUF;
		RI=0;
	if(r_buf[r_in]==0x02 && r_in>0)	//先判断桢头
	{	
		int i;
		for(i=0;i<r_in;i++)
		{	
			r_buf[i]=0xff;	
		}
		r_buf[0]=r_buf[r_in];
		r_in=1;
		flag=0;
	}
	else if(r_buf[r_in]!=0x03 && r_buf[r_in]!=0x06)//再判断桢尾
	{
		if(r_in > 0x0f)		//不会接收15个字节的数据
		{	
			t_buf[0]=0xff;
			t_num=0;
			senddata();

			r_in = 0;		//复位
			flag = 0;
			return;
		}
	
		r_in+=1;
	}
	else if((r_buf[r_in]==0x03) || (r_buf[r_in]==0x06)) 
	{
		r_in=0;
		flag=1;
	}
	else
	{
		r_in=0;
		flag=0;
	}
}
/*
	RI=0;

	if(SBUF==0x02 && r_in ==0)	//先判断桢头
	{
		r_buf[0]=SBUF;
		r_in=1;
	}
	else if(r_in > 0 && SBUF!=0x03 && SBUF!=0x06)//有效数据
	{
		if(r_in > 0x0f)		//不会接收15个字节的数据
		{	
			t_buf[0]=0xff;
			t_num=0;
			senddata();

			r_in = 0;		//复位
			flag = 0;
			return;
		}
		
		r_buf[r_in]=SBUF;
		r_in+=1;
	}
	else if((r_in > 0 && SBUF==0x03) || (SBUF==0x06)) //桢尾
	{
		r_in=0;
		flag=1;
	}
	else
	{
		r_in = 0;
		flag = 0;
	}*/

⌨️ 快捷键说明

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