原理: 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.右数码管显示且纪录左按键按动次数
|