当前位置:首页 > 单片机 > 单片机
[导读]公司的数控面板和控制板的连线是25芯的,但没有既细又长的配套线,所以一向都是自己用细线做的,但问题也就多了,乘着这几天正学串口通信,用PIC单片机改装了两块板,实现了双机之间的异步通信,并用PROTEUS模拟了出来,跟有

公司的数控面板和控制板的连线是25芯的,但没有既细又长的配套线,所以一向都是自己用细线做的,但问题也就多了,乘着这几天正学串口通信,用PIC单片机改装了两块板,实现了双机之间的异步通信,并用PROTEUS模拟了出来,跟有兴趣的朋友共享.

一.原理图

功能介绍:

(1).U1单片机控制4X5的矩阵键盘和十个指示灯,名称按图所示.

(2).U2单片机控制18个继电器.

(3).按键”选择枪1”,”选择枪2”,”选择枪3”,”选择枪4”,”PREHEAT”,”CUTTING”,”HEIGHT”,”RETRACE”,”PLASMA”这9个按键是一键控制相对应的继电器的开关.就是说按一下为开,送开保持原先状态,再按一下为关,送开保持,即实现一个D触发器的电平翻转功能.

(4).按键”1 UP”,”1 DOWN”,”2 UP”,”2 DOWN”,”3 UP”,”3 DOWN”,”4 UP”,”4 DOWN”,”ALL UP”,”ALL DOWN”,”IGNITION”为点动按键,即按下为开,继电器吸合,送开为关,继电器放开.

(5).所用单片机为P16F873A

二.程序

为观察方便,特把图分为发送部分和接收部分,并分别编程.

1. 发送部分

原理图如下所示

/***********************************************************************

* 文件标题:CNC-USART-1 *

* 编制日期:2007.12.19 *

* 编制人: wujieflash*

* 程序用途:用于数控切割机上的面板通信(发送部分)*

* 配套图纸:CNC-02*

* 版本号: V1.0 *

***********************************************************************/

#include

//函数声明

void initial();

void delay();

void key_scan();

void key_serve();

void send_usart();

//定义变量

unsigned int i,j,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;

//子程序

//初始化子程序

void initial()

{

ADCON1=0x06;//设置为普通数字引脚

TRISC0=0;//键盘四根行线设置为输出

TRISC1=0;

TRISC2=0;

TRISC3=0;

TRISC4=1;//键盘五根列线设置为输入

TRISC5=1;

TRISA2=1;

TRISA3=1;

TRISA4=1;

TRISB=0;

PORTB=0;

TRISA0=0;

RA0=0;

TRISA1=0;

RA1=0;

RC0=0;//四根行线先送低电平

RC1=0;

RC2=0;

RC3=0;

//USART部件初始化

SPBRG=0x19;//设置波特率为9600bps

TXSTA=0x04;//选择异步高速8位数据传输模式

RCSTA=0x80;//允许串行端口工作

TRISC6=1;//设置为高阻态,防止干扰

TRISC7=1;

}

//延时子程序

void delay()

{

for(i=2000;i--;)

continue;

}

//键盘扫描子程序

void key_scan()

{

while(1)

{

if((RC4==0)||(RC5==0)||(RA2==0)||(RA3==0)||(RA4==0))//是否有键按下

{

break;

}

}

delay();

if((RC4==0)||(RC5==0)||(RA2==0)||(RA3==0)||(RA4==0))//确认有键按下

{

key_serve();

}

else

{

j=0x00;

send_usart();

}

}

//按键服务子程序

void key_serve()

{

RC1=1;//先置RC0为低电平,剩余三根行线为高电平

RC2=1;

RC3=1;

RC0=0;

if(RC4==0)//按键1 “select 1"

{

k1++;

k1=k1%2;

if(k1==1)//奇数次为开

{

j=0x01;

send_usart();

RB0=1;//指示灯亮

}

if(k1==0)//偶数次为关

{

j=0x15;

send_usart();

RB0=0;//指示灯灭

}

}

if(RC5==0)//按键2 "1 up"

{

j=0x02;

send_usart();

}

if(RA2==0)//按键3 "1 down"

{

j=0x03;

send_usart();

}

if(RA3==0)//按键4 "select 2"

{

k2++;

k2=k2%2;

if(k2==1)//奇数次为开

{

j=0x04;

send_usart();

RB1=1;

}

if(k2==0)//偶数次为关

{

j=0x16;

send_usart();

RB1=0;

}

}

if(RA4==0)//按键5 “2 up"

{

j=0x05;

send_usart();

}

RC0=1;//置RC1为低电平,剩余行线为高

RC2=1;

RC3=1;

RC1=0;

if(RC4==0)//按键6 "2 down"

{

j=0x06;

send_usart();

}

if(RC5==0)//按键7 "select 3"

{

k3++;

k3=k3%2;

if(k3==1)

{

j=0x07;

send_usart();

RB2=1;

}

if(k3==0)

{

j=0x17;

send_usart();

RB2=0;

}

}

if(RA2==0)//按键8 "3 up"

{

j=0x08;

send_usart();

}

if(RA3==0)//按键9 "3 down"

{

j=0x09;

send_usart();

}

if(RA4==0)//按键10 "select 4"

{

k4++;

k4=k4%2;

if(k4==1)

{

j=0x0a;

send_usart();

RB3=1;

}

if(k4==0)

{

j=0x18;

send_usart();

RB3=0;

}

}

RC0=1;//置RC2为低电平,剩余为高

RC1=1;

RC3=1;

RC2=0;

if(RC4==0)//按键11 "4 up"

{

j=0x0b;

send_usart();

}

if(RC5==0)//按键12 "4 down"

{

j=0x0c;

send_usart();

}

if(RA2==0)//按键13 "all up"

{

j=0x0d;

send_usart();

}

if(RA3==0)//按键14 "all down"

{

j=0x0e;

send_usart();

}

if(RA4==0)//按键15 "preheat"

{

k5++;

k5=k5%2;

if(k5==1)

{

j=0x0f;

send_usart();

RB4=1;

}

if(k5==0)

{

j=0x19;

send_usart();

RB4=0;

}

}

RC0=1;//置RC3为低,剩余为高

RC1=1;

RC2=1;

RC3=0;

if(RC4==0)//按键16 "cutting"

{

k6++;

k6=k6%2;

if(k6==1)

{

j=0x10;

send_usart();

RB5=1;

}

if(k6==0)

{

j=0x1a;

send_usart();

RB5=0;

}

}

if(RC5==0)//按键17 "height"

{

k7++;

k7=k7%2;

if(k7==1)

{

j=0x11;

send_usart();

RB6=1;

}

if(k7==0)

{

j=0x1b;

send_usart();

RB6=0;

}

}

if(RA2==0)//按键18 "ignition"

{

j=0x12;

send_usart();

RB7=1;

}

if(RA3==0)//按键19 "retrace"

{

k9++;

k9=k9%2;

if(k9==1)

{

j=0x13;

send_usart();

RA0=1;

}

if(k9==0)

{

j=0x1d;

send_usart();

RA0=0;

}

}

if(RA4==0)//按键20 "oxy/plasma"

{

k10++;

k10=k10%2;

if(k10==1)

{

j=0x14;

send_usart();

RA1=1;

}

if(k10==0)

{

j=0x1e;

send_usart();

RA1=0;

}

}

RC0=0;//置四根行线为低电平

RC1=0;

RC2=0;

RC3=0;

while(1)

{

if((RC4==1)&&(RC5==1)&&(RA2==1)&&(RA3==1)&&(RA4==1))//等键松开

break;

}

RB7=0;//关“IGNITION”指示灯

j=0x00;

send_usart();

}

//命令发送子程序

void send_usart()

{

TXEN=1;//发送允许

CREN=1;//接收允许

TXREG=j;

while(1)

{

if(TXIF==1)break;//等待发送完成

}

while(1)

{

if(RCIF==1)break;//等待接收完成

}

RCREG=RCREG;//读响应字节,清RCIF

}

//主程序

void main(void)

{

initial();

while(1)

{

key_scan();

}

}

2.接收部分

原理图如下所示

/***********************************************************************

* 文件标题:CNC-USART-2 *

* 编制日期:2007.12.19 *

* 编制人: 吴杰 *

* 程序用途:用于数控切割机上的面板通信(接收部分) *

* 配套图纸:CNC-01*

* 版本号: V1.0*

***********************************************************************/

#include

//函数声明

void initial();

void recevie_usart();

void rece_serve();

//定义变量

unsigned int rece;

//子程序

//初始化子程序

void initial()

{

ADCON1=0x06;//设置RA口为普通数字端口

TRISA=0;

PORTA=0;

TRISB=0;

PORTB=0;

TRISC=0;

PORTC=0;

//USART部件初始化

SPBRG=0x19;//设置波特率为9600bps

TXSTA=0x04;//选择异步高速8位数据传输模式

RCSTA=0x80;//允许串行端口工作

TRISC6=1;//设置为高阻态,防止干扰

TRISC7=1;

}

//接收子程序

void recevie_usart()

{

CREN=1;

TXEN=1;

while(1)

{

if(RCIF==1)break;//接收完毕

}

rece=RCREG;//读取接收到的数据,并清RCIF

TXREG=rece;//待发送的数据

while(1)

{

if(TXIF==1)break;//发送完毕

}

}

//接收服务子程序

void rece_serve()

{

switch(rece)

{

case 0x00:{

RC2=0;//继电器“1 up"关

RC3=0;//继电器"1 down"关

RC4=0;//继电器”2 up"关

RC5=0;//继电器“2 down"关

RA0=0;//继电器”3 up"关

RA1=0;//继电器“3 down"关

RA2=0;//继电器”4 up"关

RA3=0;//继电器“4 down"关

RB7=0;//继电器“ignition"关

break;

}

case 0x01:{

RB0=1;//继电器”1 select"开

break;

}

case 0x15:{

RB0=0;//继电器“1 select"关

break;

}

case 0x02:{

RC2=1;//继电器”1 up"开

break;

}

case 0x03:{

RC3=1;//继电器”1 down"开

break;

}

case 0x04:{

RB1=1;//继电器”2 select"开

break;

}

case 0x16:{

RB1=0;//继电器”2 select"关

break;

}

case 0x05:{

RC4=1;//继电器”2 up"开

break;

}

case 0x06:{

RC5=1;//继电器”2 down"开

break;

}

case 0x07:{

RB2=1;//继电器”3 select"开

break;

}

case 0x17:{

RB2=0;//继电器”3 select"关

break;

}

case 0x08:{

RA0=1;//继电器”3 up"开

break;

}

case 0x09:{

RA1=1;//继电器”3 down"关

break;

}

case 0x0a:{

RB3=1;//继电器”4 select"开

break;

}

case 0x18:{

RB3=0;//继电器”4 select"关

break;

}

case 0x0b:{

RA2=1;//继电器”4 up"开

break;

}

case 0x0c:{

RA3=1;//继电器”4 down"开

break;

}

case 0x0d:{

RC6=1;//继电器”all up"开

RC4=1;

RC2=1;

RA0=1;

break;

}

case 0x0e:{

RA1=1;//继电器”all down"开

RC3=1;

RC5=1;

RC7=1;

break;

}

case 0x0f:{

RB4=1;//继电器”preheat"开

break;

}

case 0x19:{

RB4=0;//继电器”preheat"关

break;

}

case 0x10:{

RB5=1;////继电器”cutting"开

break;

}

case 0x1a:{

RB5=0;//继电器”cutting"关

break;

}

case 0x11:{

RB6=1;////继电器”height"开

break;

}

case 0x1b:{

RB6=0;//继电器”height"关

break;

}

case 0x12:{

RB7=1;//继电器”ignition"开

break;

}

/*case 0x1c:{

RB7=0;//继电器”ignition"关

break;

}*/

case 0x13:{

RC0=1;//继电器”retrace"开

break;

}

case 0x1d:{

RC0=0;//继电器”retrace"关

break;

}

case 0x14:{

RC1=1;//继电器”plasma"开

break;

}

case 0x1e:{

RC1=0;//继电器”plasma"关

break;

}

}

}

//主程序

void main()

{

initial();

while(1)

{

recevie_usart();

rece_serve();

}

}

三,总结

虽然板子用用也没啥问题,但程序毕竟考虑的简单了一些,如:没有考虑故障处理的问题,我打算写进一段自动提示故障的程序,在两板之间通信线出现问题不通的时候,闪烁指示灯提示.还有什么欠考虑的地方请大家一起帮忙!

换一批

延伸阅读

[热点文章推荐(一)] pic单片机最强应用篇,采用pic单片机设计红外夜视仪

pic单片机最强应用篇,采用pic单片机设计红外夜视仪

pic单片机已是老生常谈的话题,对于pic单片机,大家也不再陌生。为增进大家对pic单片机的认识,本文将为大家带来pic单片机的实际应用篇。本文中,主要在于讲解如何利用pic单片机实现红外夜视仪设计。如果你对本文内容具有兴趣,不妨继续...

关键字: pic单片机 指数 红外夜视仪

[热点文章推荐(一)] 帮你搞定pic单片机难点,pic单片机硬件死锁问题探讨

帮你搞定pic单片机难点,pic单片机硬件死锁问题探讨

pic单片机如火如荼,因此学习pic单片机的朋友越来越多。但随着pic单片机的使用,大家可能会遇到各种各样的pic单片机相关问题。为帮助大家解决pic单片机应用难点,本文将对pic单片机硬件死锁问题予以讲解。如果你对pic单片机具有兴...

关键字: 死锁 pic单片机 指数

[热点文章推荐(一)] 深入理解pic单片机,pic单片机PAGE、BANK讲解

深入理解pic单片机,pic单片机PAGE、BANK讲解

pic单片机在现实中使用很多,诸多应用都是基于pic单片机设计完成。电子相关专业的朋友对于pic单片机自然十分熟悉,为增进大家对pic单片机的认识,本文将继续为大家介绍pic单片机。本文中,小编将对pic单片机的PAGE和BANK予以...

关键字: 单片机 pic单片机 指数

[热点文章推荐(一)] pic单片机实际应用,基于pic单片机实现IC卡读写器(下)

pic单片机实际应用,基于pic单片机实现IC卡读写器(下)

对于pic单片机,大家都很熟悉,pic单片机是诸多类型单片机中最为受用的一款。本文是《pic单片机实际应用,基于pic单片机实现IC卡读写器(上)》的余下内容。如果你对pic单片机具有兴趣,抑或对pic单片机的应用充满好奇,不妨继续往...

关键字: ic卡读写器 pic单片机 指数

[热点文章推荐(一)] pic单片机实际应用,基于pic单片机实现IC卡读写器(上)

pic单片机实际应用,基于pic单片机实现IC卡读写器(上)

采用pic单片机,我们可以实现诸多应用。往期中,小编对pic单片机的诸多基础知识以及pic单片机的一些应用均有所介绍。为帮助大家增进对pic单片机的认识,本文将介绍如何基于pic单片机实现IC卡读写器。本文仅为上篇,剩余内容请翻阅下篇...

关键字: ic卡读写器 pic单片机 指数

单片机

21428 篇文章

关注

发布文章

技术子站

关闭