找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3254|回复: 2
打印 上一主题 下一主题
收起左侧

求助!光立方的上位机通讯程序不受控制

[复制链接]
跳转到指定楼层
楼主
ID:66631 发表于 2014-11-6 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include<reg52.h>  
#define uchar unsigned char
#define uint unsigned int
uchar x,y,face,a,b;  
uchar i=0;  
uchar shuzu[8][8];  
/*uchar shuzu[8][8]={  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,  
0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,  
0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, };   
//显示固定图案,数组可任意改动 //           */
void delay(uint z)  
{     
  uint x,y;     
  for(x=z;x>0;x--)     
  for(y=10;y>0;y--);   
}
void init()
{  
TMOD=0x22;  
TH1=0XFf;  //波特率设置,波特率为57600  
TL1=0XFf;  
TH0=0x00;  
TL0=0x00;  
TR1=1;   
TR0=1;   
SCON=0X50;
     PCON|=0x80;   
         EA=1;   
         ES=1;   
         ET0=1;   
         PS=1;    //让串口中断优先,设置优先级高些
}   
void main()
   {   
     b=0;  
         init();  
         while(1)  
           {         
            }
   }   
   void rxd()
   interrupt 4   
     {            
         uchar temp=0;      
         RI=0;   
         ++b;      
         if(b>=8)   //上位机中发数据的时候,前面一个不变的地址码,               
         //要去掉,故到2的时候才存数据   
           {      
           temp=SBUF;     
           shuzu[x][y]=temp;//把数据存到数组中     
           x++;    if(x>=8)  //一列一列存      
           {     
           x=0;        
           y++;     
           if(y>=8)     
           y=0;   
           }  
            }   
                if(b>=65)    //到65,64个数据接收完毕   
                b=0;
                 }   
                 void timer0_isr(void)
                 interrupt 1   //把数组取出来,送给锁存器、三极管基极
                 {   

        for (i=0;i<7;i++)  
         {   
         P2|=(0x01<<i);     //573使能端   
          P0=~(shuzu[face][i]);//573数据输入端   
          P2&=~(0x01<<i);    //delay(20);   }      
          P3=0X03;   // P3=~(0x01<<face);  //面选择端(八个面分别的公共端) //不要加(taf)   
          if(face<7)   
          face++;   
          else   
          face=0;        
          }
          }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:51088 发表于 2014-11-7 10:44 来自触屏版 | 只看该作者
楼主给的信息太少了,你发的这个是下位机程序吧!会不会是晶体振荡器用错了
回复

使用道具 举报

板凳
ID:66631 发表于 2014-11-7 20:23 | 只看该作者
#include<reg52.h>  #define uchar unsigned char #define uint unsigned int uchar xx,yy,zz,layer,icnt,rxcnt; uchar display[8][8]; void init() {         TMOD=0x22;//定时器1 方式2 用于产生波特率;定时器0 方式2 用于刷新显示         TH1=0XFD;  //PROTEUS中晶振设置33.1776MHz(3倍于11.0592MHz)在波特率加倍的情况下初值0xFD对应波特率为57600         TL1=0XFD;         TH0=0xff;         TL0=0xff;         TR1=1;                //开定时器1         TR0=1;          SCON=0X50;//串口工作于方式1 可接收REN=1         PCON|=0x80;//波特率加倍           EA=1;                //开全局中断         ES=1;                //开串口中断         ET0=1;                //开定时器0中断         PS=1;                //配置串口中断优先 }  void main() {         rxcnt=0;         init();         while(1); } void rxd() interrupt 4                  //串口中断服务程序 {                                                                                   uchar temp=0;                                         RI=0;                 ++rxcnt;                 if(rxcnt>=2)                 {                                                 temp=SBUF;                        //读出接收到的数据                         display[xx][yy]=temp;         //按顺序存入显示数组中                         xx++;                         if(xx>=8)                                                         {                                 xx=0;                                 yy++;                                 if(yy>=8)                                 yy=0;                         }                 }                 if(rxcnt>=65)                 rxcnt=0;         } /*********************************************** 刷新显示的工作全部放到定时器0中断函数中来了 P0口是每个573芯片的输入端 P1口之前是ULN2803的输入端,经过修改删除了ULN2803 修改后P1直接作为八个面分别的公共端。 P2口是8个573芯片的锁存控制引脚。 *********************************************/ void timer0_isr(void) interrupt 1 {                 uchar i=0;                 for (i=0;i<7;i++)                 {                         P2|=(0x01<<i);                //锁存端                         P0=display[layer][i];//573输入端                         P2&=~(0x01<<i);                 }                                 P1=~(0x01<<layer);                //面选择端(八个面分别的公共端)                 if(layer<7)                         layer++;                 else                         layer=0; }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表