关于中断0的问题

2019-07-15 18:27发布

各位大侠,帮我看看这个程序有什么问题?如果使用delay函数,串口能输出18B20的数据,但是当使用中断0时,串口无输出,这个是为什么?
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int



  6. sbit dq=P1^7;

  7. uchar t0;
  8. uchar flag,flag1;
  9. uint temp1;

  10. void delay(uint t)                 
  11. {
  12.         uchar i;
  13.         for(t;t--;t>0)
  14.         {
  15.                 for(i=105;i--;i>0);
  16.         }
  17. }

  18. void delay1us(uint t)
  19. {
  20.         while(t--);        
  21. }

  22. //18b20初始化函数
  23. void init_dq()
  24. {
  25.         uchar x;
  26.         dq=1;                       //将信号拉高
  27.         delay1us(4);              //delay 57u
  28.         dq=0;
  29.         delay1us(60);           //信号拉低603us
  30.         dq=1;
  31.         delay1us(4);       //释放信号57us
  32.         x=dq;                       //读取总线值,如果i=0,初始化成功,反之失败
  33.         delay1us(10);           //  107ms
  34. }

  35. //写一个字节数据到ds18b20
  36. void write_dq(uchar wdata)
  37. {
  38.         uchar i;
  39.         for(i=0;i<8;i++)
  40.         {
  41.                 dq=0;                                //拉低总线
  42.                 dq=wdata&0x01;                //写入一位数据
  43.                 delay1us(3);                        //持续40us左右
  44.                 dq=1;                                //释放总线
  45.                 wdata>>=1;                        //数据左移一位        
  46.         }
  47.         delay1us(3);
  48. }  

  49. //从ds18b20读一个字节数据
  50. uchar read_dq(void)
  51. {
  52.         uchar i;
  53.         uint rdata;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 dq=0;          //拉低总线
  57.                 rdata>>=1;        //将总线读取数据依次左移一位
  58.                 dq=1;                //释放总线
  59.                 if(dq)
  60.                 {
  61.                         rdata|=0x80;  //如果dq=1,最高位置1,反之,则跳过
  62.                 }
  63.                 delay1us(4);        //延迟57us左右
  64.         }
  65.         return(rdata);        
  66. }
  67. //读取温度值
  68. uint readtemp(void)
  69. {
  70.         float temp;
  71.         uchar a,b;
  72.         uint c;
  73.         //启动转换
  74.         init_dq();
  75.         write_dq(0xcc);  //跳过读取序列号操作
  76.         write_dq(0x44);         //启动温度转换
  77.         delay1us(200);
  78.         //读取温度
  79.         init_dq();
  80.         write_dq(0xcc);  //跳过读取序列号操作
  81.         write_dq(0xbe);  //开启读取命令
  82.         a=read_dq();         //读取低八位数据
  83.         b=read_dq();         //读取高八位数据
  84.         c=b;                         //将高八位赋值到c
  85.         c<<=8;                 //移动高八位
  86.         c=c|a;          //将低八位输入到c
  87.         temp=c*0.0625; //将c转换成温度值
  88.         temp1=temp*100+0.5; //将温度值放大100倍

  89.         return (temp1);


  90. }



  91. void init_serial()
  92. {

  93.         TMOD=0x20;                //中断1工作在模式2  ,中断0工作在16位定时器0
  94.         TH1=0xfd;                //9600bps
  95.         TL1=0xfd;
  96.         TR1=1;                        //打开定时器1
  97.         REN=1;                        //允许串口接收数据
  98.         SM0=0;                        //10位异步传输
  99.         SM1=1;
  100.         EA=1;                        //开总中断
  101.         ES=1;                        //关串口中断

  102. }


  103. void serial(uchar byte)                 //串口发送一个字节
  104. {
  105.         SBUF=byte;
  106.         while(!ti);
  107.         TI=0;
  108. }

  109. void main()
  110. {
  111.         init_serial();                                                  //初始化串口
  112.         init_dq();                                                          //初始化18b20
  113.         while(1)
  114.         {
  115.                         readtemp();                                                   //读取温度值
  116.                         TI=1;
  117.                         printf("The temperature is: ");                //串口输出The temperature is:
  118.                         while(!TI);
  119.                         TI=0;
  120.                         serial(temp1/10000+'0');                        //输出第1个字节并转换成ASC码
  121.                         serial(temp1%10000/1000+'0');                //输出第2个字节并转换成ASC码
  122.                         serial(temp1%1000/100+'0');                        //输出第3个字节并转换成ASC码
  123.                         serial('.');                                                //输出小数点
  124.                         serial(temp1%100/10+'0');                        //输出小数点后1位
  125.                         serial(temp1%10+'0');                                //输出小数点后2位
  126.                         serial('C');        
  127.                         TI=1;
  128.                         printf(" ");                                                //输出换行
  129.                         while(!TI);
  130.                         TI=0;
  131.                         delay(1000);                                                //延迟一段时间
  132.         }
  133.         
  134. }
复制代码




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。