原理: 1.兩個AT89c51單片機各自P0口接一個數碼管,P1.0接一個按鈕,單片機的TXD和RXD與對方單片機的RXD和TXD連接。 2.編程實現單片機的數碼管顯示另一個單片機的按鈕按動次數。 步驟: 1.利用Proteus仿真軟件按設計題目要求繪制電路。 2.按題目要求編寫程序。 3.將程序下載到單片機中,進行調試運行。
#include<reg51.h> #define ucharunsigned char #define uintunsigned int #define SegPort P0 sbit bit0=P2^0; sbit bit1=P2^1; uchar codetab[16]= {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //0~9共陰極字型碼 uchar datadisplaybuf[2];//定義顯示緩沖區 bit Commflag;//定義通信標志 ucharReceiveData;//接收的數據 uchar counter;//按鍵的按動次數計數 ucharOldKey,NewKey; //通信中斷函數 void Txd_Rxd()interrupt 4 { if(TI)TI=0; else { RI=0; ReceiveData=SBUF; Commflag=1; } } voidDataChange(uchar m) { displaybuf[1]=m/10; displaybuf[0]=m%10; } void delay() { int i; for(i=500;i>0;i--); } void display() { SegPort=0xff; SegPort=~tab[displaybuf[0]]; bit0=0;bit1=1; delay(); SegPort=0xff; SegPort=~tab[displaybuf[1]]; bit0=1;bit1=0; delay(); SegPort=0xff; } void Key() { NewKey=P1&0x01; if((OldKey==0x01)&&(NewKey==0x00)) { counter++; SBUF=counter; } OldKey=NewKey; } void main() { SCON=0x50; TMOD=0x20; TH1=0xFD; TL1=0xFD; TR1=1; ES=1; EA=1; while(1) { Key(); if(Commflag) { Commflag=0; DataChange(ReceiveData); } display(); } }
1.左數碼管顯示且紀錄右按鍵按動次數 2.右數碼管顯示且紀錄左按鍵按動次數
|