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

📄 main107.c

📁 一些用于电话管理的pc机下位机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//ok
//此程序通过RS-232接口来完成计算机和单片机通信
//此程序首先发送测试数据55H,再通过中断实现数据的接收和发送
//程序的调试可以用"串口调试助手V2.1"辅助完成

#include	"p18cxxx.h"

#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = ON
#pragma config WDTPS =512
#pragma config CCP2MX = ON
#pragma config MCLRE = OFF
#pragma config BOR = ON   //RC2 OK
#pragma config BORV = 42
#pragma config WDT = ON
#pragma config LVP = OFF

#define ADDR_8816      PORTF
#define DATA_8816      PORTFbits.RF7
#define REST_8816      PORTGbits.RG0
#define STROBE_8816    PORTGbits.RG1  
#define CS1_8816       PORTGbits.RG2
#define CS2_8816       PORTGbits.RG3
#define CS3_8816       PORTGbits.RG4  

#define AX0_8816        PORTFbits.RF0
#define AX1_8816        PORTFbits.RF1
#define AX2_8816        PORTFbits.RF2
#define AX3_8816        PORTFbits.RF3
#define AY0_8816        PORTFbits.RF4
#define AY1_8816        PORTFbits.RF5
#define AY2_8816        PORTFbits.RF6
#define DATA_8816       PORTFbits.RF7

#define S1x_PORT    	PORTE
#define S10       		PORTEbits.RE0
#define S11       		PORTEbits.RE1
#define S12       		PORTEbits.RE2
#define S13       		PORTEbits.RE3
#define S14       		PORTEbits.RE4
#define S15       		PORTEbits.RE5
#define S16       		PORTEbits.RE6

#define S1x_TRIS    	TRISE
#define S10_TRIS    	TRISEbits.TRISE0
#define S11_TRIS    	TRISEbits.TRISE1
#define S12_TRIS    	TRISEbits.TRISE2
#define S13_TRIS    	TRISEbits.TRISE3
#define S14_TRIS    	TRISEbits.TRISE4
#define S15_TRIS    	TRISEbits.TRISE5
#define S16_TRIS    	TRISEbits.TRISE6
#define S2x_PORT    	PORTD
#define S20       		PORTDbits.RD0
#define S21       		PORTDbits.RD1
#define S22       		PORTDbits.RD2
#define S23       		PORTDbits.RD3
#define S24       		PORTDbits.RD4
#define S25       		PORTDbits.RD5
#define S26       		PORTDbits.RD6
#define S2x_TRIS        TRISD
#define S20_TRIS    	TRISDbits.TRISD0
#define S21_TRIS    	TRISDbits.TRISD1
#define S22_TRIS    	TRISDbits.TRISD2
#define S23_TRIS    	TRISDbits.TRISD3
#define S24_TRIS    	TRISDbits.TRISD4
#define S25_TRIS    	TRISDbits.TRISD5
#define S26_TRIS    	TRISDbits.TRISD6
#define S3x_PORT    	PORTB
#define S30       		PORTBbits.RB0
#define S31       		PORTBbits.RB1
#define S32       		PORTBbits.RB2
#define S33       		PORTBbits.RB3
#define S34       		PORTBbits.RB4
#define S35       		PORTBbits.RB5
#define S36       		PORTBbits.RB6
#define S3x_TRIS    	TRISB
#define S30_TRIS    	TRISBbits.TRISB0
#define S31_TRIS    	TRISBbits.TRISB1
#define S32_TRIS    	TRISBbits.TRISB2
#define S33_TRIS    	TRISBbits.TRISB3
#define S34_TRIS    	TRISBbits.TRISB4
#define S35_TRIS    	TRISBbits.TRISB5
#define S36_TRIS    	TRISBbits.TRISB6

#define x0  0
#define x1  1
#define x2  2
#define x3  3
#define x4  4
#define x5  5
#define x6  8
#define xbuf  9

#define y0off  0x00
#define y1off  0x10
#define y2off  0x20
#define y3off  0x30
#define y4off  0x40
#define y5off  0x50
#define y6off  0x60
#define ybufoff  0x70

#define y0on  0x80
#define y1on  0x90
#define y2on  0xa0
#define y3on  0xb0
#define y4on  0xc0
#define y5on  0xd0
#define y6on  0xe0
#define ybufon  0xf0

#define OUT_232      	PORTCbits.RC2

union adres
{
	unsigned  int   y;
    unsigned  char  adre[2];
}adresult;  

unsigned  char buf_RCREG;
unsigned  char cmd0;
unsigned  char cmd1;
unsigned  char tt;
unsigned  char aa;
unsigned  char bb;
unsigned  char dd;
unsigned  char S1_reg;
unsigned  char S2_reg;
unsigned  char S3_reg;
void	InterruptHandlerHigh(void);
 
//初始化程序  
void	RS232_initial(void)
{
	SPBRG=25;				//选择传输波特率为9600bps
	TXSTA=0X04;				//选择异步高速方式传输8位数据
	RCSTA=0X80;				//允许同步串行口工作
	TRISC=0XC0;				//将RC7,RC6设置为输入,断绝与外接电路的连接
	BAUDCONbits.BRG16=0;
	TXSTAbits.TXEN=1;		//发送允许
	RCSTAbits.CREN=1;		//接受数据允许
	PIE1bits.RCIE=1;		//接收中断使能
	INTCON=0XC0;			//总中断和外围中断允许
    INTCONbits.PEIE=1;      //外围中断允许
    RCONbits.IPEN=1;        //使能中断优先级
    INTCONbits.GIE=1;       //总中断允许
	TXREG=0X55;				//发送数据55H进行测试
}

//高优先级中断向量
#pragma code InterruptVectorHigh=0x08
void	InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh//跳到中断程
  _endasm
}

//高优先级中断服务程序
#pragma code
#pragma interrupt InterruptHandlerHigh
void	InterruptHandlerHigh ()
{
	while(PIR1bits.RCIF==1)	//若接收中断标志不为1,则为误操作,返回
	{
	//接收命令
    	if((buf_RCREG&0x80)==0)//b7=0 at cmd0, b7=1 at cmd1.
		{                              
		cmd0=RCREG;           
		}                     
    	else
		{	                              
		cmd1=RCREG;           
		buf_RCREG=1; 
		TXREG=0X55;	 	
		}			
	}
}
void MT8816RESET(void)
{
	STROBE_8816=0; 
	REST_8816=1;
	_asm CLRWDT _endasm 
  	_asm CLRWDT _endasm 
    REST_8816=0;
  	_asm CLRWDT _endasm 
	CS1_8816=1;  
	CS2_8816=1;  
	CS3_8816=1;	     
	_asm CLRWDT _endasm
	ADDR_8816=x0+y0on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=x1+y1on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=x2+y2on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=x3+y3on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=x4+y4on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=x5+y5on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=x6+y6on; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	ADDR_8816=xbuf+ybufon; STROBE_8816=1;    _asm CLRWDT _endasm  STROBE_8816=0; 
	CS1_8816=0;  
	CS2_8816=0; 
	CS3_8816=0;
}
					
unsigned char deal_Sxx_signal(void)
{   
    unsigned  char temp=0;
	S1x_TRIS=0xFF;			
	if((S1x_PORT&0x7F)!=0x7F)
		{
		S1x_TRIS=(S1x_PORT&0x7F)^0x7f;
		S1x_PORT=S1x_TRIS;
        S1_reg=S1x_TRIS;
        temp=1;
		}
	S2x_TRIS=0xFF;
	if((S2x_PORT&0x7F)!=0x7F)
		{
		S2x_TRIS=(S2x_PORT&0x7F)^0x7f; 
		S2x_PORT=S2x_TRIS;
        S2_reg=S2x_TRIS;
		temp=1;
		}
	S3x_TRIS=0xFF;
	if((S3x_PORT&0x7F)!=0x7F)
		{
		S3x_TRIS=(S3x_PORT&0x7F)^0x7f; 
		S3x_PORT=S3x_TRIS;
        S3_reg=S3x_TRIS;
        temp=1;
		}
	OUT_232=temp;
    return(temp);
}

void Set_Sxx_low(void)
{
	S1x_TRIS=0;
	S2x_TRIS=0;
	S3x_TRIS=0;
	S1x_PORT=0;
	S2x_PORT=0;
	S3x_PORT=0;
}

void linker_S1(void)
{  	unsigned  char i;
	STROBE_8816=0; 
	CS1_8816=1;
    for(i=0;i<7;i++)
	{    
    	if((S1_reg&0x1)==1)
		{
		ADDR_8816=i+ybufon;  STROBE_8816=1;    
		_asm CLRWDT _endasm   STROBE_8816=0;
		}
    	else               
		{
		ADDR_8816=i+ybufoff; STROBE_8816=1;    
		_asm CLRWDT _endasm   STROBE_8816=0;
		}
    	S1_reg/=2;
    }
	CS1_8816=0;  
}

void linker_S2(void)
{  	unsigned  char i;
	STROBE_8816=0; 
	CS2_8816=1;
    for(i=0;i<7;i++)
	{    
    	if((S2_reg&0x1)==1)
		{
		ADDR_8816=i+ybufon;  STROBE_8816=1;    
		_asm CLRWDT _endasm   STROBE_8816=0;
		}
    	else               
		{
		ADDR_8816=i+ybufoff; STROBE_8816=1;    
		_asm CLRWDT _endasm   STROBE_8816=0;
		}
    	S2_reg/=2;
    }
	CS2_8816=0;  
}

void linker_S3(void)

⌨️ 快捷键说明

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