找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口接收通过MAX7219驱动64个继电器仿真+代码

[复制链接]
跳转到指定楼层
楼主
ID:421173 发表于 2018-11-21 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上电发送工作正常指令给主CPU
接收8位数据
后八位为控制位,大于100的RSET   小于100的SET  
输出范围  Q   00---07
              10---17
              20---27
              30---37
                 *
              70---77

接收到数据后反馈给主CPU,检查正确性

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /****************************************************
  2. 单片机89C55,12M晶振,通过单片机和MAX7219控制64个继电器输出;
  3. 采用通信方式接收信息,接收方式为八位数据;接收采用串口接收数据;
  4. 00--07分别对应Q0.0--Q0.7八个继
  5. 电器动作;10--17为Q1.0--Q1.7八个继电器动作*****Q7.0--Q7.7总64
  6. 个继电器;
  7. 想复位继电器,对应的前面加100即可,如100,为Q0.0继电器复位;
  8. 172为Q7.2继电器复位;
  9. ****************************************************/
  10. #include <reg52.h>
  11. #include <intrins.h>
  12. #define uchar unsigned char
  13. #define uint  unsigned int
  14. //定义Max7219端口
  15. sbit Max7219_pinCLK = P2^2;
  16. sbit Max7219_pinCS  = P2^1;
  17. sbit Max7219_pinDIN = P2^0;

  18. uchar ReData;

  19. uchar code DP[]={0,128,1,2,4,8,16,32,64,255};//显示从全灭到一个灯泡
  20. uchar NUM0,NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7;
  21. uchar code SET[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  22. uchar code RSET[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  23. void Delay_xms(uint x)
  24. {
  25. uint i,j;
  26. for(i=0;i<x;i++)
  27.   for(j=0;j<112;j++);
  28. }
  29. //--------------------------------------------
  30. //功能:向MAX7219(U3)写入字节
  31. //入口参数:DATA
  32. //出口参数:无
  33. //说明:
  34. void Write_Max7219_byte(uchar DATA)         
  35. {
  36.             uchar i;   
  37.                 Max7219_pinCS=0;               
  38.             for(i=8;i>=1;i--)
  39.           {                  
  40.             Max7219_pinCLK=0;
  41.             Max7219_pinDIN=DATA&0x80;
  42.             DATA=DATA<<1;
  43.             Max7219_pinCLK=1;
  44.            }                                 
  45. }
  46. //-------------------------------------------
  47. //功能:向MAX7219写入数据
  48. //入口参数:address、dat
  49. //出口参数:无
  50. //说明:
  51. void Write_Max7219(uchar address,uchar dat)
  52. {
  53.      Max7219_pinCS=0;
  54.          Write_Max7219_byte(address);           //写入地址,即数码管编号
  55.      Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
  56.          Max7219_pinCS=1;                        
  57. }

  58. void Init_MAX7219(void)
  59. {
  60. Write_Max7219(0x09, 0x00);       //译码方式:BCD码
  61. Write_Max7219(0x0a, 0x03);       //亮度
  62. Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示
  63. Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
  64. Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
  65. }



  66. void SHUCHU(unsigned char shu)//数码代表输出点Q0.0---Q0.8...Q8.0---Q8.8  数00--77  大于100是复位
  67. {
  68. unsigned char i,j;
  69. i=shu%100/10;
  70. j=shu%10;
  71. switch(i)
  72.         {
  73.         case 0:{NUM0=NUM0|SET[j];Write_Max7219(1,NUM0);break;};
  74.     case 1:{NUM1=NUM1|SET[j];Write_Max7219(2,NUM1);break;};
  75.     case 2:{NUM2=NUM2|SET[j];Write_Max7219(3,NUM2);break;};
  76.     case 3:{NUM3=NUM3|SET[j];Write_Max7219(4,NUM3);break;};
  77.     case 4:{NUM4=NUM4|SET[j];Write_Max7219(5,NUM4);break;};
  78.     case 5:{NUM5=NUM5|SET[j];Write_Max7219(6,NUM5);break;};
  79.     case 6:{NUM6=NUM6|SET[j];Write_Max7219(7,NUM6);break;};
  80.     case 7:{NUM7=NUM7|SET[j];Write_Max7219(8,NUM7);break;};
  81.   
  82.         }       

  83. }

  84. void RSHUCHU(unsigned char shu)//数码代表输出点Q0.0---Q0.8...Q8.0---Q8.8  数00--77  大于100是复位
  85. {
  86. unsigned char i,j;
  87. i=shu%100/10;
  88. j=shu%10;
  89. switch(i)
  90.         {
  91.         case 0:{NUM0=NUM0&RSET[j];Write_Max7219(1,NUM0);break;};
  92.     case 1:{NUM1=NUM1&RSET[j];Write_Max7219(2,NUM1);break;};
  93.     case 2:{NUM2=NUM2&RSET[j];Write_Max7219(3,NUM2);break;};
  94.     case 3:{NUM3=NUM3&RSET[j];Write_Max7219(4,NUM3);break;};
  95.     case 4:{NUM4=NUM4&RSET[j];Write_Max7219(5,NUM4);break;};
  96.     case 5:{NUM5=NUM5&RSET[j];Write_Max7219(6,NUM5);break;};
  97.     case 6:{NUM6=NUM6&RSET[j];Write_Max7219(7,NUM6);break;};
  98.     case 7:{NUM7=NUM7&RSET[j];Write_Max7219(8,NUM7);break;};
  99.    
  100.         }       

  101. }

  102. void main(void)
  103. {
  104. unsigned char num;
  105.         SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                             
  106.             TMOD|= 0x20;      //定时器工作方式2                    
  107.                 PCON|= 0x80;                                                         
  108.                
  109.                 TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无         
  110.                
  111.                 TR1  = 1;                                                            
  112.                 ES   = 1;        //开串口中断                  
  113.                 EA   = 1;        // 开总中断

  114. Init_MAX7219();

  115. while(1)
  116. {
  117. num=ReData;
  118. if(num>=100)
  119. {RSHUCHU(num%100);}
  120. else
  121. SHUCHU(num%100);//x7,x0,x1,x2,x3,x4,x5,x6  1---8灯泡亮
  122.        
  123. }  
  124. }


  125. /****************************************************
  126.                串口中断程序
  127. ******************************************************/
  128. void ser_int (void) interrupt 4 using 1
  129. {

  130. if(RI == 1)        //RI接受中断标志
  131. {
  132.         RI = 0;                    //清除RI接受中断标志
  133.         ReData = SBUF;  //SUBF接受/发送缓冲器
  134. }

  135. }
复制代码

所有资料51hei提供下载:

此商品已被删除

MAX7219点阵驱动64个继电器OK.rar

9.4 MB, 下载次数: , 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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