4062|0

1379

帖子

0

TA的资源

裸片初长成(中级)

楼主
 

通用同步/异步通信的应用(2) [复制链接]

 单片机双机同步通信

1  单片机PIC1编程(主控发送)

#include  <pic.h>

/*该程序实现单片机双机同步通信功能,是主控发送部分。程序上电后显示

*相应的字符,表示系统正常工作。发送完毕后显示发送的数据*/

unsigned         char        tran[8]        /*定义一个数组存储发送数据*/

unsigned         char        kdata       /*定义通用寄存器*/

const            char        table[20]={0xc00xf90xa40xb00x990x920x820XD80x800x900x880x830xc60xa10x860x8e0x7f0xbf0x890xff}

/*不带小数点的的显示段码表*/

/*spi显示初始化子程序*/

void        SPIINIT()

{

;详细程序语句请参考本章8.5

}

/*给发送数组赋初值子程序 */

void        fuzhi()

{

       for(k=0k<8k++){

              tran[k]=k

       }                                 /*发送07八个数据*/

}

/*SCI部件初始化子程序*/

void        sciint()

{

       SPBRG=200             /*将传输的波特率设为约9600/*/

       TXSTA=0X90           /*选择主控方式*/

       RCSTA=0X80           /*允许同步串行口工作*/

       TRISC6=1

       TRISC7=1                /*RC6RC7设置为输入方式,对外部呈高阻状态*/

}    

/*SPI传送数据子程序*/

void       SPILED(data)

{

       ;详细程序语句请参考本章8.5

}

/*显示子程序,显示8位数*/

void        display()

{

       RA5=0                   /*准备锁存*/

       for(k=0k<8k++){

              data=tran[k]

              data=table[data]  /*查得显示的段码*/

              SPILED(data)     /*发送显示段码*/

       }

       RA5=1                      /*最后给一个锁存信号,代表显示任务完成*/       

}

/*显示子程序,显示8位数*/

void        display1()

{

       RA5=0                      /*准备锁存*/

       for(k=0k<8k++){

              data=0xf9          /*显示"1"表示系统正常工作*/

              SPILED(data)     /*发送显示段码*/

       }

       RA5=1                      /*最后给一个锁存信号,代表显示任务完成*/       

}

/*主程序*/

main()

{

       SPIINIT()                        /*spi显示初始化*/

       fuzhi()                             /*给发送数组赋发送初值*/

       sciint()                             /*SCI部件初始化*/

       di()                                  /*中断禁止*/

       TXEN=1                          /*发送允许*/

       display1()                         /*显示相应的字符,表示系统正常*/

while(1){

for(k=0k<8k++){  

                     TXREG=tran[k]/*发出一个字符*/

while(1){

                            if(TXIF==1)   break

       }                          /*等待上一个数据写入完成*/

          }

              display()                   /*显示发送的数据*/

   }                                                 /*循环发送*/

}

 

2        单片机PIC2编程(从动接收)

#include         <pic.h>

/*该程序实现单片机双机 同步通信功能,是从动接收部分,并把接收的数据显

*示在8LED*/

unsigned         char        rece[8]                /*定义一个数组存储接收数据*/

unsigned         char        kdata     /*定义通用寄存器*/

unsigned         int           i

const  char    table[20]={0xc00xf90xa40xb00x990x920x820XD80x800x900x880x830xc60xa10x860x8e0x7f0xbf0x890xff}

/*不带小数点的显示段码表*/

/*spi显示初始化子程序*/

void        SPIINIT()

{

       ;详细程序语句请参考本章8.5

}

/*SCI部件初始化子程序*/

void        sciint()

{

       TXSTA=0X10                                /*选择同步从动方式*/

       RCSTA=0X90                         /*串行口工作使能*/

       TRISC6=1

       TRISC7=1                              /*RC6RC7设置为输入方式对外部呈高阻状态*/

}

/*SPI传送数据子程序*/

void       SPILED(data)

{

       /*详细程序语句请参考本章8.5*/

}

/*显示子程序,显示4位数*/

void        display()

{

       RA5=0                             /*准备锁存*/

       for(k=0k<8k++){

              data=rece[k]

              data=table[data]         /*查得显示的段码*/

              SPILED(data)            /*发送显示段码*/

       }

       RA5=1                             /*最后给一个锁存信号,代表显示任务完成*/       

}

/*主程序*/

main()

{

       SPIINIT()                        /*spi显示初始化*/

       sciint()                             /*SCI部件初始化*/

       di()                                  /*中断禁止*/

       CREN=1                          /*接收允许*/

for(k=0k<8k++) rece[k]=0x03

       display()                          /*显示表示系统正常运行的数据*/

while(1)  {

              while(1){

                     CREN=1            /*允许连续接收*/

                     while(1){

                            if(RCIF==1)   break

}                          /*等待接收数据*/

                     k=0

                     rece[k]=RCREG /*读取接收数据*/

                     if(OERR==1) {      /*如果有溢出错误,则处理*/

       CREN=0

                            CREN=1

}

if(rece[k]==0x00) break/*0为同步字符,只有接收到“0时才进行下面的接收*/

}

for(k=1k<8k++){

while(1){

                            if(RCIF==1)   break

}                          /*等待接收数据*/

                     rece[k]=RCREG/*读取接收数据*/

                     if(OERR==1)  {     /*如果有溢出错误,则处理*/

       CREN=0

       CREN=1

}

                     rece[k]=rece[k]&0x0F/*屏蔽掉高位,防止干扰*/

}

              CREN=0

              display()                          /*显示接收的数据*/

              for(i=65535--i )continue

              for(i=65535--i )continue/*给予一定时间的延时,再进行下一轮接收*/

}

此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 3

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表