找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2109|回复: 9
收起左侧

求助,单片机数码管显示出错

[复制链接]
ID:698701 发表于 2020-3-22 13:07 | 显示全部楼层 |阅读模式
本帖最后由 华夏哈哈哈 于 2020-3-23 14:47 编辑
  1. //问题是:当key1,key2按下时,数码管显0000(key1按下)/0100(key2按下),可是目前正常显示没问题,但是摁下key1,key2数码管没有如期的运行,我想请教各位大神,我应该怎么在现有基础上实现  按下key1时,数码管显示0000,按下key2时,数码管显示0100,且对现有程序不产生干扰,谢谢,感激不尽

  2. //线性区间标度变换公式:    y=(115-15)/(243-13)*X+15kpa   


  3. #include <AT89X52.h>
  4. #include <intrins.h>
  5. #include <stdio.h>


  6. #define R24C04ADD 0xA1
  7. #define W24C04ADD 0xA0

  8. //ADC0832的引脚
  9. sbit ADCS =P2^2;  //ADC0832 chip seclect
  10. sbit ADDI =P2^4;  //ADC0832 k in
  11. sbit ADDO =P2^4;  //ADC0832 k out
  12. sbit ADCLK =P2^3;  //ADC0832 clock signal

  13. sbit led=P3^7;//led报警灯
  14. sbit beep=P1^7;//报警蜂鸣
  15. sbit a1=P1^0;
  16. sbit a2=P1^1;
  17. sbit a3=P1^2;
  18. sbit a4=P1^3;
  19. sbit key1=P3^0;
  20. sbit key2=P3^1;
  21. sbit c1=P0^0;
  22. sbit c2=P0^1;
  23. sbit c3=P0^2;
  24. sbit c4=P0^3;
  25. sbit c5=P0^4;
  26. sbit c6=P0^5;
  27. sbit c7=P0^6;
  28. sbit c8=P0^7;




  29. sbit SDA = P2 ^ 1;                                //数据线
  30. sbit SCL = P2 ^ 0;                                //时钟线
  31. bit bAck;                                          //应答标志 当bbAck=1是为正确的应答

  32. unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};  //位扫描
  33. unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};  //共阳数码管字段码
  34. unsigned char dispbuf[4];
  35. unsigned int temp;
  36. unsigned char getdata; //获取ADC转换回来的值
  37. unsigned char H_count,L_count;


  38. void delay_0us(void)  //12mhz delay 1.01ms
  39. {
  40.    unsigned char x,y,i;
  41.            for(i=0;i<3;i++)  
  42.    x=4;
  43.    while(x--)
  44.   {
  45.        y=30;
  46.        while(y--);
  47.     }
  48. }
  49. void display(void)  //数码管显示函数
  50. {

  51.   char k;
  52.   for(k=0;k<4;k++)
  53.   {

  54.   P1 = dispbitcode[k];
  55.   P0 = dispcode[dispbuf[k]];
  56.     if(k==1)          //加上数码管的dp小数点
  57.           P0&=0x7f;
  58.   delay_0us();
  59.   if(key1==0,key2==0)
  60.   P0=0xff;

  61.             {
  62.                   if(key1==0)
  63.             {
  64.          
  65. P1=0xfe;//P1.0引脚输出低电平数字1的段码
  66. P0=0xC0;//数字0的段码
  67.   delay_0us() ;
  68. P1=0xfd;//P1.1引脚输出低电平,DS1点亮
  69. P0=0xC0;//数字0的段码
  70.      delay_0us() ;
  71. P1=0xfb;//P1.2引脚输出低电平,DS2点亮
  72. P0=0xC0;//数字0的段码?
  73.      delay_0us() ;
  74.   P1=0xf7;//P1.3引脚输出低电平,DS3点亮
  75.   P0=0xC0;//数字0的段码
  76.               delay_0us();
  77.           P1=0xff;
  78. }
  79.                   if(key2==0)
  80.             {
  81.                
  82. P1=0xfe;//P1.0引脚输出低电平数字1的段码
  83. P0=0xc0;//数字1的段码
  84.     delay_0us() ;
  85. P1=0xfd;//P1.1引脚输出低电平,DS1点亮
  86. P0=0xf9;//数字0的段码
  87.           delay_0us() ;
  88. P1=0xfb;//P1.2引脚输出低电平,DS2点亮
  89. P0=0xc0;//数字0的段码?
  90.             delay_0us() ;
  91.   P1=0xf7;//P1.3引脚输出低电平,DS3点亮
  92.   P0=0xc0;//数字0的段码
  93.                delay_0us() ;
  94.           P1=0xff;
  95.            }
  96.          
  97. }
  98. }
  99. }           

  100. /************
  101. 读ADC0832函数
  102. ************/

  103. //采集并返回
  104. unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
  105. {
  106.     unsigned char i=0;
  107.     unsigned char j;
  108.     unsigned int dat=0;
  109.     unsigned char ndat=0;

  110.     if(channel==0)channel=2;
  111.     if(channel==1)channel=3;
  112.     ADDI=1;
  113.     _nop_();
  114.     _nop_();
  115.     ADCS=0;//拉低CS端
  116.     _nop_();
  117.     _nop_();
  118.     ADCLK=1;//拉高CLK端
  119.     _nop_();
  120.     _nop_();
  121.     ADCLK=0;//拉低CLK端,形成下降沿1
  122.     _nop_();
  123.     _nop_();
  124.     ADCLK=1;//拉高CLK端
  125.     ADDI=channel&0x1;
  126.     _nop_();
  127.     _nop_();
  128.     ADCLK=0;//拉低CLK端,形成下降沿2
  129.     _nop_();
  130.     _nop_();
  131.     ADCLK=1;//拉高CLK端
  132.     ADDI=(channel>>1)&0x1;
  133.     _nop_();
  134.     _nop_();
  135.     ADCLK=0;//拉低CLK端,形成下降沿3
  136.     ADDI=1;//控制命令结束
  137.     _nop_();
  138.     _nop_();
  139.     dat=0;
  140.     for(i=0;i<8;i++)
  141.     {
  142.         dat|=ADDO;//收数据
  143.         ADCLK=1;
  144.         _nop_();
  145.         _nop_();
  146.         ADCLK=0;//形成一次时钟脉冲
  147.         _nop_();
  148.         _nop_();
  149.         dat<<=1;
  150.         if(i==7)dat|=ADDO;
  151.     }  
  152.     for(i=0;i<8;i++)
  153.     {
  154.         j=0;
  155.         j=j|ADDO;//收数据
  156.         ADCLK=1;
  157.         _nop_();
  158.         _nop_();
  159.         ADCLK=0;//形成一次时钟脉冲
  160.         _nop_();
  161.         _nop_();
  162.         j=j<<7;
  163.         ndat=ndat|j;
  164.         if(i<7)ndat>>=1;
  165.     }
  166.     ADCS=1;//拉低CS端
  167.     ADCLK=0;//拉低CLK端
  168.     ADDO=1;//拉高数据端,回到初始状态
  169.     dat<<=8;
  170.     dat|=ndat;
  171.     return(dat);            //return ad k
  172. }


  173. //启动I2C总线,即发送起始条件
  174. void StartI2C()
  175. {
  176.         SDA = 1;                              //发送起始条件数据信号
  177.         _nop_();
  178.         SCL = 1;
  179.         _nop_();                                    //起始建立时间大于4.7us
  180.         _nop_();
  181.         _nop_();
  182.         _nop_();
  183.         _nop_();
  184.         SDA = 0;                              //发送起始信号
  185.         _nop_();
  186.         _nop_();
  187.         _nop_();
  188.         _nop_();
  189.         _nop_();
  190.         SCL = 0;                                //时钟操作
  191.         _nop_();
  192.         _nop_();
  193. }
  194. //结束I2C总线,即发送I2C结束条件
  195. void StopI2C()
  196. {
  197.         SDA = 0;                                //发送结束条件的数据信号
  198.         _nop_();                                      //发送结束条件的时钟信号
  199.         SCL = 1;                                //结束条件建立时间大于4us
  200.         _nop_();
  201.         _nop_();
  202.         _nop_();
  203.         _nop_();
  204.         _nop_();
  205.         SDA = 1;                                //发送I2C总线结束命令
  206.         _nop_();
  207.         _nop_();
  208.         _nop_();
  209.         _nop_();
  210.         _nop_();        
  211. }
  212. //发送一个字节的数据
  213. void        SendByte(unsigned char c)
  214. {
  215.         unsigned char BitCnt;
  216.         for(BitCnt = 0;BitCnt < 8;BitCnt++)                                  //一个字节
  217.                 {
  218.                         if((c << BitCnt)& 0x80) SDA = 1;                   //判断发送位
  219.                         else        SDA = 0;
  220.                         _nop_();
  221.                         SCL = 1;                              //时钟线为高,通知从机开始接收数据
  222.                         _nop_();
  223.                         _nop_();
  224.                         _nop_();
  225.                         _nop_();
  226.                         _nop_();
  227.                         SCL = 0;
  228.                 }
  229.         _nop_();
  230.         _nop_();
  231.         SDA = 1;                                                //释放数据线,准备接受应答位
  232.         _nop_();
  233.         _nop_();
  234.         SCL = 1;
  235.         _nop_();
  236.         _nop_();
  237.         _nop_();
  238.         if(SDA == 1) bAck =0;
  239.         else bAck = 1;                                                //判断是否收到应答信号
  240.         SCL = 0;
  241.         _nop_();
  242.         _nop_();
  243. }
  244. //接收一个字节的数据
  245. unsigned char RevByte()
  246. {
  247.         unsigned char retc;
  248.         unsigned char BitCnt;
  249.         retc = 0;
  250.         SDA = 1;
  251.         for(BitCnt=0;BitCnt<8;BitCnt++)
  252.         {
  253.                 _nop_();
  254.                 SCL = 0;                                            //置时钟线为低,准备接收
  255.                 _nop_();
  256.                 _nop_();
  257.                 _nop_();
  258.                 _nop_();
  259.                 _nop_();
  260.                 SCL = 1;                                            //置时钟线为高使得数据有效
  261.                 _nop_();
  262.                 _nop_();
  263.                 retc = retc << 1;                                    //左移补零
  264.                 if (SDA == 1)
  265.                 retc = retc + 1;                                     //当数据为1则收到的数据+1
  266.                 _nop_();
  267.                 _nop_();
  268.         }
  269.         SCL = 0;
  270.         _nop_();
  271.         _nop_();
  272.         return(retc);                                   //返回收到的数据
  273. }

  274. //WChipAdd:写器件地址;RChipAdd:读器件地址;InterAdd:内部地址;如写正确则返回数据,
  275. //否则返回对应错误步骤序号
  276. //向指定器件的内部指定地址发送一个指定字节
  277. unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
  278. {
  279.         StartI2C();                                                                                      //启动总线
  280.         SendByte(WChipAdd);                                                        //发送器件地址以及命令
  281.         if (bAck==1)                                                                                          //收到应答
  282.         {
  283.                 SendByte(InterAdd);                                                                //发送内部子地址
  284.                 if (bAck ==1)
  285.                 {
  286.                         SendByte(WIICData);                                                        //发送数据
  287.                         if(bAck == 1)
  288.                         {
  289.                                 StopI2C();                    //停止总线
  290.                                 return(0xff);
  291.                         }
  292.                         else
  293.                         {
  294.                                 return(0x03);
  295.                         }                        
  296.                 }
  297.                 else
  298.                 {
  299.                         return(0x02);
  300.                 }
  301.         }
  302.         return(0x01);
  303. }
  304. //读取指定器件的内部指定地址一个字节数据
  305. unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
  306. {
  307.         unsigned char TempData;        
  308.         TempData = 0;
  309.         StartI2C();                                                                        //启动
  310.         SendByte(WChipAdd);                                                    //发送器件地址以及读命令
  311.         if (bAck==1)                                                                            //收到应答
  312.         {
  313.                 SendByte(InterDataAdd);                                        //发送内部子地址
  314.                 if (bAck ==1)
  315.                 {
  316.                         StartI2C();
  317.                         SendByte(RChipAdd);        
  318.                         if(bAck == 1)
  319.                         {
  320.                                 TempData = RevByte();       //接收数据
  321.                                 StopI2C();                  //停止I2C总线
  322.                                 return(TempData);           //返回数据
  323.                         }
  324.                         else
  325.                         {
  326.                                 return(0x03);
  327.                         }        
  328.                 }
  329.                 else
  330.                 {
  331.                         return(0x02);
  332.                 }
  333.         }
  334.         else
  335.         {
  336.                 return(0x01);
  337.         }
  338. }
  339. //报警子函数
  340. void alarm(void)
  341. {
  342.          
  343.          if(getdata>=208.611252)                 //如果当前压力值大于100kpa,
  344.          {
  345.           led=0;
  346.           beep=0;                                                   //则启动报警
  347.          }                          
  348.                         
  349.                
  350.           else
  351.          {
  352.                  led=1;
  353.                  beep=1;
  354.                   
  355.                  }                        //关闭报警
  356.                  
  357.                  
  358.       
  359. }



  360. void main(void)
  361. {
  362.   unsigned int OverCounter = 0;
  363.   unsigned char i;
  364.   bit OverFlg = 0;
  365.   unsigned int temp,ppress = 0;
  366.   float  press;

  367.   while(1)
  368.          
  369.   {
  370.            display( );
  371.             if(getdata>=208.611252);
  372.        TR0=1;         
  373.           getdata=Adc0832(0);
  374.           alarm();
  375.           for(i=0;i<25;i++)
  376.           if(14<getdata<243)                                       //当压力值介于15kpa到115kpa之间时,遵循线性变换
  377.                  {                           
  378.                   int vary=getdata;                                                //y=(115-15)/(243-13)*X+15kpa                        
  379.                         press=((10.0/23.0)*vary)+9.5;                        //测试时补偿值为9.3                                                                                                         
  380.                         temp=(int)(press*10);                  //放大10倍,便于后面的计算
  381.       if(temp != ppress)
  382.       {
  383.         ppress = temp;
  384.         OverFlg = 1;
  385.       }                                                                                            
  386.                         dispbuf[3]=temp/1000;                                     //取压力值百位
  387.                         dispbuf[2]=(temp%1000)/100;                            //取压力值十位
  388.                         dispbuf[1]=((temp%1000)%100)/10;                    //取压力值个位
  389.                         dispbuf[0]=((temp%1000)%100)%10;                        //取压力值十分位
  390.                         display();
  391.       
  392.           }
  393.       }

  394.          }
  395.          
  396.          
  397.          
  398.          
  399.          
  400.          
  401.          
  402.          
  403.                   
  404.   void Time0(void) interrupt 1 using 0
  405. {
  406.                  if(getdata>=208.611252);
  407.         beep=~beep;           //蜂鸣器状态改变
  408.         if( L_count!=0x00 )
  409.         {
  410.            L_count--;           //初值减小
  411.            TH0=H_count;    //高位赋初值
  412.        TL0=L_count;           //低位赋初值
  413.        return;                   //返回主函数
  414.      }else  H_count--;
  415.                
  416.         if( H_count!=0xfc )           //H_count从0xff降到0Xfc,周期结束
  417.         {
  418.            L_count--;
  419.            TH0=H_count;
  420.        TL0=L_count;
  421.        return;
  422.         }
  423.         else
  424.      {
  425.          if(led==0);
  426.         H_count=0xff;
  427.         L_count=0xa0;
  428.         TH0=H_count;
  429.         TL0=L_count;
  430.         beep=1;                          //关闭蜂鸣器
  431.         TR0=0;                         //关闭定时器
  432.      }   
  433. }            
  434.   



复制代码


51hei图片20200323123117.png
51hei图片20200323123149.png
回复

使用道具 举报

ID:592477 发表于 2020-3-22 21:05 | 显示全部楼层
你们写程序能不能搞成模块化设计呢?这么长一段你让人怎么看?
回复

使用道具 举报

ID:255377 发表于 2020-3-23 00:22 来自手机 | 显示全部楼层
思路:按下后跳转独立程序,在这个程序中循环显示。
回复

使用道具 举报

ID:477107 发表于 2020-3-23 09:01 | 显示全部楼层
你最好放一张原理图,别人看起来也方便
回复

使用道具 举报

ID:698701 发表于 2020-3-23 12:30 | 显示全部楼层
zhouchuantao 发表于 2020-3-23 00:22
思路:按下后跳转独立程序,在这个程序中循环显示。

具体的应该怎么写呀?我目前就是困在这一步,c语言学的不扎实,需要一个师傅点拨一下
回复

使用道具 举报

ID:698701 发表于 2020-3-23 12:33 | 显示全部楼层
本帖最后由 华夏哈哈哈 于 2020-3-23 14:56 编辑

目前的代码已修改如下,但是没有按键按下去以后执行的程序,只有打断,我目前想让key1按键按下时数码管显示0000,key2按下时数码管显示0100,希望各位大神给点拨一下


  1. //线性区间标度变换公式:    y=(115-15)/(243-13)*X+15kpa   


  2. #include <AT89X52.h>
  3. #include <intrins.h>
  4. #include <stdio.h>


  5. #define R24C04ADD 0xA1
  6. #define W24C04ADD 0xA0

  7. //ADC0832的引脚
  8. sbit ADCS =P2^2;  //ADC0832 chip seclect
  9. sbit ADDI =P2^4;  //ADC0832 k in
  10. sbit ADDO =P2^4;  //ADC0832 k out
  11. sbit ADCLK =P2^3;  //ADC0832 clock signal

  12. sbit led=P3^7;//led报警灯
  13. sbit beep=P1^7;//报警蜂鸣
  14. sbit a1=P1^0;
  15. sbit a2=P1^1;
  16. sbit a3=P1^2;
  17. sbit a4=P1^3;
  18. sbit key1=P3^0;
  19. sbit key2=P3^1;
  20. sbit c1=P0^0;
  21. sbit c2=P0^1;
  22. sbit c3=P0^2;
  23. sbit c4=P0^3;
  24. sbit c5=P0^4;
  25. sbit c6=P0^5;
  26. sbit c7=P0^6;
  27. sbit c8=P0^7;


  28. sbit SDA = P2 ^ 1;                                //数据线
  29. sbit SCL = P2 ^ 0;                                //时钟线
  30. bit bAck;                                          //应答标志 当bbAck=1是为正确的应答

  31. unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};  //位扫描
  32. unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};  //共阳数码管字段码
  33. unsigned char dispbuf[4];
  34. unsigned int temp;
  35. unsigned char getdata; //获取ADC转换回来的值
  36. unsigned char H_count,L_count;


  37. void delay_us(void)  //12mhz delay 1.01ms
  38. {
  39.    unsigned char x,y,i;
  40.            for(i=0;i<3;i++)  
  41.    x=4;
  42.    while(x--)
  43.   {
  44.        y=30;
  45.        while(y--);
  46.     }
  47. }


  48. void display(void)  //数码管显示函数
  49. {

  50.   char k;
  51.   for(k=0;k<4;k++)
  52.   {
  53.         P1 = dispbitcode[k];                //【【【【问题在这里
  54.   P0 = dispcode[dispbuf[k]];
  55.     if(k==1)          //加上数码管的dp小数点
  56.           P0&=0x7f;
  57.   delay_us();
  58.            }
  59. }          

  60. /************
  61. 读ADC0832函数
  62. ************/

  63. //采集并返回
  64. unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
  65. {
  66.     unsigned char i=0;
  67.     unsigned char j;
  68.     unsigned int dat=0;
  69.     unsigned char ndat=0;

  70.     if(channel==0)channel=2;
  71.     if(channel==1)channel=3;
  72.     ADDI=1;
  73.     _nop_();
  74.     _nop_();
  75.     ADCS=0;//拉低CS端
  76.     _nop_();
  77.     _nop_();
  78.     ADCLK=1;//拉高CLK端
  79.     _nop_();
  80.     _nop_();
  81.     ADCLK=0;//拉低CLK端,形成下降沿1
  82.     _nop_();
  83.     _nop_();
  84.     ADCLK=1;//拉高CLK端
  85.     ADDI=channel&0x1;
  86.     _nop_();
  87.     _nop_();
  88.     ADCLK=0;//拉低CLK端,形成下降沿2
  89.     _nop_();
  90.     _nop_();
  91.     ADCLK=1;//拉高CLK端
  92.     ADDI=(channel>>1)&0x1;
  93.     _nop_();
  94.     _nop_();
  95.     ADCLK=0;//拉低CLK端,形成下降沿3
  96.     ADDI=1;//控制命令结束
  97.     _nop_();
  98.     _nop_();
  99.     dat=0;
  100.     for(i=0;i<8;i++)
  101.     {
  102.         dat|=ADDO;//收数据
  103.         ADCLK=1;
  104.         _nop_();
  105.         _nop_();
  106.         ADCLK=0;//形成一次时钟脉冲
  107.         _nop_();
  108.         _nop_();
  109.         dat<<=1;
  110.         if(i==7)dat|=ADDO;
  111.     }  
  112.     for(i=0;i<8;i++)
  113.     {
  114.         j=0;
  115.         j=j|ADDO;//收数据
  116.         ADCLK=1;
  117.         _nop_();
  118.         _nop_();
  119.         ADCLK=0;//形成一次时钟脉冲
  120.         _nop_();
  121.         _nop_();
  122.         j=j<<7;
  123.         ndat=ndat|j;
  124.         if(i<7)ndat>>=1;
  125.     }
  126.     ADCS=1;//拉低CS端
  127.     ADCLK=0;//拉低CLK端
  128.     ADDO=1;//拉高数据端,回到初始状态
  129.     dat<<=8;
  130.     dat|=ndat;
  131.     return(dat);            //return ad k
  132.                
  133. }


  134. //启动I2C总线,即发送起始条件
  135. void StartI2C()
  136. {
  137.         SDA = 1;                              //发送起始条件数据信号
  138.         _nop_();
  139.         SCL = 1;
  140.         _nop_();                                    //起始建立时间大于4.7us
  141.         _nop_();
  142.         _nop_();
  143.         _nop_();
  144.         _nop_();
  145.         SDA = 0;                              //发送起始信号
  146.         _nop_();
  147.         _nop_();
  148.         _nop_();
  149.         _nop_();
  150.         _nop_();
  151.         SCL = 0;                                //时钟操作
  152.         _nop_();
  153.         _nop_();
  154. }
  155. //结束I2C总线,即发送I2C结束条件
  156. void StopI2C()
  157. {
  158.         SDA = 0;                                //发送结束条件的数据信号
  159.         _nop_();                                      //发送结束条件的时钟信号
  160.         SCL = 1;                                //结束条件建立时间大于4us
  161.         _nop_();
  162.         _nop_();
  163.         _nop_();
  164.         _nop_();
  165.         _nop_();
  166.         SDA = 1;                                //发送I2C总线结束命令
  167.         _nop_();
  168.         _nop_();
  169.         _nop_();
  170.         _nop_();
  171.         _nop_();       
  172. }
  173. //发送一个字节的数据
  174. void        SendByte(unsigned char c)
  175. {
  176.         unsigned char BitCnt;
  177.         for(BitCnt = 0;BitCnt < 8;BitCnt++)                                  //一个字节
  178.                 {
  179.                         if((c << BitCnt)& 0x80) SDA = 1;                   //判断发送位
  180.                         else        SDA = 0;
  181.                         _nop_();
  182.                         SCL = 1;                              //时钟线为高,通知从机开始接收数据
  183.                         _nop_();
  184.                         _nop_();
  185.                         _nop_();
  186.                         _nop_();
  187.                         _nop_();
  188.                         SCL = 0;
  189.                 }
  190.         _nop_();
  191.         _nop_();
  192.         SDA = 1;                                                //释放数据线,准备接受应答位
  193.         _nop_();
  194.         _nop_();
  195.         SCL = 1;
  196.         _nop_();
  197.         _nop_();
  198.         _nop_();
  199.         if(SDA == 1) bAck =0;
  200.         else bAck = 1;                                                //判断是否收到应答信号
  201.         SCL = 0;
  202.         _nop_();
  203.         _nop_();
  204. }
  205. //接收一个字节的数据
  206. unsigned char RevByte()
  207. {
  208.         unsigned char retc;
  209.         unsigned char BitCnt;
  210.         retc = 0;
  211.         SDA = 1;
  212.         for(BitCnt=0;BitCnt<8;BitCnt++)
  213.         {
  214.                 _nop_();
  215.                 SCL = 0;                                            //置时钟线为低,准备接收
  216.                 _nop_();
  217.                 _nop_();
  218.                 _nop_();
  219.                 _nop_();
  220.                 _nop_();
  221.                 SCL = 1;                                            //置时钟线为高使得数据有效
  222.                 _nop_();
  223.                 _nop_();
  224.                 retc = retc << 1;                                    //左移补零
  225.                 if (SDA == 1)
  226.                 retc = retc + 1;                                     //当数据为1则收到的数据+1
  227.                 _nop_();
  228.                 _nop_();
  229.         }
  230.         SCL = 0;
  231.         _nop_();
  232.         _nop_();
  233.         return(retc);                                   //返回收到的数据
  234.                
  235. }

  236. //WChipAdd:写器件地址;RChipAdd:读器件地址;InterAdd:内部地址;如写正确则返回数据,
  237. //否则返回对应错误步骤序号
  238. //向指定器件的内部指定地址发送一个指定字节
  239. unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
  240. {
  241.         StartI2C();                                                                                      //启动总线
  242.         SendByte(WChipAdd);                                                        //发送器件地址以及命令
  243.         if (bAck==1)                                                                                          //收到应答
  244.         {
  245.                 SendByte(InterAdd);                                                                //发送内部子地址
  246.                 if (bAck ==1)
  247.                 {
  248.                         SendByte(WIICData);                                                        //发送数据
  249.                         if(bAck == 1)
  250.                         {
  251.                                 StopI2C();                    //停止总线
  252.                                 return(0xff);
  253.                         }
  254.                         else
  255.                         {
  256.                                 return(0x03);
  257.                         }                       
  258.                 }
  259.                 else
  260.                 {
  261.                         return(0x02);
  262.                 }
  263.         }
  264.         return(0x01);
  265. }
  266. //读取指定器件的内部指定地址一个字节数据
  267. unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
  268. {
  269.         unsigned char TempData;       
  270.         TempData = 0;
  271.         StartI2C();                                                                        //启动
  272.         SendByte(WChipAdd);                                                    //发送器件地址以及读命令
  273.         if (bAck==1)                                                                            //收到应答
  274.         {
  275.                 SendByte(InterDataAdd);                                        //发送内部子地址
  276.                 if (bAck ==1)
  277.                 {
  278.                         StartI2C();
  279.                         SendByte(RChipAdd);       
  280.                         if(bAck == 1)
  281.                         {
  282.                                 TempData = RevByte();       //接收数据
  283.                                 StopI2C();                  //停止I2C总线
  284.                                 return(TempData);           //返回数据
  285.                         }
  286.                         else
  287.                         {
  288.                                 return(0x03);
  289.                         }       
  290.                 }
  291.                 else
  292.                 {
  293.                         return(0x02);
  294.                 }
  295.         }
  296.         else
  297.         {
  298.                 return(0x01);
  299.         }
  300. }
  301. //报警子函数
  302. void alarm(void)
  303. {
  304.           
  305.          if(getdata>=208.611252)                 //如果当前压力值大于100kpa,
  306.          {
  307.           led=0;
  308.           beep=0;                                                   //则启动报警
  309.          }                          
  310.                         
  311.                
  312.           else
  313.          {
  314.                  led=1;
  315.                  beep=1;
  316.                   
  317. }                        //关闭报警
  318. }
  319.        
  320.        


  321. void main(void) //主程序
  322. {
  323.   unsigned int OverCounter = 0;
  324.   unsigned char i;
  325.   bit OverFlg = 0;
  326.   unsigned int temp,ppress = 0;
  327.   float  press;

  328.   while(1)
  329.          
  330.   {

  331.           display( );
  332.           if((key1==0)||(key2==0))break;   //////////////此处为加的打断
  333.           if
  334.             if(getdata>=208.611252);
  335.        TR0=1;          
  336.           getdata=Adc0832(0);
  337.           alarm();
  338.           for(i=0;i<25;i++)
  339.           if(14<getdata<243)                                       //当压力值介于15kpa到115kpa之间时,遵循线性变换
  340.                  {                            
  341.                   int vary=getdata;                                                //y=(115-15)/(243-13)*X+15kpa                       
  342.                         press=((10.0/23.0)*vary)+9.5;                        //测试时补偿值为9.3                                                                                                          
  343.                         temp=(int)(press*10);                  //放大10倍,便于后面的计算
  344.       if(temp != ppress)
  345.       {
  346.         ppress = temp;
  347.         OverFlg = 1;
  348.       }                                                                                           
  349.                         dispbuf[3]=temp/1000;                                     //取压力值百位
  350.                         dispbuf[2]=(temp%1000)/100;                            //取压力值十位
  351.                         dispbuf[1]=((temp%1000)%100)/10;                    //取压力值个位
  352.                         dispbuf[0]=((temp%1000)%100)%10;                        //取压力值十分位
  353.                         display();
  354.           }
  355.           }
  356.               }
  357.          

  358.                    
  359.   void Time0(void) interrupt 1 using 0          //中断,改变蜂鸣器声音
  360. {
  361.                  if(getdata>=208.611252);
  362.         beep=~beep;           //蜂鸣器状态改变
  363.         if( L_count!=0x00 )
  364.         {
  365.            L_count--;           //初值减小
  366.            TH0=H_count;    //高位赋初值
  367.        TL0=L_count;           //低位赋初值
  368.        return;                   //返回主函数
  369.      }else  H_count--;
  370.                
  371.         if( H_count!=0xfc )           //H_count从0xff降到0Xfc,周期结束
  372.         {
  373.            L_count--;
  374.            TH0=H_count;
  375.        TL0=L_count;
  376.        return;
  377.         }
  378.         else
  379.      {
  380.          if(led==0);
  381.         H_count=0xff;
  382.         L_count=0xa0;
  383.         TH0=H_count;
  384.         TL0=L_count;
  385.         beep=1;                          //关闭蜂鸣器
  386.         TR0=0;                         //关闭定时器
  387.      }   
  388. }       
复制代码


回复

使用道具 举报

ID:698701 发表于 2020-3-23 12:34 | 显示全部楼层
key按下时的截图:
51hei图片20200323123149.png
51hei图片20200323123117.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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