|
上电发送工作正常指令给主CPU
接收8位数据
后八位为控制位,大于100的RSET 小于100的SET
输出范围 Q 00---07
10---17
20---27
30---37
*
70---77
接收到数据后反馈给主CPU,检查正确性
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /****************************************************
- 单片机89C55,12M晶振,通过单片机和MAX7219控制64个继电器输出;
- 采用通信方式接收信息,接收方式为八位数据;接收采用串口接收数据;
- 00--07分别对应Q0.0--Q0.7八个继
- 电器动作;10--17为Q1.0--Q1.7八个继电器动作*****Q7.0--Q7.7总64
- 个继电器;
- 想复位继电器,对应的前面加100即可,如100,为Q0.0继电器复位;
- 172为Q7.2继电器复位;
- ****************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //定义Max7219端口
- sbit Max7219_pinCLK = P2^2;
- sbit Max7219_pinCS = P2^1;
- sbit Max7219_pinDIN = P2^0;
- uchar ReData;
- uchar code DP[]={0,128,1,2,4,8,16,32,64,255};//显示从全灭到一个灯泡
- uchar NUM0,NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7;
- uchar code SET[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uchar code RSET[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- //--------------------------------------------
- //功能:向MAX7219(U3)写入字节
- //入口参数:DATA
- //出口参数:无
- //说明:
- void Write_Max7219_byte(uchar DATA)
- {
- uchar i;
- Max7219_pinCS=0;
- for(i=8;i>=1;i--)
- {
- Max7219_pinCLK=0;
- Max7219_pinDIN=DATA&0x80;
- DATA=DATA<<1;
- Max7219_pinCLK=1;
- }
- }
- //-------------------------------------------
- //功能:向MAX7219写入数据
- //入口参数:address、dat
- //出口参数:无
- //说明:
- void Write_Max7219(uchar address,uchar dat)
- {
- Max7219_pinCS=0;
- Write_Max7219_byte(address); //写入地址,即数码管编号
- Write_Max7219_byte(dat); //写入数据,即数码管显示数字
- Max7219_pinCS=1;
- }
- void Init_MAX7219(void)
- {
- Write_Max7219(0x09, 0x00); //译码方式:BCD码
- Write_Max7219(0x0a, 0x03); //亮度
- Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示
- Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
- Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
- }
- void SHUCHU(unsigned char shu)//数码代表输出点Q0.0---Q0.8...Q8.0---Q8.8 数00--77 大于100是复位
- {
- unsigned char i,j;
- i=shu%100/10;
- j=shu%10;
- switch(i)
- {
- case 0:{NUM0=NUM0|SET[j];Write_Max7219(1,NUM0);break;};
- case 1:{NUM1=NUM1|SET[j];Write_Max7219(2,NUM1);break;};
- case 2:{NUM2=NUM2|SET[j];Write_Max7219(3,NUM2);break;};
- case 3:{NUM3=NUM3|SET[j];Write_Max7219(4,NUM3);break;};
- case 4:{NUM4=NUM4|SET[j];Write_Max7219(5,NUM4);break;};
- case 5:{NUM5=NUM5|SET[j];Write_Max7219(6,NUM5);break;};
- case 6:{NUM6=NUM6|SET[j];Write_Max7219(7,NUM6);break;};
- case 7:{NUM7=NUM7|SET[j];Write_Max7219(8,NUM7);break;};
-
- }
- }
- void RSHUCHU(unsigned char shu)//数码代表输出点Q0.0---Q0.8...Q8.0---Q8.8 数00--77 大于100是复位
- {
- unsigned char i,j;
- i=shu%100/10;
- j=shu%10;
- switch(i)
- {
- case 0:{NUM0=NUM0&RSET[j];Write_Max7219(1,NUM0);break;};
- case 1:{NUM1=NUM1&RSET[j];Write_Max7219(2,NUM1);break;};
- case 2:{NUM2=NUM2&RSET[j];Write_Max7219(3,NUM2);break;};
- case 3:{NUM3=NUM3&RSET[j];Write_Max7219(4,NUM3);break;};
- case 4:{NUM4=NUM4&RSET[j];Write_Max7219(5,NUM4);break;};
- case 5:{NUM5=NUM5&RSET[j];Write_Max7219(6,NUM5);break;};
- case 6:{NUM6=NUM6&RSET[j];Write_Max7219(7,NUM6);break;};
- case 7:{NUM7=NUM7&RSET[j];Write_Max7219(8,NUM7);break;};
-
- }
- }
- void main(void)
- {
- unsigned char num;
- SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
- TMOD|= 0x20; //定时器工作方式2
- PCON|= 0x80;
-
- TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无
-
- TR1 = 1;
- ES = 1; //开串口中断
- EA = 1; // 开总中断
-
- Init_MAX7219();
- while(1)
- {
- num=ReData;
- if(num>=100)
- {RSHUCHU(num%100);}
- else
- SHUCHU(num%100);//x7,x0,x1,x2,x3,x4,x5,x6 1---8灯泡亮
-
- }
- }
- /****************************************************
- 串口中断程序
- ******************************************************/
- void ser_int (void) interrupt 4 using 1
- {
- if(RI == 1) //RI接受中断标志
- {
- RI = 0; //清除RI接受中断标志
- ReData = SBUF; //SUBF接受/发送缓冲器
- }
- }
复制代码
所有资料51hei提供下载:
|
|