|
上電發送工作正常指令給主CPU
接收8位數據
后八位為控制位,大于100的RSET 小于100的SET
輸出范圍 Q 00---07
10---17
20---27
30---37
*
70---77
接收到數據后反饋給主CPU,檢查正確性
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (9.25 KB, 下載次數: 93)
下載附件
2018-11-21 17:38 上傳
0.png (18.3 KB, 下載次數: 115)
下載附件
2018-11-21 17:37 上傳
單片機源程序如下:
- /****************************************************
- 單片機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提供下載:
|
|