📄 lesson10.lst
字号:
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 + -