找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2113|回复: 5
收起左侧

数码管显示异常怎么修改单片机代码?

[复制链接]
ID:499627 发表于 2019-4-2 10:02 | 显示全部楼层 |阅读模式
30黑币
IMG_20190402_095828.jpg
  1. #include <reg52.h>  
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #include <intrins.h>
  5. uchar a_a;



  6. uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
  7.                        0x60,0x25,0x39,0x26,0x31,0x71,0xff};  


  8. uchar dis_smg[8]   ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};


  9. sbit smg_we1 = P3^0;   
  10. sbit smg_we2 = P3^1;
  11. sbit smg_we3 = P3^2;
  12. sbit smg_we4 = P3^3;

  13. sbit c_send   = P3^2;   
  14. sbit c_recive = P3^3;  

  15. sbit beep = P2^7;  
  16. uchar smg_i =3;
  17. bit flag_300ms ;

  18. long distance;  
  19. uint set_d;  
  20. uchar flag_csb_juli;
  21. uint  flag_time0;

  22. uchar menu_1;   

  23. void delay_1ms(uint q)
  24. {
  25.     uint i,j;
  26.     for(i=0;i<q;i++)
  27.         for(j=0;j<120;j++);
  28. }

  29. void smg_display()
  30. {
  31.     dis_smg[0] = smg_du[distance % 10];
  32.     dis_smg[1] = smg_du[distance / 10 % 10];
  33.     dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf; ;   
  34. }


  35. #define RdCommand 0x01
  36. #define PrgCommand 0x02
  37. #define EraseCommand 0x03
  38. #define Error 1
  39. #define Ok 0
  40. #define WaitTime 0x01
  41. sfr ISP_DATA=0xe2;  
  42. sfr ISP_ADDRH=0xe3;
  43. sfr ISP_ADDRL=0xe4;
  44. sfr ISP_CMD=0xe5;
  45. sfr ISP_TRIG=0xe6;
  46. sfr ISP_CONTR=0xe7;


  47. void ISP_IAP_enable(void)
  48. {
  49.      EA = 0;   
  50.      ISP_CONTR = ISP_CONTR & 0x18;   
  51.      ISP_CONTR = ISP_CONTR | WaitTime;
  52.      ISP_CONTR = ISP_CONTR | 0x80;
  53. }


  54. void ISP_IAP_disable(void)
  55. {
  56.      ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  57.      ISP_TRIG = 0x00;
  58.      EA   =   1;   
  59. }


  60. void ISPgoon(void)
  61. {
  62.      ISP_IAP_enable();   
  63.      ISP_TRIG = 0x46;
  64.      ISP_TRIG = 0xb9;  
  65.      _nop_();
  66. }


  67. unsigned char byte_read(unsigned int byte_addr)
  68. {
  69.     EA = 0;
  70.      ISP_ADDRH = (unsigned char)(byte_addr >> 8);
  71.      ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  72.      ISP_CMD   = ISP_CMD & 0xf8;  
  73.      ISP_CMD   = ISP_CMD | RdCommand;
  74.      ISPgoon();   
  75.      ISP_IAP_disable();   
  76.      EA  = 1;
  77.      return (ISP_DATA);   
  78. }


  79. void SectorErase(unsigned int sector_addr)
  80. {
  81.      unsigned int iSectorAddr;
  82.      iSectorAddr = (sector_addr & 0xfe00);
  83.      ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  84.      ISP_ADDRL = 0x00;
  85.      ISP_CMD = ISP_CMD & 0xf8;
  86.      ISP_CMD = ISP_CMD | EraseCommand;
  87.      ISPgoon();   
  88.      ISP_IAP_disable();  

  89. }


  90. void byte_write(unsigned int byte_addr, unsigned char original_data)
  91. {
  92.      EA  = 0;
  93. //     SectorErase(byte_addr);
  94.      ISP_ADDRH = (unsigned char)(byte_addr >> 8);
  95.      ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  96.      ISP_CMD  = ISP_CMD & 0xf8;   
  97.      ISP_CMD  = ISP_CMD | PrgCommand;  
  98.      ISP_DATA = original_data;   
  99.      ISPgoon();   
  100.      ISP_IAP_disable();   
  101.      EA =1;
  102. }



  103. void write_eeprom()
  104. {
  105.     SectorErase(0x2000);
  106.     byte_write(0x2000, set_d % 256);
  107.     byte_write(0x2001, set_d / 256);
  108.     byte_write(0x2058, a_a);   
  109. }


  110. void read_eeprom()
  111. {
  112.     set_d  = byte_read(0x2001);
  113.     set_d <<= 8;
  114.     set_d  |= byte_read(0x2000);
  115.     a_a      = byte_read(0x2058);
  116. }


  117. void init_eeprom()
  118. {
  119.     read_eeprom();   
  120.     if(a_a != 1)     
  121.     {
  122.         set_d = 50;
  123.         a_a = 1;
  124.         write_eeprom();
  125.     }   
  126. }


  127. uchar key_can;   

  128. void key()   
  129. {
  130.     static uchar key_new;
  131.     key_can = 20;   
  132.     P2 |= 0x07;
  133.     if((P2 & 0x07) != 0x07)   
  134.     {
  135.         delay_1ms(1);  
  136.         if(((P2 & 0x07) != 0x07) && (key_new == 1))
  137.         {      
  138.             key_new = 0;
  139.             switch(P2 & 0x07)
  140.             {
  141.                 case 0x06: key_can = 3; break;   
  142.                 case 0x05: key_can = 2; break;  
  143.                 case 0x03: key_can = 1; break;  
  144.             }
  145.         }            
  146.     }
  147.     else
  148.         key_new = 1;   
  149. }


  150. void key_with()
  151. {
  152.     if(key_can == 1)   
  153.     {
  154.         menu_1 ++;
  155.         if(menu_1 >= 2)
  156.         {
  157.             menu_1 = 0;
  158.             smg_i = 3;
  159.         }
  160.         if(menu_1 == 1)
  161.         {
  162.             smg_i = 4;  
  163.         }
  164.     }
  165.     if(menu_1 == 1)  
  166.     {
  167.         if(key_can == 2)
  168.         {
  169.             set_d ++ ;  
  170.             if(set_d > 400)
  171.                 set_d = 400;
  172.         }
  173.         if(key_can == 3)
  174.         {
  175.             set_d -- ;  
  176.             if(set_d <= 1)
  177.                 set_d = 1;
  178.         }
  179.         dis_smg[0] = smg_du[set_d % 10];  
  180.         dis_smg[1] = smg_du[set_d / 10 % 10] ;
  181.         dis_smg[2] = smg_du[set_d / 100 % 10] & 0xdf ;
  182.         dis_smg[3] = 0x60;
  183.         write_eeprom();  
  184.     }   
  185. }  


  186. void clock_h_l()
  187. {
  188.     static uchar value;
  189.     if(distance <= set_d)
  190.     {
  191.         value ++;  
  192.         if(value >= 2)
  193.         {
  194.             beep = ~beep;  
  195.         }
  196.     }
  197.     else
  198.     {
  199.         value = 0;
  200.         beep = 1;  
  201.     }   
  202. }



  203. void smg_we_switch(uchar i)
  204. {
  205.     switch(i)
  206.     {
  207.         case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  208.         case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  209.         case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  210.         case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  211.     }   
  212. }



  213. void display()
  214. {
  215.     static uchar i;   
  216.     i++;
  217.     if(i >= smg_i)
  218.         i = 0;   
  219.     smg_we_switch(i);   
  220.     P1 = dis_smg[i];        
  221. }


  222. void delay()
  223. {
  224.     _nop_();   
  225.     _nop_();
  226.     _nop_();
  227.     _nop_();
  228.     _nop_();
  229.     _nop_();
  230.     _nop_();
  231.     _nop_();
  232.     _nop_();  
  233.     _nop_();
  234. }



  235. void send_wave()
  236. {
  237.     c_send = 1;   
  238.     delay();
  239.     c_send = 0;     
  240.     TH0 = 0;   
  241.     TL0 = 0;
  242.     TR0 = 0;   
  243.     while(!c_recive);  
  244.     TR0=1;
  245.     while(c_recive)      
  246.     {
  247.         flag_time0 = TH0 * 256 + TL0;
  248.         if((flag_time0 > 40000))  
  249.         {
  250.             TR0 = 0;
  251.             flag_csb_juli = 2;
  252.             distance = 888;
  253.             break ;        
  254.         }
  255.         else
  256.         {
  257.             flag_csb_juli = 1;   
  258.         }
  259.     }
  260.     if(flag_csb_juli == 1)
  261.     {   
  262.         TR0=0;   
  263.         distance =flag_time0;  
  264.         distance *= 0.017;   
  265.         if((distance > 500))   
  266.         {   
  267.             distance = 888;   
  268.         }
  269.     }  
  270. }



  271. void time_init()      
  272. {
  273.     EA  = 1;   
  274.     TMOD = 0X11;   
  275.     ET0 = 0;   
  276.     TR0 = 1;   
  277.     ET1 = 1;  
  278.     TR1 = 1;  
  279. }




  280. void main()
  281. {
  282.     beep = 0;   
  283.     delay_1ms(150);
  284.     P0 = P1 = P2 = P3 = 0xff;     
  285.     send_wave();   
  286.     smg_display();   
  287.     time_init();   
  288.     init_eeprom();  
  289.     send_wave();  
  290.     send_wave();   
  291.     while(1)
  292.     {         
  293.         if(flag_300ms == 1)
  294.         {        
  295.             flag_300ms = 0;
  296.             clock_h_l();   
  297.             if(beep == 1)
  298.                 send_wave();   
  299.             if(menu_1 == 0)
  300.                 smg_display();     
  301.         }
  302.         key();      
  303.         if(key_can < 10)
  304.         {
  305.             key_with();     
  306.         }
  307.     }
  308. }


  309. void time1_int() interrupt 3
  310. {   
  311.     static uchar value;   
  312.     TH1 = 0xf8;
  313.     TL1 = 0x30;   
  314.     display();     
  315.     value++;
  316.     if(value >= 150)
  317.     {
  318.         value = 0;
  319.         flag_300ms = 1;
  320.     }
  321. }

复制代码

回复

使用道具 举报

ID:67356 发表于 2019-4-2 22:18 | 显示全部楼层
uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
                       0x60,0x25,0x39,0x26,0x31,0x71,0xff};
把这里改一下
回复

使用道具 举报

ID:501901 发表于 2019-4-2 22:24 | 显示全部楼层
是共阴的还是共阳的不要搞反
回复

使用道具 举报

ID:213173 发表于 2019-4-3 13:28 | 显示全部楼层
改为:
uchar code smg_du[]={//共阳数码管段码"0~f"
                0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  
uchar dis_smg[4];//显示数字缓存
回复

使用道具 举报

ID:96682 发表于 2019-4-3 15:40 | 显示全部楼层
明显原理图与程序不匹配,楼主得提供电路图才好修改
回复

使用道具 举报

ID:481641 发表于 2019-4-3 16:31 | 显示全部楼层
改数组
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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