| 
 
| 本帖最后由 haochangxu 于 2013-9-20 09:52 编辑 
 #include <REG52.H>
 #include <intrins.h>
 #define  NOP() _nop_()  /* 定义空指令 */
 sbit LS138A = P2^2;          //定义138译码器的输入A脚由P2.2控制
 sbit LS138B = P2^3;            //定义138译码器的输入脚B由P2.3控制
 sbit LS138C = P2^4;         //定义138译码器的输入脚C由P2.4控制
 
 void delay(unsigned int i);      //函数声名
 
 //此表为 LED 的字模, 共阴数码管 0-9  -
 unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
 bit Flag;
 unsigned int ReData,SenData;
 unsigned int LedOut[10];
 unsigned int buf[1];
 unsigned int a=0,b,c,count=0;
 
 
 
 void main (void)
 {
 unsigned int i;
 SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1
 TMOD = 0x20;      //定时器工作方式2
 PCON = 0x80;
 TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
 TL1 = 0xF3;
 TR1  = 1;
 ES   = 1;        //开串口中断
 EA   = 1;        // 开总中断
 
 while(1)
 {
 if(Flag==1)
 {
 SBUF=(ReData=(buf[0])+(buf[1]));                 //发送,我是想发送到串口助手上显示。但是不对
 while(TI==0);
 TI=0;
 Flag=0;
 }
 
 LedOut[0]=Disp_Tab[ReData%10000/1000];
 LedOut[1]=Disp_Tab[ReData%1000/100];
 LedOut[2]=Disp_Tab[ReData%100/10];
 LedOut[3]=Disp_Tab[ReData%10];
 
 for( i=0; i<4; i++)  //实现8位动态扫描循环 一直扫描
 {
 P0 = LedOut;  //将字模送到P0口显示
 switch(i)          //使用switch 语句控制位选  也可以是用查表的方式 学员可以试着自己修改
 {
 case 0:LS138A=0; LS138B=0; LS138C=0;  break;
 case 1:LS138A=1; LS138B=0; LS138C=0;  break;
 case 2:LS138A=0; LS138B=1; LS138C=0;  break;
 case 3:LS138A=1; LS138B=1; LS138C=0;  break;
 
 default :break;
 }
 delay(100);
 }
 
 
 }
 }
 
 
 
 
 /****************************************************
 串口中断程序
 //******************************************************/
 void ser_int (void) interrupt 4 using 1
 {
 
 if(        RI==1)
 
 buf[count]=SBUF-0x30;  //SUBF接受
 RI=0;
 count++;
 
 if(count>1)
 {
 ReData=(buf[0])*10+(buf[1]);
 count=0;
 Flag=1;
 
 }
 
 }
 void delay(unsigned int i)
 {
 char j;
 for(i; i > 0; i--)
 for(j = 200; j > 0; j--);
 }
 
 
 
 
 
 | 
 |