首页 > 应用 > 单片机应用
[导读]公司的数控面板和控制板的连线是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单片机,再话pic单片机选型问题

大佬谈pic单片机,再话pic单片机选型问题

pic单片机是常用器件之一,每位学习pic单片机的朋友在学习过程中总会遇见各种难题,如pic单片机选型问题。对于pic单片机选型,小编曾带来过简单介绍。而在本文中,将对pic单片机选型进行详细阐述,以帮助大家扫清选型难点。......

关键字:pic单片机 单片机 选型

[单片机应用] pic单片机也可以很简单,搞定pic单片机IO口操作

pic单片机也可以很简单,搞定pic单片机IO口操作

对于pic单片机的学习,很多朋友总是能充满激情,不断利用闲余时间研究pic单片机的各类技术。而谈及pic单片机,必须牵扯至51、AVR单片机。因此本文中,将探讨pic单片机以及51、AVR单片机对于IO口的操作。对于本文,希望大家认真研读,......

关键字:pic单片机 51单片机 AVR单片机

[单片机应用] 搞定pic单片机奇葩事,pic单片机分类大讲解

搞定pic单片机奇葩事,pic单片机分类大讲解

对于pic单片机,大家或多或少均有所耳闻。但是,大家对pic单片机有多少了解呢?是否熟知不同类型的pic单片机呢?本文中,将探讨pic单片机的类型分类以及特征。此外,本文的探讨基于pic 8位单片机而进行。......

关键字:pic单片机 分类 单片机

[单片机应用] 大佬探讨pic单片机,pic单片机更实用

大佬探讨pic单片机,pic单片机更实用

pic单片机是当前最实用工具之一,而对于pic单片机的探讨往往与其他类型单片机相联系。本文中,将讨论pic单片机和51单片机谁更易于学习,以此帮助大家增进对pic单片机的理解。......

关键字:pic单片机 51单片机 单片机

[单片机应用] pic单片机超神篇,pic单片机RAM用作寄存器

pic单片机超神篇,pic单片机RAM用作寄存器

pic单片机,想必大家都比较熟悉。其中,pic单片机简介、pic单片机优势以及pic单片机不足等内容,皆是入门级知识。本文将向大家介绍pic单片机的高级应用——将pic单片机的数据存储器RAM用作寄存器,本文存在一定难度,望大家用心研读。......

关键字:pic单片机 RAM 寄存器

[单片机应用] pic单片机入门篇,3大方面了解pic单片机

pic单片机入门篇,3大方面了解pic单片机

据调查,pic单片机是相关人员使用的最多硬件之一。因此,凡入门者需对pic单片机保持一定的了解。为此,本文为大家带来三部分内容:1.pic单片机简介,2.pic单片机特点,3.pic单片机不足之处。通过本文,希望大家对pic单片机存在一个简......

关键字:pic单片机 特点 不足

[单片机应用] pic单片机选型 + pic单片机INT0中断原理

pic单片机选型 + pic单片机INT0中断原理

pic单片机在实际应用中使用广泛,对pic单片机各类型特点了熟于心十分必要。只有对每款pic单片机的特点有所把握的情形下,才能在依据项目需求而选择最合适的pic单片机。本文中,将为大家介绍两部分内容:一、pic单片机选型参考,二、pic单片......

关键字:pic单片机 选型 中断原理

[单片机应用] pic单片机学习困难go away,pic单片机入门so easy

pic单片机学习困难go away,pic单片机入门so easy

很多朋友抱怨pic单片机难学,殊不知是没掌握好学习pic单片机的正确方法。在小编看来,pic单片机并不难学,pic单片机的入门也是比较简单的。不信?那不妨来看看小编带来的这篇关于pic单片机的入门文章。......

关键字:pic单片机 单片机 引脚

[单片机应用] 如影随从的pic单片机,聊聊pic单片机开发经验、技巧

如影随从的pic单片机,聊聊pic单片机开发经验、技巧

Pic单片机是耳熟能详的一款单片机,实际运用中,pic单片机的身影也是从不缺少。作为一个长期从事pic单片机开发的小编而言,pic单片机更是如影随从。本文是小编总结的有关pic单片机开发的一些经验、技巧,不妨和大家一起分享下。......

关键字:pic单片机 功耗 单片机

[单片机应用] pic单片机入门篇,pic单片机的那些风风雨雨

pic单片机入门篇,pic单片机的那些风风雨雨

Pic单片机的学习是存在一定难度的,一是因为必须具备一定的pic单片机基础知识,二是需对pic单片机的所有引脚等有一定的了解。这篇文章是小编在学习pic单片机写的一篇比较适合pic单片机初入门朋友阅读的文章,一起了解下吧。......

关键字:pic单片机 PIC 单片机

[单片机应用] pic单片机百事通,专业人士带你看pic单片机8大优势

pic单片机百事通,专业人士带你看pic单片机8大优势

pic单片机应用很多,生活中到处都有pic单片机的身影。小编个人也是从事pic单片机开发的人员之一,对于pic单片机有一定的理解。今天,小编将带领大家一起看一下pic单片所具备的8大优势。......

关键字:pic单片机 优势 保密性

[单片机应用] pic单片机的秘密——秒懂pic单片机与51单片机的区别

pic单片机的秘密——秒懂pic单片机与51单片机的区别

pic单片机是使用频率较高的器件之一,很多朋友经常对比pic单片机与51单片机,试图分析出pic单片机与51单片机的区别。本文中,按照对比结果,主要列出了pic单片机、51单片机二者间的3点主要区别。......

关键字:pic单片机 51单片机 区别

我 要 评 论

网友评论

技术子站

更多

项目外包

更多

推荐博客