找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

求大神帮忙看看单片机代码哪里错了,万分感谢,比较急

查看数: 1864 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-6-25 19:36

正文摘要:

#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar temp,num,klnum; uchar code table[]={"18B20 OKTL"}; char shangxiaxian[2]={-10,10}; char a; ...

回复

ID:789718 发表于 2020-6-26 20:48
随风飘远 发表于 2020-6-26 10:08
软件会提示错误在哪一行,其实 还是要自己学会去调试,刚开始先写一些简单一点的代码会容易一点

请问您有时间帮我看一下这个错误怎么改吗?
ID:319023 发表于 2020-6-26 10:08
软件会提示错误在哪一行,其实 还是要自己学会去调试,刚开始先写一些简单一点的代码会容易一点
ID:213173 发表于 2020-6-26 06:32
错误很多,基本都是抄写错误。大小写错误、中文符号错误、丢分号,缺空格等等。现已通过编译。
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar temp,num,klnum;
  6. uchar code table[]={"18B20 OKTL"};
  7. char shangxiaxian[2]={-10,10};
  8. char a;
  9. sbit k1=P1^0;
  10. sbit k2=P1^1;
  11. sbit k3=P1^2;
  12. sbit k4=P1^3;
  13. sbit LCD_RW=P2^5;
  14. sbit lcdrs=P2^6;
  15. sbit lcden=P2^7;
  16. sbit Beep=P3^0;
  17. sbit led=P3^1;
  18. sbit DQ=P3^7;    /*液晶显示屏的延时程序*/
  19. void delay(uint z)
  20. {
  21.         uint x,y;
  22.         for(x=z;x>0;x--)
  23.                 for(y=110;y>0;y--);
  24. }
  25. /*温度传感器的延时程序*/
  26. void Delay1(uint y)
  27. {
  28.         uint x;
  29.         for( ;y>0; y--)
  30.         {
  31.                 for(x=110;x>0;x--);
  32.         }
  33. }
  34. /*蜂鸣器,18B20写数据函数的延时程序*/
  35. void delay2(uint a)
  36. {
  37.         while(--a);
  38. }
  39. /*温度传感器初始化函数*/
  40. void init_18B20()
  41. {
  42.         DQ=1;
  43.         delay2(8);
  44.         DQ=0;
  45.         delay2(90);
  46.         DQ=1;
  47.         _nop_();
  48.         _nop_();
  49.         delay2(100);
  50.         DQ=1;
  51. }
  52. /*温度传感器写字节命令函数*/
  53. void DS18B20xiezijie(uchar date)
  54. {
  55.         uchar i;
  56.         for(i=0;i<8;i++)
  57.         {
  58.                 DQ=0;                                      //在写入一位数据之前先把总线拉低
  59.                 DQ=date&0x01;                   //写入一个数据,从最低位开始写
  60.                 delay2(5);                               //延时
  61.                 DQ=1;                                      //将总线拉高,等待第二位数据写入
  62.                 date>>=1;                              //右移一位,写入第二位数据
  63.         }
  64. }                                                          /*温度传感器读字节命令函数*/
  65. uchar DS18B20duzijie()
  66. {
  67.         uchar i,dat=0;
  68.         DQ=1;
  69.         _nop_();
  70.         for(i=0;i<8;i++)
  71.         {
  72.                 DQ=0;                  //先将总线拉低
  73.                 _nop_();
  74.                 _nop_();
  75.                 dat>>=1;
  76.                 DQ=1;                                      //然后释放总线
  77.                 _nop_();                         //延时一下等待数据稳定
  78.                 _nop_();                        
  79.                 if(DQ)
  80.                 dat|=0x80;                             //读取数据,从最低位开始读取
  81.                 delay2(30);                             //读取完之后等待一下,再接着读取下一个数
  82.                 DQ=1;
  83.         }
  84.         return dat;                        //返回所读到的温度
  85. }                                                        /*写温度转换命令函数*/
  86. void DS18B20ChangTemp()
  87. {
  88.         init_18B20();
  89.         Delay1(1);
  90.         DS18B20xiezijie(0xcc);   //跳过ROM操作命令
  91.         DS18B20xiezijie(0x44);   //温度转换命令
  92. }                                                          /*读温度命令函数*/
  93. void DS18B20ReadTempCom()
  94. {
  95.         init_18B20();
  96.         Delay1(1);
  97.         DS18B20xiezijie(0xcc);   //跳过ROM操作命令
  98.         DS18B20xiezijie(0xbe);   //发送读取温度命令
  99. }                                                          /*读温度函数*/
  100. int DS18B20ReadTemp()
  101. {
  102.         int temp=0;
  103.         uchar tmh,tml;
  104.         DS18B20ChangTemp();           //先写入转换命令
  105.         DS18B20ReadTempCom();     //然后等待转换完成后发送读取温度命令
  106.         tml=DS18B20duzijie();             //读取温度值共16位,先读低字节
  107.         tmh=DS18B20duzijie();           //再读高字节
  108.         temp=tmh;
  109.         temp<<=8;
  110.         temp|=tml;
  111.         return temp;                              /*液晶屏写指令函数*/
  112. }
  113. void write_com(uchar com)
  114. {
  115.         lcdrs=0;
  116.         lcden=0;
  117.         LCD_RW=0;
  118.         P0=com;
  119.         delay(5);
  120.         lcden=1;
  121.         delay(5);
  122.         lcden=0;
  123. }                                                          /*液晶屏写指令函数*/
  124. void write_com2(int com)
  125. {
  126.         lcdrs=0;
  127.         LCD_RW=0;
  128.         lcden=0;
  129.         delay(5);
  130.         P0=com;
  131.         delay(5);
  132.         lcden=1;
  133.         delay(5);
  134.         lcden=0;
  135.         P0=(com&0x0f)<<4;
  136.         delay(5);
  137.         lcden=1;
  138.         delay(5);
  139.         lcden=0;
  140. }                                                          /*液晶屏写数据命令函数*/
  141. void write_data(char date)
  142. {
  143.         lcdrs=1;
  144.         LCD_RW=0;
  145.         lcden=0;
  146.         P0=date;
  147.         delay(5);
  148.         lcden=1;
  149.         delay(5);
  150.         lcden=0;
  151.         lcdrs=1;
  152.         LCD_RW=0;
  153.         lcden=0;
  154.         P0=(date&0x0f)<<4;       //一次写入4位
  155.         delay(5);
  156.         lcden=1;
  157.         delay(5);
  158.         lcden=0;
  159. }                                                          /*液晶屏初始化函数*/
  160. void init()
  161. {
  162.         lcden=0;
  163.         write_com(0x28);
  164.         write_com2(0x28);
  165.         write_com2(0x0c);
  166.         write_com2(0x06);
  167.         write_com2(0x01);
  168.         write_com2(0x80);
  169. }                                                          /*报警上下线处理函数*/
  170. void write_hl(uchar add,char date)
  171. {
  172.         uchar bai,shi,ge;
  173.         if(date<0){date=-date;}
  174.         bai=date/100;
  175.         shi=date%100/10;
  176.         ge=date%100%10;
  177.         write_com2(0x80+0x40+add);
  178.         write_data(0x30+bai);
  179.         write_data(0x30+shi);
  180.         write_data(0x30+ge);
  181. }                                                        /*报警上下线处理函数*/
  182. void write_hl1(uchar add,char date)
  183. {
  184.         uchar bai,shi,ge;
  185.         if(date<0){date=-date;}
  186.         bai=date/100;
  187.         shi=date%100/10;
  188.         ge=date%100%10;
  189.         write_com2(0x80+add);
  190.         write_data(0x30+bai);
  191.         write_data(0x30+shi);
  192.         write_data(0x30+ge);
  193. }                                                        /*液晶屏显示函数,显示温度值*/
  194. void Lcdxianshi(int temp)
  195. {
  196.         uchar sz[4]={0,0,0,0};
  197.         unsigned char datas[]={0,0,0,0,0}; //定义数组
  198.         float tp;
  199.         if(temp<0)                //当温度值为负数
  200.         {
  201.                 write_com2(0x80+0x40);    //写地址80表示初始地址
  202.                 write_data('-');          //显示负
  203.                 temp=temp-1; //因为读取的温度是实际温度的补码,所以减一,再取反求出原码
  204.                 temp=~temp;
  205.                 tp=temp;
  206.                 temp=tp*0.0625*100+0.5;
  207.         }
  208.         else
  209.         {
  210.                 write_com2(0x80+0x40);  //写地址80表示初始地址
  211.                 write_data('+');                    //显示正
  212.                 tp=temp;  //因为数据处理有小数点,所以将温度赋给一个浮点型变量,如果温度是正,那么正数的原码就是补码本身
  213.                 temp=tp*0.0625*100+0.5;
  214.         }
  215.         datas[0]=temp/10000;                       //百位
  216.         datas[1]=temp%10000/1000;          //十位
  217.         datas[2]=temp%1000/100;       //个位
  218.         datas[3]=temp%100/10;                          //小数
  219.         write_com2(0x80+0x40+1);
  220.         write_data('0'+datas[0]);
  221.         write_com2(0x80+0x40+2);
  222.         write_data('0'+datas[1]);
  223.         write_com2(0x80+0x40+3);
  224.         write_data('0'+datas[2]);
  225.         write_com2(0x80+0x40+4);
  226.         write_data('.');
  227.         write_com2(0x80+0x40+5);
  228.         write_data('0'+datas[3]);
  229.         a=(datas[0]*100+datas[1]*10+datas[2]);  //用于温度的比较值
  230.         write_hl(13,shangxiaxian[1]);  //显示报警上限
  231.         write_hl1(13,shangxiaxian[0]);      //显示报警下限
  232. }                                                                         /*按键处理函数,用于设置温度报警值*/
  233. void key()
  234. {
  235.         if(k1==0)
  236.         {
  237.                 delay(5);
  238.                 if(k1==0)  //温度报警下限加
  239.                 {
  240.                         shangxiaxian[0]++;
  241.                         if(shangxiaxian[0]==127)
  242.                                 shangxiaxian[0]=126;
  243.                         write_hl1(13,shangxiaxian[0]);
  244.                 }
  245.         }
  246.         if(k2==0)  //温度报警下限减
  247.         {
  248.                 delay(5);
  249.                 if(k2==0)
  250.                 {
  251.                         shangxiaxian[0]--;
  252.                         if(shangxiaxian[0]==-56)
  253.                                 shangxiaxian[0]=-55;
  254.                         write_hl1(13,shangxiaxian[0]);
  255.                 }
  256.         }
  257.         if(k3==0)  //温度报警上限加
  258.         {
  259.                 delay(5);
  260.                 if(k3==0)
  261.                 {
  262.                         shangxiaxian[1]++;
  263.                         if(shangxiaxian[1]==127)
  264.                                 shangxiaxian[1]=126;
  265.                         write_hl(13,shangxiaxian[1]);
  266.                 }
  267.         }
  268.         if(k4==0)  //温度报警上限减
  269.         {
  270.                 delay(5);
  271.                 if(k4==0)
  272.                 {
  273.                         shangxiaxian[1]--;
  274.                         if(shangxiaxian[1]==-56)
  275.                                 shangxiaxian[1]=-55;
  276.                         write_hl(13,shangxiaxian[1]);
  277.                 }
  278.         }
  279. }
  280. void main()
  281. {
  282.         int b;
  283.         init();
  284.         led=0;
  285.         for(num=0;num<11;num++)   //让液晶屏显示“18B20 OK TL”
  286.         {
  287.                 write_data(table[num]);
  288.                 delay(20);
  289.         }
  290.         write_com2(0x80+0x40+9);
  291.         write_data('T');
  292.         write_com2(0x80+0x40+10);
  293.         write_data('H');
  294.         while(1)
  295.         {
  296.                 key();
  297.                 Lcdxianshi(DS18B20ReadTemp());
  298.                 delay(100);
  299.                 if(shangxiaxian[0]<0)
  300.                 {
  301.                         write_com2(0x80+12);
  302.                         write_data('-');
  303.                 }
  304.                 else
  305.                 {
  306.                         write_com2(0x80+12);
  307.                         write_data('+');
  308.                 }
  309.                 if(shangxiaxian[1]<0)
  310.                 {
  311.                         write_com2(0x80+0x40+12);
  312.                         write_data('-');
  313.                 }
  314.                 else
  315.                 {
  316.                         write_com2(0x80+0x40+12);
  317.                         write_data('+');
  318.                 }
  319.                 if(a>shangxiaxian[1])    //判断温度值与报警值的大小
  320.                 {
  321.                         write_com2(0x80+0x40+6);
  322.                         write_data('<');
  323.                         write_com2(0x80+0x40+7);
  324.                         write_data('L');
  325.                 }
  326.                 if(a>=shangxiaxian[0]&&a<=shangxiaxian[1]) //判断温度值与报警值的大小
  327.                 {
  328.                         write_com2(0x80+0x40+6);
  329.                         write_data(' ');
  330.                         write_com2(0x80+0x40+7);
  331.                         write_data('!');
  332.                 }
  333.                 if(a>shangxiaxian[0]||a>shangxiaxian[1])  //如果温度值在报警值之外,蜂鸣器响
  334.                 {
  335.                         for(b=0;b<1000;b++)
  336.                         {
  337.                                 Beep=1;led=1;
  338.                                 delay2(20);
  339.                                 Beep=0;led=0;
  340.                                 delay(20);
  341.                         }
  342.                 }
  343.         }
  344. }

复制代码

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

Powered by 单片机教程网

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