微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于中断0的问题

关于中断0的问题

时间:10-02 整理:3721RD 点击:
各位大侠,帮我看看这个程序有什么问题?如果使用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("\n");                                                //输出换行
  129.                         while(!TI);
  130.                         TI=0;
  131.                         delay(1000);                                                //延迟一段时间
  132.         }
  133.         
  134. }

复制代码




上面的是用延迟函数写的,系统运行正常,但是后面的是用中断写的,串口无输出
/*
晶振:11.0592MHz
将DS18B20采集到的数据输入在1602液晶上面
*/

  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=0x21;                //中断1工作在模式2  ,中断0工作在16位定时器0
  94.         TH1=0xfd;                //9600bps
  95.         TL1=0xfd;
  96.         TH0=(65536-50000)/256;
  97.         TL0=(65536-50000)%256;
  98.         TR0=1;
  99.         ET0=1;
  100.         TR1=1;                        //打开定时器1
  101.         REN=1;                        //允许串口接收数据
  102.         SM0=0;                        //10位异步传输
  103.         SM1=1;
  104.         EA=1;                        //开总中断
  105.         ES=1;                        //关串口中断

  106. }


  107. void serial(uchar byte)                 //串口发送一个字节
  108. {
  109.         SBUF=byte;
  110.         while(!TI);
  111.         TI=0;
  112. }

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

  143.         }
  144.         
  145. }


  146. void timer0() interrupt 1
  147. {
  148.         TH0=(65536-50000)/256;
  149.         TL0=(65536-50000)%256;
  150.         flag++;
  151.         if(flag==20)
  152.         {
  153.                 flag1=1;
  154.         }
  155. }

复制代码


定时中断进去了吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top