|
單片機(jī)P2口接8只LED燈,P3.2~P3.3引腳連接有K1和K2共2個(gè)按鍵,使用單片機(jī)串行口與PC機(jī)通信。 1)由PC機(jī)控制單片機(jī)的P2口,將PC機(jī)送出的數(shù)以二進(jìn)制形式顯示在LED燈上; 2)按下按鍵K1向PC機(jī)發(fā)送數(shù)字0x55,按下K2向PC機(jī)發(fā)送數(shù)字0xAA。 源程序如下:
#define uchar unsigned char #include "string.h" #include "reg51.h" unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x08,0x03,0x46,0x21,0x06,0x0e}; //十六進(jìn)制-7段譯碼表 void mDelay(unsigned int DelayTime) //延時(shí)函數(shù) { unsigned char j=0; for(;DelayTime>0;DelayTime--) //延時(shí)循環(huán) { for(j=0;j<125;j++) {;}}} void SendData(uchar Dat) //發(fā)送函數(shù) { uchar i=0; SBUF=Dat; //發(fā)送Dat while(1){ if(TI) //如果發(fā)送中斷標(biāo)志為1,則等待, { TI=0; break; } //否則清除發(fā)送中斷標(biāo)志 }} uchar Key() //按鍵處理函數(shù) { uchar KValue; //聲明鍵值函數(shù) P3|=0x3e; //中間4位置高電平 0011 1101 if((KValue=P3|0xe3)!=0xff) //如果按鍵按下 { mDelay(10); //延遲時(shí)間函數(shù) if((KValue=P3|0xe3)!=0xff) //如果按鍵還在按下?tīng)顟B(tài) { for(;;) //等待 if((P3|0xe3)==0xff) //如果按鍵抬起, return(KValue); //返回鍵值 }} return(0); //如果按鍵沒(méi)有按下,返回0 } void main() //主函數(shù) { uchar KeyValue; //定義鍵值變量KeyValue unsigned char ns,ng,temp; //定義變量ns,ng,temp P2=0xff; //熄滅P2口連接的所有發(fā)光管 TMOD=0x20; //確定定時(shí)器工作模式,模式2,常數(shù)自動(dòng)裝入 TH1=0xFD; TL0=0xFD; //定時(shí)器1的初值 波特率為9600,晶體為11.0592MHz //PCON&=0x80; 若是SMOD=1 可以使波特率加倍 TR1=1; //啟動(dòng)定時(shí)器1 SCON=0x40; //串口工作方式1 運(yùn)行在8位模式 REN=1; //允許接收 for(;;) //無(wú)限循環(huán) {if(KeyValue=Key()) //調(diào)用按鍵函數(shù),獲取按鍵信息 { if((KeyValue|0xfb)!=0xff) //如果按鍵k1按下 SendData(0x55); //調(diào)用發(fā)送函數(shù),送出0x55 if((KeyValue|0xf7)!=0xff) //如果k2按下 SendData(0xaa); //調(diào)用發(fā)送函數(shù),送出0xaa } if(RI) //如果接收中斷發(fā)生 { P2=SBUF; //將接收數(shù)據(jù)寫(xiě)到端口P2 RI=0; } //清除接收標(biāo)志位 temp=P2; //暫存接收到的數(shù)據(jù) ng=temp & 0x0f; //取接收數(shù)據(jù)低4位 ns=temp>>4; //將高4位右移4位 ns &=0x0f; //取接收數(shù)據(jù)高4位 P0=table[ng]; //P0口連接的數(shù)碼管顯示低4位 P1=table[ns]; //P1口連接的數(shù)碼管顯示高4位 }} |