数码之家

 找回密码
 立即注册
搜索
查看: 1082|回复: 7

[C51] 坛友高手帮忙看看这个数码管程序写入后怎么是黑屏的。

[复制链接]
发表于 2022-3-22 20:17:23 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
移植了一个数码管时钟程序,但写入后单片机没有反映,数码管黑屏请坛友给指导指导。
  1. /*****************************************************************************************************
  2. *******************************************头文件与宏定义*********************************************
  3. *****************************************************************************************************/
  4. #include <STC15.h>
  5. #include <intrins.h>
  6. #define        uchar unsigned char               
  7. #define        uint unsigned int
  8. /*****************************************************************************************************
  9. ***********************************************ADC定义************************************************
  10. *****************************************************************************************************/
  11. sfr ADC_LOW2    =   0xBE;           //ADC低2位结果
  12. #define ADC_POWER   0x80            //ADC电源控制位
  13. #define ADC_FLAG    0x10            //ADC完成标志
  14. #define ADC_START   0x08            //ADC起始控制位
  15. #define ADC_SPEEDLL 0x00            //540个时钟
  16. #define ADC_SPEEDL  0x20            //360个时钟
  17. #define ADC_SPEEDH  0x40            //180个时钟
  18. #define ADC_SPEEDHH 0x60            //90个时钟
  19. /*****************************************************************************************************
  20. ********************************************红外遥控定义**********************************************
  21. *****************************************************************************************************/
  22. #define Imax 14000
  23. #define Imin 8000
  24. #define Inum1 1450
  25. #define Inum3 3000
  26. #define Inum2 700
  27. uchar f;
  28. uchar IrOK;
  29. unsigned long m,Tc;
  30. uchar Im[4]={0x00,0x00,0x00,0x00};
  31. /*****************************************************************************************************
  32. **********************************************DS3231定义**********************************************
  33. *****************************************************************************************************/       
  34. uchar RTC_Data[7];
  35. uchar RTC_Data1[7];
  36. uchar RTC_Set_ID;
  37. code uchar rtc_address[7]={0x00,0x01,0x02,0x04,0x05,0x03,0x06};
  38. /*****************************************************************************************************
  39. **********************************************DS18B20定义**********************************************
  40. *****************************************************************************************************/       
  41. #define DS1820_TIMEOUT (750/T0_RUNOUT)    // 12-bit resolution, 750ms MAX
  42. #define DS_RESOLUTION   11//9,10,11,12

  43. #if defined(USE_18B20)
  44. unsigned char DS18B20_GetTemp( void );
  45. unsigned char DelayXus(unsigned short n);
  46. unsigned char DS18B20_Reset( void );
  47. unsigned char DS18B20_ReadByte( void );
  48. unsigned char DS18B20_WriteByte( unsigned char dat );
  49. unsigned char DS18B20_InitSet( void );
  50. #endif

  51. #define  TEMPH   dstemperature.byte[0]       //存放温度值的高字节
  52. #define  TEMPL    dstemperature.byte[1]       //存放温度值的低字节

  53. #define DS_DELAY480US           8
  54. #define DS_DELAY240US           4
  55. #define DS_DELAY60US             1
  56. #define DS_WAIT_PLUSE            100

  57. #define DS_TH_REG     37
  58. #define DS_TL_REG      0
  59.    
  60. #if(DS_RESOLUTION==9)
  61.    #define DS_CONFIG_REG      0x1F
  62. #elif(DS_RESOLUTION==10)
  63.    #define DS_CONFIG_REG      0x3F
  64. #elif(DS_RESOLUTION==11)
  65.    #define DS_CONFIG_REG      0x5F  
  66. #elif(DS_RESOLUTION==12)
  67.    #define DS_CONFIG_REG      0x7F   
  68. #else
  69.    #error DS_RESOLUTION: 9 , 10 , 11 , 12
  70. #endif
  71. /*****************************************************************************************************
  72. **********************************************标志位定义**********************************************
  73. *****************************************************************************************************/
  74. bit T0_Flag;                         //定时器0标志位
  75. bit laba_flag;           //蜂鸣器标志位
  76. bit set_flag;                         //设置显示标志位
  77. bit RTC_Save_Flag;       //设置时间标志位
  78. bit gk;                                      //光控标志位
  79. /*****************************************************************************************************
  80. **********************************************管脚定义************************************************
  81. *****************************************************************************************************/
  82. sbit IIC_SCL=P3^4;         //DS3231_SCL
  83. sbit IIC_SDA=P3^3;         //DS3231_SDA
  84. sbit hongwai=P3^1;   //红外接收数据输入端
  85. sbit DQ=P3^5;   //DS18B20的数据口位

  86. sbit key1=P3^2;                 //设置键
  87. sbit key2=P5^4;                 //加键
  88. sbit key3=P5^5;                 //减键

  89. sbit laba=P2^7;                 //喇叭输出端
  90. sbit D4=P1^1;                 //数码管位码
  91. sbit D3=P1^2;                 //数码管位码
  92. sbit D2=P2^6;                 //数码管位码
  93. sbit D1=P1^0;                 //数码管位码

  94. int ld;                                 //光控ADC用
  95. uint temp[3];                 //光控ADC用
  96. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xbf,};       //共阳数码管
  97.                                        
  98. uchar code table1[]={0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82,0x81,0x98,0xF0,0x8C,0xB0,0xB1};           //共阳数码管倒装
  99.                                          

  100. /*****************************************************************************************************
  101. ******************************************定时器中断函数**********************************************
  102. *****************************************************************************************************/
  103. void Time1() interrupt 3
  104. {
  105.         static uchar timecount;
  106.         TF1=0;
  107.         TH1=0xff;
  108.         TL1=256-110;
  109.        
  110.         timecount++;
  111.         if(timecount>=5)
  112.         {
  113.                 timecount=0;
  114.                 T0_Flag=1;
  115.         }               
  116.         if(laba_flag)
  117.         {
  118.                 laba=~laba;
  119.         }
  120.         else
  121.         laba=1;
  122. }
  123. /*****************************************************************************************************
  124. *******************************************ADC初始化函数**********************************************
  125. *****************************************************************************************************/
  126. void InitADC()
  127. {
  128.           P1ASF = 0x08;                        //Open channels ADC function 0000 1000 p1.3使用AD功能
  129.         ADC_RES  = 0;                                   
  130.         ADC_LOW2 = 0;
  131.           ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  132. }
  133. /*****************************************************************************************************
  134. *********************************************ADC处理函数**********************************************
  135. *****************************************************************************************************/
  136. void GetADCResult(unsigned char ch,unsigned int *value)
  137. {
  138.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  139.     _nop_();                        //Must wait before inquiry
  140.     _nop_();
  141.     _nop_();
  142.     _nop_();
  143.     _nop_();                        //Must wait before inquiry
  144.     _nop_();
  145.     while(!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  146.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  147.         *value = 0;
  148.         *value = ADC_RES;
  149.         *value = ((*value)*4 + ADC_LOW2);               
  150. }
  151. /*****************************************************************************************************
  152. **********************************************延时函数************************************************
  153. *****************************************************************************************************/       
  154. void Delayms(uint t)//@11.0592MHz
  155. {
  156.         uchar i;
  157.         i=t;
  158.         while(--i);
  159. }

  160. void Delay_xms(uint x)
  161. {
  162.         uchar  i,j;
  163.         uint   t;
  164.         for(t=x;t>0;t--)
  165.          {
  166.            i = 15;
  167.              j = 90;
  168.              do
  169.              {
  170.                  while(--j);
  171.               } while(--i);
  172.           }   
  173. }
  174. /*****************************************************************************************************
  175. **********************************************显示函数************************************************
  176. *****************************************************************************************************/       
  177. void display()
  178. {
  179.         D1=0;
  180.         P0=table[RTC_Data[2]/10];
  181.         Delayms(4);
  182.         P0=0xff;
  183.         D1=1;

  184.         D2=0;
  185.         if(RTC_Data[0]/1%2==0) P0=table[RTC_Data[2]%10];
  186.         else P0=table1[RTC_Data[2]%10];       
  187.         Delayms(4);
  188.         P0=0xff;
  189.         D2=1;

  190.         D3=0;
  191.         if(RTC_Data[0]/1%2==0) P0=table1[RTC_Data[1]/10];
  192.         else P2=table1[RTC_Data[1]/10];       
  193.         Delayms(4);
  194.         P0=0xff;
  195.         D3=1;


  196.         D4=0;
  197.         P0=table1[RTC_Data[1]%10];
  198.         Delayms(4);
  199.         P0=0xff;
  200.         D4=1;
  201. }
  202. /*****************************************************************************************************
  203. **************************************显示小时函数*****设置用*****************************************
  204. *****************************************************************************************************/       
  205. void display_set_shi()
  206. {
  207.         D1=0;
  208.         P0=0x91;
  209.         Delayms(2);
  210.         P0=0xff;
  211.         D1=1;

  212.         D2=0;
  213.         P0=0xff;
  214.         Delayms(2);
  215.         P0=0xff;
  216.         D2=1;

  217.         D3=0;
  218.         P0=table1[RTC_Data[2]/10];
  219.         Delayms(2);
  220.         P0=0xff;
  221.         D3=1;

  222.         D4=0;
  223.         P0=table1[RTC_Data[2]%10];
  224.         Delayms(2);
  225.         P0=0xff;
  226.         D4=1;
  227. }
  228. /*****************************************************************************************************
  229. **************************************显示分钟函数*****设置用*****************************************
  230. *****************************************************************************************************/
  231. void display_set_fen()
  232. {       
  233.         D1=0;
  234.         P0=table[15];
  235.         Delayms(2);
  236.         P0=0xff;
  237.         D1=1;

  238.         D2=0;
  239.         P0=0xff;
  240.         Delayms(2);
  241.         P0=0xff;
  242.         D2=1;

  243.         D3=0;
  244.         P0=table1[RTC_Data[1]/10];
  245.         Delayms(2);
  246.         P0=0xff;
  247.         D3=1;

  248.         D4=0;
  249.         P0=table1[RTC_Data[1]%10];
  250.         Delayms(2);
  251.         P0=0xff;
  252.         D4=1;
  253. }
  254. /*****************************************************************************************************
  255. ***************************************显示秒函数*****设置用******************************************
  256. *****************************************************************************************************/
  257. void display_set_miao()
  258. {       
  259.         D1=0;
  260.         P0=0x49;
  261.         Delayms(2);
  262.         P0=0xff;
  263.         D1=1;

  264.         D2=0;
  265.         P0=0xff;
  266.         Delayms(2);
  267.         P0=0xff;
  268.         D2=1;

  269.         D3=0;
  270.         P0=table1[RTC_Data[0]/10];
  271.         Delayms(2);
  272.         P0=0xff;
  273.         D3=1;

  274.         D4=0;
  275.         P0=table1[RTC_Data[0]%10];
  276.         Delayms(2);
  277.         P0=0xff;
  278.         D4=1;
  279. }
  280. /*****************************************************************************************************
  281. ********************************************键值处理函数**********************************************
  282. *****************************************************************************************************/       
  283. void KeyDataProcess()
  284. {
  285.         if(key1==0)// 设置
  286.         {
  287.                 if(key1==0)
  288.                 {
  289.                         Delay_xms(20);
  290.                         while(!key1);
  291.                         laba_flag=1; //蜂鸣器响一声
  292.                         set_flag=0;
  293.                         RTC_Set_ID++;
  294.                         if(RTC_Set_ID>=4)
  295.                                 RTC_Set_ID=1;
  296.                 }
  297.         }

  298.         if(key2==0)//+
  299.         {
  300.                 if(key2==0)
  301.                 {
  302.                         Delay_xms(20);
  303.                         while(!key2);
  304.                         laba_flag=1;   //蜂鸣器响一声
  305.                         set_flag=0;
  306.                         if(RTC_Set_ID==1)
  307.                         {
  308.                                 RTC_Data[2]++;
  309.                                 if(RTC_Data[2]>23)
  310.                                 RTC_Data[2]=0;
  311.                                 display_set_shi();
  312.                         }
  313.                         else if(RTC_Set_ID==2)
  314.                         {
  315.                                 RTC_Data[1]++;
  316.                                 if(RTC_Data[1]>59)
  317.                                 RTC_Data[1]=0;
  318.                                 display_set_fen();
  319.                         }
  320.                         else if(RTC_Set_ID==3)
  321.                         {
  322.                                 RTC_Data[0]++;
  323.                                 if(RTC_Data[0]>59)
  324.                                 RTC_Data[0]=0;
  325.                                 display_set_miao();
  326.                         }
  327.                 }
  328.         }

  329.         if(key3==0)//-
  330.         {
  331.                 if(key3==0)
  332.                 {
  333.                         Delay_xms(20);
  334.                         while(!key3);
  335.                         laba_flag=1;          //蜂鸣器响一声
  336.                         set_flag=0;
  337.                         if(RTC_Set_ID==1)
  338.                         {
  339.                                 RTC_Data[2]--;
  340.                                 if(RTC_Data[2]==-1)
  341.                                 RTC_Data[2]=23;
  342.                                 display_set_shi();
  343.                         }
  344.                         else if(RTC_Set_ID==2)
  345.                         {
  346.                                 RTC_Data[1]--;
  347.                                 if(RTC_Data[1]==-1)
  348.                                 RTC_Data[1]=59;
  349.                                 display_set_fen();
  350.                         }
  351.                         else if(RTC_Set_ID==3)
  352.                         {
  353.                                 RTC_Data[0]--;
  354.                                 if(RTC_Data[0]==-1)
  355.                                 RTC_Data[0]=59;
  356.                                 display_set_miao();
  357.                         }
  358.                 }
  359.         }

  360.        
  361.         //以下为红外遥控部分
  362.         if(IrOK==1)        //设置键
  363.         {
  364.                 if(Im[2]==0x0d)
  365.                 {
  366.                         laba_flag=1; //蜂鸣器响一声
  367.                         set_flag=0;
  368.                         RTC_Set_ID++;
  369.                         if(RTC_Set_ID>=4)
  370.                                 RTC_Set_ID=1;
  371.                 }

  372.                 else if(Im[2]==0x40)//遥控器+键
  373.                 {
  374.                         laba_flag=1;   //蜂鸣器响一声
  375.                         set_flag=0;
  376.                         if(RTC_Set_ID==1)
  377.                         {
  378.                                 RTC_Data[2]++;
  379.                                 if(RTC_Data[2]>23)
  380.                                 RTC_Data[2]=0;
  381.                                 display_set_shi();
  382.                         }
  383.                         else if(RTC_Set_ID==2)
  384.                         {
  385.                                 RTC_Data[1]++;
  386.                                 if(RTC_Data[1]>59)
  387.                                 RTC_Data[1]=0;
  388.                                 display_set_fen();
  389.                         }
  390.                         else if(RTC_Set_ID==3)
  391.                         {
  392.                                 RTC_Data[0]++;
  393.                                 if(RTC_Data[0]>59)
  394.                                 RTC_Data[0]=0;
  395.                                 display_set_miao();
  396.                         }
  397.                 }

  398.                 else if(Im[2]==0x19)//遥控器-键
  399.                 {
  400.                         laba_flag=1;          //蜂鸣器响一声
  401.                         set_flag=0;
  402.                         if(RTC_Set_ID==1)
  403.                         {
  404.                                 RTC_Data[2]--;
  405.                                 if(RTC_Data[2]==-1)
  406.                                 RTC_Data[2]=23;
  407.                                 display_set_shi();
  408.                         }
  409.                         else if(RTC_Set_ID==2)
  410.                         {
  411.                                 RTC_Data[1]--;
  412.                                 if(RTC_Data[1]==-1)
  413.                                 RTC_Data[1]=59;
  414.                                 display_set_fen();
  415.                         }
  416.                         else if(RTC_Set_ID==3)
  417.                         {
  418.                                 RTC_Data[0]--;
  419.                                 if(RTC_Data[0]==-1)
  420.                                 RTC_Data[0]=59;
  421.                                 display_set_miao();
  422.                         }
  423.                 }
  424.                 else if(Im[2]==0x15)//遥控器播放键
  425.                 {
  426.                         laba_flag=1;          //蜂鸣器响一声
  427.                         set_flag=1;
  428.                         RTC_Save_Flag=1;               
  429.                 }
  430.                 else if(Im[2]==0x47)//遥控器MENU键
  431.                 {
  432.                         laba_flag=1;          //蜂鸣器响一声
  433.                         set_flag=1;                                       
  434.                         gk=!gk;       
  435.                 }
  436.                 IrOK=0;
  437.         }
  438. }
  439. /*****************************************************************************************************
  440. *****************************************DS3231时钟函数***********************************************
  441. *****************************************************************************************************/       
  442. void delay_IIC()   
  443. {
  444.         _nop_();_nop_();_nop_();_nop_();//IIC总线限速延时函数。该函数是空函数,延时4个机器周期。
  445. }
  446. void IIC_Init()        //IIC总线初始化函数
  447. {
  448.     IIC_SDA=1;//释放IIC总线的数据线。
  449.     IIC_SCL=1;//释放IIC总线的时钟线。
  450. }
  451. void IIC_start()  //IIC总线产生起始信号函数
  452. {   
  453.      IIC_SDA=1;//拉高数据线
  454.      IIC_SCL=1;//拉高时钟线
  455.      delay_IIC();
  456.      IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。
  457.      delay_IIC();
  458.      IIC_SCL=0;//拉低时钟线
  459. }
  460. void IIC_stop()//IIC总线产生停止信号函数
  461. {
  462.     IIC_SDA=0;//拉低数据线
  463.     delay_IIC();
  464.     IIC_SCL=1;//拉高时钟线。
  465.     delay_IIC();
  466.     IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。
  467.     delay_IIC();
  468. }
  469. bit IIC_Tack()         //接收应答信号函数
  470. {
  471.     bit ack;//定义一个位变量,来暂存应答状态。
  472.     IIC_SDA=1;//释放数据总线,准备接收应答信号。
  473.     delay_IIC();
  474.     IIC_SCL=1;//拉高时钟线。
  475.     delay_IIC();
  476.     ack=IIC_SDA;//读取应答信号的状态。
  477.     delay_IIC();
  478.     IIC_SCL=0;//拉低时钟线。
  479.     delay_IIC();
  480.     return ack;//返回应答信号的状态,0表示应答,1表示非应答。
  481. }
  482. void IIC_write_byte(uchar Data)//向IIC总线写入一个字节的数据函数
  483. {
  484.         uchar i;
  485.         for(i=0;i<8;i++)//有8位数据
  486.         {
  487.                 if(Data&0x80)
  488.                 IIC_SDA=1;//写最高位的数据
  489.                 else
  490.                 IIC_SDA = 0;
  491.                 delay_IIC();
  492.                 IIC_SCL=1; //拉高时钟线,将数写入到设备中。
  493.                 delay_IIC();
  494.                 IIC_SCL=0;//拉低时钟线,允许改变数据线的状态
  495.                 delay_IIC();
  496.                 Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备
  497.         }
  498. }
  499. uchar IIC_read_byte()//从IIC总线读取一个字节的数据函数
  500. {
  501.     uchar i;
  502.     uchar Data;       //定义一个缓冲寄存器。
  503.     for(i=0;i<8;i++)//有8位数据
  504.     {
  505.         IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。
  506.         delay_IIC();
  507.         Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。
  508.         delay_IIC();
  509.       
  510.         if(IIC_SDA)//如果数据线为高平电平。
  511.         Data=Data|0x01;//则给缓冲字节的最低位写1。
  512.         IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。
  513.         delay_IIC();
  514.     }
  515.     return Data;//返回读取的一个字节数据。
  516. }
  517. void IIC_single_byte_write(uchar Waddr,uchar Data)         //向任意地址写入一个字节数据函数
  518. {
  519.     IIC_start();//产生起始信号
  520.     IIC_write_byte(0xd0);//写入设备地址(写)
  521.     IIC_Tack();//等待设备的应答
  522.     IIC_write_byte(Waddr);//写入要操作的单元地址。
  523.     IIC_Tack();//等待设备的应答。
  524.     IIC_write_byte(Data);//写入数据。
  525.     IIC_Tack();//等待设备的应答。
  526.     IIC_stop();//产生停止符号。
  527. }
  528. uchar IIC_single_byte_read(uchar Waddr)        //从任意地址读取一个字节数据函数
  529. {
  530.     uchar Data;//定义一个缓冲寄存器。
  531.     IIC_start();//产生起始信号
  532.     IIC_write_byte(0xd0);//写入设备地址(写)
  533.     IIC_Tack();//等待设备的应答
  534.     IIC_write_byte(Waddr);//写入要操作的单元地址。
  535.     IIC_Tack();//等待设备的应答。
  536.     IIC_stop();//产生停止符号。
  537.     IIC_start();//产生起始信号
  538.     IIC_write_byte(0xd1);//写入设备地址(写)
  539.     IIC_Tack();//等待设备的应答
  540.     Data=IIC_read_byte();//写入数据。
  541.     delay_IIC();
  542.     IIC_stop();//产生停止符号。
  543.     return Data;//返回读取的一个字节数据。
  544. }
  545. /*****************************************************************************************************
  546. *******************************************时钟初始化函数*********************************************
  547. *****************************************************************************************************/
  548. void DS3231_Init()
  549. {
  550.     IIC_SDA=1;
  551.     IIC_SCL=1;
  552.     IIC_single_byte_write(0x0e,0x0c);
  553. }
  554. /*****************************************************************************************************
  555. ********************************************时钟写入函数**********************************************
  556. *****************************************************************************************************/
  557. void Set_RTC()
  558. {
  559.     uchar i,tmp;
  560.     for(i=0;i<7;i++)
  561.     {      
  562.         tmp=RTC_Data[i]/10;       
  563.         RTC_Data1[i]=RTC_Data[i]%10;
  564.         RTC_Data1[i]=RTC_Data1[i]+tmp*16;
  565.     }
  566.     for(i=0;i<7;i++)        
  567.     {
  568.         IIC_single_byte_write(rtc_address[i],RTC_Data1[i]);
  569.     }
  570.     IIC_single_byte_write(0x0e,0x0c);
  571. }
  572. /*****************************************************************************************************
  573. ********************************************时钟读取函数**********************************************
  574. *****************************************************************************************************/       
  575. void Read_RTC()
  576. {
  577.     uchar i,tmp,tmp1,tmp2;         
  578.     for(i=0;i<7;i++)         
  579.     {
  580.             tmp = IIC_single_byte_read(rtc_address[i]);
  581.             tmp1 = tmp/16;
  582.             tmp2 = tmp%16;
  583.                 RTC_Data[i]=tmp1*10+tmp2;
  584.     }   
  585. }
  586. void Ram_init()
  587. {
  588.         Read_RTC();                               //读取 秒分时日月周年
  589.         if((!RTC_Data[6])&&(!RTC_Data[4])&&(!RTC_Data[3])&&(!RTC_Data[2])&&(!RTC_Data[1])&&(!RTC_Data[0]))
  590.         {
  591.                 RTC_Data[0]=0;       //秒      //秒分时日月周年 最低位读写位
  592.                 RTC_Data[1]=0;                 //分
  593.                 RTC_Data[2]=12;                 //时
  594.                 RTC_Data[3]=3;                 //日
  595.                 RTC_Data[4]=11;                 //月
  596.                 RTC_Data[5]=2;                 //周
  597.                 RTC_Data[6]=15;                 //年
  598.                 Set_RTC();                     //写入 秒分时日月周年
  599.         }
  600.         RTC_Set_ID=0;       
  601. }

  602. /*****************************************************************************************************
  603. **********************************************走时函数************************************************
  604. *****************************************************************************************************/       
  605. void Time_Fun()
  606. {
  607.         static        uchar T10Ms_Cnt=0,T200Ms_Cnt=0;
  608.         static uchar Buzz_On_Cnt=0,RTC_Save_Cnt=0;       
  609.        
  610.         T10Ms_Cnt++;       
  611.         if(T10Ms_Cnt>=5)
  612.         {
  613.                 T10Ms_Cnt=0;
  614.                 KeyDataProcess();
  615.                 if(laba_flag)
  616.                 {
  617.                         Buzz_On_Cnt++;
  618.                         if(Buzz_On_Cnt>=10)
  619.                         {
  620.                                 laba_flag=0;
  621.                                 Buzz_On_Cnt=0;
  622.                         }
  623.                 }       
  624.                 if(RTC_Save_Flag)                         //按确定键RTC_Save_Flag=1,保存数据
  625.                 {
  626.                         RTC_Save_Cnt++;
  627.                         if(RTC_Save_Cnt>=50)
  628.                         {
  629.                                 RTC_Save_Cnt=0;
  630.                                 RTC_Save_Flag=0;
  631.                                 RTC_Set_ID=0;
  632.                                 Set_RTC();
  633.                         }
  634.                 }
  635.         }
  636.         T200Ms_Cnt++;
  637.         if(T200Ms_Cnt>=5)                          
  638.         {
  639.                 T200Ms_Cnt=0;               
  640.                 if(!RTC_Set_ID)
  641.                 Read_RTC();
  642.                 GetADCResult(7,&temp[2]);
  643.                 if(gk==1)                    //开光控
  644.                 {
  645.                         if( temp[2]<100)ld=5;
  646.                         if( temp[2]>100 && temp[2]<300)ld=10;
  647.                         if( temp[2]>300 && temp[2]<500)ld=50;
  648.                         if( temp[2]>500 && temp[2]<600)ld=80;
  649.                         if( temp[2]>600 && temp[2]<700)ld=100;
  650.                         if( temp[2]>700 && temp[2]<800)ld=120;
  651.                         if( temp[2]>900 && temp[2]<1000)ld=130;
  652.                         if( temp[2]>1000)ld=150;                                       
  653.                 }
  654.                 else ld=5;       
  655.                 if(set_flag==1)
  656.                 {
  657.                         display();
  658.                 }
  659.                 if(RTC_Set_ID==1)
  660.                 {
  661.                         display_set_shi();
  662.                 }
  663.                 else if(RTC_Set_ID==2)
  664.                 {
  665.                         display_set_fen();
  666.                 }
  667.                 else if(RTC_Set_ID==3)
  668.                 {
  669.                         display_set_miao();
  670.                 }
  671.                 Delayms(ld);
  672.         }
  673. }

  674. /*****************************************************************************************************
  675. ****************************************DS18B20函数******************************************
  676. *****************************************************************************************************/
  677. #if defined(USE_18B20)
  678. unsigned char DS18B20_GetTemp( void )
  679. {
  680.    switch ( ds1820state )
  681.    {
  682.       case 0://设备复位
  683.          if ( 0==DS18B20_Reset(  ) )
  684.          {
  685.             ds1820state = 1;
  686.             ds1820substate =0;  
  687.          }
  688.       break;
  689.       case 1:
  690.          if ( 0==DS18B20_WriteByte( 0xCC ) )
  691.          {   //跳过ROM命令
  692.             ds1820state = 2;
  693.             ds1820substate =0;                 
  694.          }               
  695.       break;
  696.       case 2:
  697.          if ( 0==DS18B20_WriteByte( 0x44 ) )
  698.          {   //开始转换命令
  699.             ds1820state = 3;
  700.             ds1820substate =0;
  701.             uscnt = 0;
  702.          }
  703.       break;
  704.       case 3://等待转换完成
  705.          if ( flag_ms_ds )
  706.          {
  707.             flag_ms_ds = 0;
  708.             uscnt++;
  709.          }
  710.          if ( uscnt>DS1820_TIMEOUT )
  711.          {
  712.             ds1820state = 0;
  713.          }
  714.          if ( DQ )
  715.          {
  716.             ds1820state = 4;
  717.             ds1820substate =0;
  718.          }               
  719.       break;
  720.       case 4:
  721.          if ( 0==DS18B20_Reset(  ) )
  722.          {
  723.             ds1820state = 5;
  724.             ds1820substate =0;
  725.          }
  726.       break;
  727.       case 5:
  728.          if ( 0==DS18B20_WriteByte( 0xCC ) )
  729.          {   //跳过ROM命令
  730.             ds1820state = 6;
  731.             ds1820substate =0;               
  732.          }               
  733.       break;
  734.       case 6:
  735.          if ( 0==DS18B20_WriteByte( 0xBE ) )
  736.          {   //读暂存存储器命令
  737.             ds1820state = 7;
  738.             ds1820substate =0;               
  739.          }
  740.       break;
  741.       case 7:
  742.          if ( 0==DS18B20_ReadByte(  ) )
  743.          {   //读温度低字节
  744.             TEMPL = ds1820data;
  745.             ds1820state = 8;
  746.             ds1820substate =0;
  747.          }   
  748.       break;
  749.       case 8:
  750.          if ( 0==DS18B20_ReadByte(  ) )
  751.          {   //读温度高字节
  752.             TEMPH = ds1820data;
  753.             ds1820state = 0;
  754.             ds1820substate =0;
  755.             return 0;
  756.          }
  757.       break;
  758.       default:ds1820state=0;break;
  759.    }

  760.    return 1;
  761. }

  762. unsigned char DelayXus(unsigned short n)
  763. {
  764.    if ( uscnt < n )
  765.    {
  766.       uscnt++;
  767.       return 1;
  768.    }
  769.    else
  770.    {
  771.       uscnt = 0;
  772.       return 0;
  773.    }   
  774. }

  775. unsigned char DS18B20_Reset( void)
  776. {
  777.    switch ( ds1820substate )
  778.    {
  779.       case 0:
  780.          DQ = 0;                     //送出低电平复位信号
  781.          ds1820substate = 1;
  782.          uscnt = 0;
  783.       break;
  784.       case 1: //延时至少480us
  785.          if ( 0==DelayXus(DS_DELAY480US) )
  786.          {
  787.             DQ = 1;    //释放数据线
  788.             ds1820substate = 2;
  789.             uscnt = 0;   
  790.          }        
  791.       break;
  792.       case 2: //检测存在脉冲
  793.          if ( 0==DQ )
  794.          {
  795.             ds1820substate = 3;
  796.             uscnt = 0;
  797.          }
  798.          else if ( uscnt++ > DS_WAIT_PLUSE )
  799.          {
  800.             ds1820substate = 0;
  801.          }         
  802.       break;
  803.       case 3: //等待设备释放数据线
  804.          if ( 0==DelayXus(DS_DELAY240US) )
  805.          {
  806.             ds1820substate = 0;
  807.             return 0;
  808.          }
  809.       break;
  810.       default:ds1820substate=0;break;
  811.    }
  812.    return 1;
  813. }

  814. /**************************************
  815. 从DS18B20读1字节数据
  816. **************************************/
  817. unsigned char DS18B20_ReadByte( void )
  818. {
  819.    switch ( ds1820substate )
  820.    {
  821.       case 0:
  822.          loopcnt =0;
  823.       case 1:
  824.          ds1820data >>= 1;
  825.          DQ = 0;    //开始时间片
  826.          _nop_();_nop_();_nop_();            //延时等待
  827.          DQ = 1;    //准备接收
  828.          _nop_();_nop_();_nop_();            //接收延时
  829.          if ( DQ ) ds1820data |= 0x80;     //读取数据
  830.          uscnt = 0;
  831.          ds1820substate = 2;
  832.       break;
  833.       case 2:
  834.          if ( 0==DelayXus(DS_DELAY60US) )
  835.          {
  836.             loopcnt++;
  837.             ds1820substate = 1;
  838.          }
  839.          if ( loopcnt>7 )
  840.          {
  841.             ds1820substate = 0;
  842.             return 0;
  843.          }
  844.          break;
  845.       default: ds1820substate=0;break;
  846.    }

  847.    return 1;
  848. }

  849. /**************************************
  850. 向DS18B20写1字节数据
  851. **************************************/
  852. unsigned char DS18B20_WriteByte( unsigned char dat)
  853. {
  854.    switch ( ds1820substate )
  855.    {
  856.       case 0:
  857.          loopcnt = 0;
  858.          ds1820data = dat;
  859.       case 1:
  860.          DQ = 0;   //开始时间片
  861.          _nop_();_nop_();_nop_();             //延时等待
  862.          if ( ds1820data&0x01 )DQ=1;
  863.          else DQ = 0;
  864.          ds1820data >>= 1;     //送出数据
  865.          uscnt = 0;
  866.          ds1820substate = 2;
  867.       break;
  868.       case 2:
  869.          if ( 0==DelayXus(DS_DELAY60US) )
  870.          {
  871.             loopcnt++;
  872.             DQ = 1;                     //恢复数据线
  873.             //_nop_();                     //恢复延时
  874.             ds1820substate = 1;
  875.          }
  876.          if ( loopcnt>7 )
  877.          {
  878.             ds1820substate = 0;
  879.             return 0;
  880.          }
  881.       break;
  882.       default: ds1820substate=0;break;
  883.    }

  884.    return 1;
  885. }

  886. unsigned char DS18B20_InitSet( void )
  887. {
  888.    switch ( ds1820state )
  889.    {
  890.       case 0://设备复位
  891.          if ( 0==DS18B20_Reset(  ) )
  892.          {
  893.             ds1820state = 1;
  894.             ds1820substate =0;  
  895.          }
  896.       break;
  897.       case 1:
  898.          if ( 0==DS18B20_WriteByte( 0xCC ) )
  899.          {   //跳过ROM命令
  900.             ds1820state = 2;
  901.             ds1820substate =0;                 
  902.          }               
  903.       break;
  904.       case 2:
  905.          if ( 0==DS18B20_WriteByte( 0x4E ) )
  906.          {   //写粘贴板
  907.             ds1820state = 3;
  908.             ds1820substate =0;
  909.          }
  910.       break;
  911.       case 3://
  912.          if ( 0==DS18B20_WriteByte( DS_TH_REG ) )
  913.          {   //写TH
  914.             ds1820state = 4;
  915.             ds1820substate =0;
  916.          }         
  917.       break;
  918.       case 4://
  919.          if ( 0==DS18B20_WriteByte( DS_TL_REG ) )
  920.          {   //写TL
  921.             ds1820state = 5;
  922.             ds1820substate =0;
  923.          }         
  924.       break;
  925.       case 5://
  926.          if ( 0==DS18B20_WriteByte( DS_CONFIG_REG ) )
  927.          {   //写设置
  928.             ds1820state = 0;
  929.             ds1820substate =0;
  930.             return 0;
  931.          }         
  932.       break;
  933.       default:ds1820state=0;break;
  934.    }

  935.    return 1;
  936. }
  937. #endif
  938. /*****************************************************************************************************
  939. ***********************************************主函数*************************************************
  940. *****************************************************************************************************/
  941. void main()
  942. {  
  943.         EA=1;                 //开总中断
  944.         IT1=1;                                  //下降沿有效
  945.         EX1=1;                                  //外部中断1开
  946.         ET1=1;                                  //打开允许开关

  947.         hongwai=1;            

  948.         TMOD=0x11;   
  949.         TH1=0xff;
  950.         TL1=256-110;
  951.         TR1=1;                //启动定时/计数器1 中断

  952.         TH0=0;                                  //T0赋初值
  953.         TL0=0;
  954.         TR0=1;
  955.         InitADC();                          //ADC初始化               
  956.         Ram_init();                          
  957.         IIC_Init();
  958.         DS3231_Init();       
  959.         laba=1;
  960.         set_flag=1;
  961.         gk=1;                          //光控默认开
  962.         laba_flag=0;
  963.         while(1)
  964.         {
  965.                 if(T0_Flag)
  966.                 {
  967.                         T0_Flag=0;
  968.                         Time_Fun();
  969.                 }
  970.         }
  971. }
  972. /*****************************************************************************************************
  973. ****************************************外部中断红外解码函数******************************************
  974. *****************************************************************************************************/
  975. void intersvr1(void) interrupt 2 using 1   //外部中断解码程序_外部中断1          P3.1口
  976. {
  977.         Tc=TH0*256+TL0;//提取中断时间间隔时长
  978.         TH0=0;
  979.         TL0=0;         //定时中断重新置零

  980.         if((Tc>Imin)&&(Tc<Imax))
  981.         {
  982.                 m=0;
  983.                 f=1;
  984.                 return;
  985.         }              //找到启始码
  986.         if(f==1)
  987.         {
  988.                 if(Tc>Inum1&&Tc<Inum3)
  989.                 {
  990.                         Im[m/8]=Im[m/8]>>1|0x80; m++;
  991.                 }
  992.                 if(Tc>Inum2&&Tc<Inum1)
  993.                 {
  994.                         Im[m/8]=Im[m/8]>>1; m++; //取码
  995.                 }
  996.                 if(m==32)
  997.                 {
  998.                         m=0;  
  999.                         f=0;
  1000.                         if(Im[2]==~Im[3])
  1001.                         {
  1002.                                 IrOK=1;
  1003.                         }
  1004.                         else IrOK=0;   //取码完成后判断读码是否正确
  1005.                 }
  1006.         }
  1007. }
复制代码


发表于 2022-3-23 13:03:23 | 显示全部楼层
先看数码管是共阴还是共阳,电路是否有问题?如果都没有问题,先编个程序点亮一下数码管,如果也都没有问题,那就看代码了,一步一步找问题吧!
回复 支持 反对

使用道具 举报

发表于 2022-3-23 14:06:53 | 显示全部楼层
这么长的代码没耐心看,先写几句简单的代码点亮一段看看电路和驱动方式是否正确,然后再点亮整个。
回复 支持 反对

使用道具 举报

发表于 2022-3-24 22:10:40 | 显示全部楼层
本帖最后由 慕名而来 于 2022-3-24 22:13 编辑

这么长的代码调试真的不是三言两语能说清的,分享一点建议,有兴趣的可以试试,但只是一点儿我调试程序的方法、有问题也还是要自己琢磨解决的。涉及显示的程序总是要从显示函数开始调试,方法很简单,就是先删除主循环中的所有代码,只加入显示函数看看显示现象,例如:

void main()
{
***//这里原来的内容不变
while(1)
{

display();

}
}
编译后会出现L16****的警告,只要没有错误就可以下载来看显示,如果无显示则查找这个函数的毛病,如果显示4个0是正常的,此时只需要修改第34行的数组,RTC_Data[7]={0,1,2,3,4,5,6}; 此时如果显示正常就说明显示函数可以使用了,而后改回原来的RTC_Data[7];
再次修改主循环的代码:
while(1)
{
Read_RTC();
display();

}
}

再次下载看显示,正常情况下应该能看到时钟走时的显示,一旦显示正常了就说明显示函数、3231的驱动都没问题了,可以继续其他的调试了。
另外,你的18b20代码貌似没有被利用到。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-25 21:38:24 | 显示全部楼层
感谢@慕名而来 的指导,这没有C语言功底,搞代码确实缓慢,要一点点验证。18b20代码确实是我整合进来的。
回复 支持 反对

使用道具 举报

发表于 2022-3-26 08:45:42 | 显示全部楼层
二楼、三楼说的对,这么长的代码很少会有人看的。首先用最短的代码确认一下硬件电路是否正确,甚至可以用静态显示的方式驱动一个数码管试一下,然后再从最简单的功能调试程序
回复 支持 反对

使用道具 举报

发表于 2022-3-26 09:41:22 | 显示全部楼层
一般都是自已写了BUG,自已慢慢查!
回复 支持 反对

使用道具 举报

发表于 2022-3-26 21:46:53 | 显示全部楼层
motofanoranw 发表于 2022-3-25 21:38
感谢@慕名而来 的指导,这没有C语言功底,搞代码确实缓慢,要一点点验证。18b20代码确实是我整合进来的。 ...

只是一点而经验分享而已,如果不是准备入行从事专业,注定不会按部就班的学习,用到啥学啥就好,我就是从几行数码管驱动代码开始玩单片机的,虽然一直用“外行”的思路对付编程问题,但是身边常见的单片机的简单应用我照葫芦画瓢的也都能浅显的玩一下,非专业学单片机编程我建议从读懂程序开始,读代码就要学习相关的特征字、语句、算法、调试的代码多了以上这些学习的内容的深度、广度也就多了,就你贴的代码而言涉及很多东西,如果能每一句都明白也就差不多入门了一边百度一边琢磨也不难的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-9 03:01 , Processed in 0.670802 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表