⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lesson10.lst

📁 基于8051的生产线记件系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
 712   2                      TL1 = 0xB0   ;//100ms=0.1s
 713   2                      g_ui_timer1_interval_cnt = 0;//重新开始计数
 714   2                      g_uc_data_send[0] = g_st_current_time.min;
 715   2                      g_uc_data_send[1] = g_st_current_time.sec;
 716   2                      g_uc_data_send[2] = g_uc_log_number;
 717   2                      uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
 718   2                      uc_device_sub_addr = 0x00 + ((g_uc_time_interval + 1) << 3);//EEPROM 首地址
 719   2                      ISendStr(uc_device_addr,uc_device_sub_addr,g_uc_data_send,3);//以页方式存储
 720   2                      g_uc_time_interval ++;//时间段加1
 721   2                      g_uc_log_number = 0;//新的时间段开始,清除记录值
 722   2                      beep = 0;//连续发声
 723   2                      delay(100,100);
 724   2                      beep = 1;
 725   2              }
 726   1              if(g_uc_time_interval >= 7)
 727   1              {
 728   2                      ET0 = 0;//禁止T0
 729   2                      ET1 = 0;
 730   2                      TR0 = 0;//停止T0
 731   2                      TR1 = 0;
 732   2                      EX0 = 0;//禁止外部中断0         
 733   2                      beep = 0;
 734   2                      for(j = 0;j < 8;j++)//断续提示声
 735   2                      {
 736   3                              delay(200,200);
 737   3                              if(beep == 0)beep = 1;
 738   3                              else beep = 0;
 739   3                      }
 740   2              }
 741   1      }
 742          /*************************************************/
 743          /*int0_interrupt*/
 744          /*************************************************/
 745          void int0_interrupt(void) interrupt 0 using 1
 746          {
 747   1              beep = 0;//连续发声
 748   1              delay(50,100);
 749   1              beep = 1;
 750   1              EX0 = 0;
 751   1      
 752   1              g_uc_log_number ++;
 753   1              if((g_uc_log_number&0x0F) > 9)//显示为10进制数,CD4511不能显示A~F
 754   1              {
 755   2                      g_uc_log_number += 6;
 756   2              }
 757   1              
 758   1              delay(55,255);//在短时间内不相应那么多中断,//看产品下线的速度而定
 759   1                      //如果延时过多,应该给予时钟补偿,g_uc_sec_cnt+*
 760   1      
 761   1              //g_st_current_time.sec += 2;//给时钟进行时间补偿2s//因为外部中断0自然优先级比timer0高
 762   1              
 763   1              EX0 = 1;
 764   1      }
 765          /*************************************************/
 766          /*serial_interrupt*/
 767          /*************************************************/
C51 COMPILER V7.50   LESSON10                                                              06/19/2006 21:28:10 PAGE 14  

 768          void serial_interrupt(void) interrupt 4 using 2
 769          {
 770   1              EA = 0;
 771   1              RI = 0;//软件清除中断标志
 772   1              g_uc_recv_serial_cnt ++;
 773   1      
 774   1              beep = 0;
 775   1              delay(30,55);
 776   1              beep = 1;
 777   1      
 778   1              if(g_uc_recv_serial_cnt < 7)
 779   1              {
 780   2                      ACC = SBUF;
 781   2                      //XBYTE[g_ui_ram_addr] = ACC;//不屏蔽掉,发ACC内容回PC时显示乱码
 782   2                      //g_ui_ram_addr ++;
 783   2      
 784   2                      //ACC = uc_temp_receive[g_uc_recv_serial_cnt][2] + 0x30;
 785   2                      //delay(5,200);
 786   2                      //delay(5,10);
 787   2                      //delay(5,0);//添加了延时后,无法把ACC中内容在PC上显示出字符
 788   2                      //SBUF = 0x21;//back to IBM, check the TI
 789   2                      SBUF = ACC;
 790   2                      //display_led(g_uc_data_receive[0],g_uc_data_receive[1],g_uc_data_receive[2]);
 791   2              }
 792   1              else
 793   1              {
 794   2                      ACC = 0x2A;//ASCII 0x21:!
 795   2                      SBUF = ACC;
 796   2              }
 797   1      
 798   1              while(TI == 0)
 799   1              {
 800   2                      delay(3,255);
 801   2              }
 802   1              TI = 0;
 803   1      
 804   1              EA = 1;
 805   1      
 806   1      }
 807          /*************************************I2C start*****************************************/
 808          /**********************************void Start_I2C()*********************************
 809          该函数是启动总线函数,功能是启动I2C总线,即发送I2C起始条件
 810          注意:  在SCL高电平时,SDA从高电平变低电平表示start;
 811                          在SCL高电平时,SDA从低电平变高电平表示stop。
 812          *********************************************************************************/
 813          void Start_I2C(void)
 814          {
 815   1              SDA = 1;//发送起始条件的数据信号
 816   1              _Nop();
 817   1              SCL = 1;
 818   1              _Nop();//起始条件建立时间大于4.7us,延时
 819   1              _Nop();
 820   1              _Nop();
 821   1              _Nop();
 822   1              _Nop();
 823   1              SDA = 0;//发送起始信号
 824   1              _Nop();//起始条件锁定时间大于4us
 825   1              _Nop();
 826   1              _Nop();
 827   1              _Nop();
 828   1              _Nop();
 829   1              SCL = 0;//嵌住I2C总线准备发送或接收数据
C51 COMPILER V7.50   LESSON10                                                              06/19/2006 21:28:10 PAGE 15  

 830   1              _Nop();
 831   1              _Nop();
 832   1      }
 833          /******************************************************************
 834          该函数为结束总线函数,功能是结束I2C总线,即发送I2C结束条件
 835          ******************************************************************/
 836          void Stop_I2C(void)
 837          {
 838   1              SDA = 0;//发送结束条件的数据信号
 839   1              _Nop();
 840   1              SCL = 1;//发送结束条件的时钟信号
 841   1              _Nop();//结束条件建立时间大于4us
 842   1              _Nop();
 843   1              _Nop();
 844   1              _Nop();
 845   1              _Nop();
 846   1              SDA = 1;//发送I2C总线结束信号
 847   1              _Nop();
 848   1              _Nop();
 849   1              _Nop();
 850   1              _Nop();
 851   1      }
 852          
 853          /*********************void SendB(unsigned char c)*********************************
 854          该函数为字节数据传送函数,功能是将数据c发送出去,可以是地址,也可以是数据,发送完毕后等待应答,
 855          并对此状态位进行操作(不应答或非应答都使ack = 0,假)。发送数据正常ack = 1;ack = 0表示被控制
 856          器无应答或损坏。
 857          ****************************************************************/
 858          void SendB(unsigned char c)
 859          {
 860   1              unsigned char BitCnt;
 861   1      
 862   1              for(BitCnt = 0;BitCnt < 8;BitCnt++)//要传送的数据长度为8位
 863   1              {
 864   2                      if((c<<BitCnt)&0x80)
 865   2                              SDA = 1;//判断发送位//判断需要发送的bit为0还是1
 866   2                      else 
 867   2                              SDA = 0;
 868   2                      _Nop();
 869   2                      SCL = 1;//置时钟线为高,通知被控制器开始接收数据位
 870   2                      _Nop();
 871   2                      _Nop();//保证时钟高电平周期大于4us
 872   2                      _Nop();
 873   2                      _Nop();
 874   2                      _Nop();
 875   2                      SCL = 0;
 876   2              }
 877   1              _Nop();
 878   1              _Nop();
 879   1              SDA = 1;//8位发送完毕后,释放数据线准备接收应答位
 880   1              _Nop();
 881   1              _Nop();
 882   1              SCL = 1;
 883   1              _Nop();
 884   1              _Nop();
 885   1              _Nop();
 886   1              _Nop();
 887   1              _Nop();
 888   1              if(SDA == 1)
 889   1              {
 890   2                      ack = 0;//判断是否接收到应答信号                        
 891   2              }
C51 COMPILER V7.50   LESSON10                                                              06/19/2006 21:28:10 PAGE 16  

 892   1              else
 893   1                      ack = 1;
 894   1              SCL = 0;
 895   1              _Nop();
 896   1              _Nop();
 897   1      }
 898          /***************************unsigned char RcvB()******************************
 899          该函数是字节数据传送函数,功能:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -