找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1196|回复: 4
收起左侧

这个单片机程序为什么按键没有反应?

[复制链接]
ID:494908 发表于 2022-4-6 13:26 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<math.h>
  4. #define uchar unsigened char
  5. #define uint unsigned int
  6. #define AddWr 0x90

  7. sbit SDA=P3^7;
  8. sbit SCL=P3^6;                                       
  9. sbit RS=P2^0;
  10. sbit RW=P2^1;
  11. sbit E =P2^2;
  12. sbit k1=P3^5;
  13. sbit k2=P1^1;
  14. sbit k3=P1^2;
  15. sbit k4=P1^3;
  16. sbit k5=P1^4;

  17. unsigned int temp;
  18. unsigned char way;


  19. void delay_ms(unsigned int n)  //12MHZ晶振时延时1ms,若用11.0592MHZ,则j=110
  20. {
  21.   unsigned int i=0,j=0;
  22.    for(i=n;i>0;i--)
  23.     for(j=0;j<123;j++);
  24. }

  25. void delay_8591()
  26. {
  27.    _nop_();   _nop_(); _nop_();_nop_(); _nop_();           //起始条件建立时间大于4.7us,延时
  28. }         

  29. /*******************************************PCF8591DA转换模块**************************/////////////////////
  30. /****************************************************************************************///////////
  31.    void start()//开始信号  
  32. {  
  33.     SDA=1;            //确保SDA线为高电平,开始        之前都确保为高电平
  34.     delay_8591();         
  35.     SCL=1;                             //确保SCL为高电平
  36.      delay_8591();                    
  37.     SDA=0;                     //在SCL为高时拉低SDA线,即为起始信号
  38.     delay_8591();  
  39.         SCL=0;                                   //将SCL线拉低,为后面SDA的传数据时电平变化做准备
  40. }  

  41. void stop() //停止信号  
  42. {  
  43.     SDA=0;                    //确保SDA线为低电平
  44.      delay_8591();   
  45.     SCL=1;                          //确保SCL线为高电平
  46.      delay_8591();   
  47.     SDA=1;                      //在SCL为高时拉高SDA线,即为停止信号,此时SDA和SCL均为高,同时完成IIC初始化过程
  48.      delay_8591(); ;  
  49. }  


  50. void init() //初始化  
  51. {  
  52.     SDA=1;  
  53.      delay_8591();  
  54.     SCL=1;  
  55.      delay_8591();      
  56. }  

  57. void write_byte(unsigned char date) //写一字节数据  
  58. {  
  59.     unsigned char i;   
  60.     for(i=0;i<8;i++)  
  61.     {  
  62.             if(date&0x80)         //判断最高位,并赋予SDA
  63.                   SDA=1;
  64.                 else
  65.                   SDA=0;
  66.                 delay_8591();
  67.                 SCL=1;                     //SCL高电平,SDA数据稳定,发送,通知被控器开始接收数据位
  68.                 delay_8591();
  69.                 date=date<<1;         //发送完成,发生时左移一位 移出的一位在CY中  
  70.         SCL=0;          //只有在scl=0时sda能变化值        
  71.     }
  72.         delay_8591();     
  73.     SDA=1;              //将SDA拉高,开始为IIC设备应答做准备
  74.     delay_8591();
  75. }  


  76. void respons()//应答    相当于一个智能的延时函数  
  77. {  
  78.     unsigned char i;  
  79.     SCL=1;                            //先拉高SCL,等待SDA应答
  80.     delay_8591();  
  81.     while((SDA==1)&&(i<250))  
  82.         i++;  
  83.     SCL=0;  
  84.     delay_8591();
  85. }  


  86. void write_add(unsigned char date)  
  87. {  
  88.     start();  
  89.     write_byte(AddWr);    //10010000  前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平  
  90.     respons();  
  91.     write_byte(0x40);  
  92.     respons();  
  93.     write_byte(date);  
  94.     respons();  
  95.     stop();  
  96.         }

  97. unsigned char code sin_tab[256]=
  98. {
  99.           0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
  100.           0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
  101.           0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
  102.           0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  103.           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
  104.           0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
  105.           0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
  106.           0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
  107.           0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
  108.           0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
  109.           0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
  110.           0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  111.           0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
  112.           0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
  113.           0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
  114.           0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80
  115.                  };                                         //用于生成正弦波

  116. void sin_8591()         //正弦波
  117. {
  118.          unsigned int i;
  119.   for(i=0;i<256;i++)
  120.   {
  121.     write_add(sin_tab[i]);          //data byte
  122.         delay_ms(5);
  123.         }
  124.         }


  125. void fangbo()
  126.         {
  127.         unsigned int i;
  128.         if(i<128)
  129.           write_add(0xff);
  130.                 if(i>=128)
  131.                 write_add(0x00);
  132.                 i++;
  133.          if(i>256)
  134.                   i=0;
  135.                 }
  136.         

  137. void sanjiao()
  138. {
  139.     unsigned int i;
  140.     while(1)
  141.         {
  142.           for(i=0;i<255;i++)
  143.             write_add(i);                 
  144.             for(i=255;i>0;i--)
  145.                  write_add(i);
  146.                 }
  147.                 }
  148.          

  149.   void juxing()
  150.   {        
  151.     unsigned int i;
  152.         while(1)
  153.         {
  154.            for(i=0;i<256;i++)
  155.            {
  156.              write_add(i);
  157.                  }
  158.                 }
  159.         }

  160. void main()
  161. {
  162.     TH0 = (65536-5000)/256;
  163.     TL0 = (65536-5000)%256;
  164.     TH1 = (65536-5000)/256;
  165.     TL1 = (65536-5000)%256;
  166.    EA = 1;
  167.        ET0 = 1;
  168.         ET1 = 1;
  169.           TR0 = 1;
  170.            TR1 = 1;  
  171.           init();
  172.           }



  173. void anjian(void)  interrupt 3
  174. {
  175.              TH1=(65536-5000)/256;                               //5000us
  176.              TL1=(65536-5000)%256;
  177.   if(k1==0)
  178.       {
  179.         
  180.               delay_ms(5);
  181.                           way++;
  182.                           if(way>=3)
  183.                           way=0;
  184.       }

  185. }

  186. void wave(void) interrupt 1
  187. {
  188.           TH0=(65536-5000)/256;
  189.     TL0=(65536-5000)%256;
  190.         if(way==0)
  191.         {
  192.          sin_8591();
  193.         }
  194.         if(way==1)
  195.         {
  196.         fangbo();
  197.          }
  198.          if(way==2)
  199.          {
  200.            sanjiao();
  201.           }
  202.           if(way==3)
  203.          {
  204.            juxing();
  205.           }
  206.           }
复制代码
回复

使用道具 举报

ID:161164 发表于 2022-4-6 15:46 来自手机 | 显示全部楼层
定时器没有设置运行模式,于是运行了13位定时器,把(65536-5000)放入13位定时器会产生500us左右的中断,当有键按下,中断中有delay,delay其间又定时器又有中断…
回复

使用道具 举报

ID:101869 发表于 2022-4-6 22:46 来自手机 | 显示全部楼层
中断不要用阻塞延时,楼上正解
回复

使用道具 举报

ID:494908 发表于 2022-4-8 12:10 | 显示全部楼层
lkc8210 发表于 2022-4-6 15:46
定时器没有设置运行模式,于是运行了13位定时器,把(65536-5000)放入13位定时器会产生500us左右的中断,当 ...

那该怎么解决呢?两个定时器冲突,求大神指点
回复

使用道具 举报

ID:121859 发表于 2022-4-8 12:29 | 显示全部楼层
主要问题是主程序里面少了一个while(1);加到最后吧。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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