找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2447|回复: 4
打印 上一主题 下一主题
收起左侧

AT89C51单片机程序与仿真错误

[复制链接]
跳转到指定楼层
楼主
ID:160550 发表于 2017-1-11 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
能不能帮忙看一下,,谢谢大家了仿真软件是proteus,要求是实现超过上限温度与下限温度时警报电机运行

51.rar

28.6 KB, 下载次数: 7

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161477 发表于 2017-1-12 16:04 | 只看该作者
kile文件打不开
回复

使用道具 举报

板凳
ID:160550 发表于 2017-1-12 19:44 | 只看该作者
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define ulint unsigned long int
  7. uchar code table0[]={                                                                                  //欢迎界面
  8.                      0xa0,0x57,0x65,0x6c,0x63,0x6f,0x6d,0x65,
  9.                                          0xa0,0x74,0x6f,0xa0,0x75,0x65,0x73,0xa0,
  10.                                          0xa0,0xa0,0x74,0x68,0x65,0x72,0x6d,0x6f,
  11.                                          0x6d,0x65,0x74,0x65,0x72,0x21,0xa0,0xa0};
  12. uchar table1[]={0x6d,0x61,0x78,0x3a,0x00,0x00,0x00,0xa0,         //存储报警值
  13.                 0x6d,0x69,0x6e,0x3a,0x00,0x00,0x00,};
  14. uchar table2[]={                                                                                  //存储温度
  15.                 0x54,0x4d,0x50,0x54,0x3a,
  16.                                 0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x43};
  17. uchar code table3[]={                                                                          //提醒设定报警值
  18.                 0xa0,0x50,0x6c,0x65,0x61,0x73,0x65,0xa0,
  19.                                 0xa0,0x63,0x68,0x61,0x72,0x67,0x65,0xa0,
  20.                                 0xa0,0xa0,0xa0,0x79,0x6f,0x75,0x72,0xa0,
  21.                                 0x63,0x61,0x72,0x64,0x21,0xa0,0xa0,0xa0};

  22. uchar table4[]={                                                                             //输入界面
  23.                 0x50,0x6c,0x65,0x61,0x73,0x65,0xa0,0x69,
  24.                                 0x6e,0x70,0x75,0x74,0x3a};
  25. sbit E=P3^7;
  26. sbit RW=P3^6;
  27. sbit RS=P3^5;
  28. sbit flag=P1^7;
  29. sbit dec=P3^0;
  30. sbit inc=P3^1;
  31. sbit ok_max=P3^2;
  32. sbit ok_min=P3^4;
  33. sbit out=P2^1;
  34. sbit DQ=P2^3;
  35. sbit beep=P2^2;
  36. uchar p,tflag;
  37. uint tvalue;

  38. /*****************延时函数**********************/

  39. void delay_18B20(unsigned int i)
  40. {
  41.         while(i--);
  42. }

  43. /**********ds18b20初始化函数**********************/

  44. void Init_DS18B20(void)
  45. {
  46.          unsigned char x=0;
  47.          DQ = 1;          //DQ复位
  48.          delay_18B20(8);  //稍做延时
  49.          DQ = 0;          //单片机将DQ拉低
  50.          delay_18B20(80); //精确延时 大于 480us
  51.          DQ = 1;          //拉高总线
  52.          delay_18B20(14);
  53.          x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  54.          delay_18B20(20);
  55. }

  56. /***********ds18b20读一个字节**************/  

  57. unsigned char ReadOneChar(void)
  58. {
  59.         unsigned char i=0;
  60.         unsigned char dat = 0;
  61.         for (i=8;i>0;i--)
  62.          {
  63.                   DQ = 0; // 给脉冲信号
  64.                   dat>>=1;
  65.                   DQ = 1; // 给脉冲信号
  66.                   if(DQ)
  67.                   dat|=0x80;
  68.                   delay_18B20(4);
  69.          }
  70.          return(dat);
  71. }

  72. /*************ds18b20写一个字节****************/  

  73. void WriteOneChar(unsigned char dat)
  74. {
  75.          unsigned char i=0;
  76.          for (i=8; i>0; i--)
  77.          {
  78.                   DQ = 0;
  79.                  DQ = dat&0x01;
  80.             delay_18B20(5);
  81.                  DQ = 1;
  82.             dat>>=1;
  83. }
  84. }

  85. /**************读取ds18b20当前温度************/

  86. unsigned int ReadTemperature(void)
  87. {        unsigned char tl,th;
  88.           float t;
  89.         Init_DS18B20();
  90.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  91.         WriteOneChar(0x44);         // 启动温度转换

  92.         delay_18B20(80);       // 这个延时很重要
  93.         Init_DS18B20();
  94.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  95.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  96.         delay_18B20(80);

  97.         tl=ReadOneChar();            //读取温度值低位
  98.         th=ReadOneChar();                   //读取温度值高位
  99.         tvalue=th;
  100.     tvalue<<=8;
  101.     tvalue=tvalue|tl;
  102.     if(tvalue<0x0fff)                   //判断正负
  103.       {
  104.            tflag=0;                                                //符号标记位
  105.            table2[5]=0xa0;                                //存储'+'号
  106.            }
  107.     else
  108.       {
  109.            tvalue=~tvalue+1;                         //负数取反加一
  110.          tflag=1;
  111.              table2[5]=0x2d;                        //存储'-'号
  112.        }
  113.      t=tvalue*(0.0625);
  114.          tvalue=t*100;                                   //温度值扩大100倍,精确到2位小数
  115.         return(tvalue);
  116. }

  117. /*************处理当前温度******************/
  118. void show1(void);

  119. void DeelTemperatre(uint t)
  120. {
  121.      table2[6]=t/10000+0x30;
  122.          if(table2[6]==0x30)                           //百位为0,就消隐
  123.             {
  124.                  table2[6]=0xa0;
  125.                 }
  126.          table2[7]=t%10000/1000+0x30;                //十位
  127.          table2[8]=t%1000/100+0x30;                        //个位
  128.          table2[10]=t%100/10+0x30;                        //小数位
  129.          table2[11]=t%10+0x30;  
  130. }

  131. /****************警告函数*******************/
  132. void warn(uchar s,uchar led)
  133. {
  134.             uchar i,j,k;i=s;
  135.          P2=~(led);
  136.          for(k=0;k<20;k++)
  137.          {for(j=0;j<200;j++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
  138.           {
  139.             delay_18B20(i);      //参数决定发声的频率,估算值,可以自行更改参数并
  140.             beep=!beep;
  141.           }
  142.           }
  143.          P2=0xff;
  144.          beep=1;
  145. }

  146. /******************报警处理函数**************/

  147. void deal(uint fuzhi)
  148.   {
  149.    uchar t1,th,tl,i;
  150.    char t1_c,th_c,tl_c,th_s,tl_s;
  151.    t1=fuzhi/100;
  152.    if(table2[5]==0x2d)                                                         //存储实际温度换成有符号数实际温度
  153.     {                                                                                         //符号位为'-'换成负数
  154.           t1_c=t1;
  155.           t1_c=~t1_c;
  156.         }
  157.    else
  158.     {
  159.           t1_c=t1;
  160.         }
  161.    
  162.    th=(table1[5]-0x30)*10+(table1[6]-0x30);                        //存储上限温度换成有符号数温度
  163.    if(table1[4]==0x2d)
  164.     {
  165.           th_c=th;
  166.           th_c=~th_c;
  167.           th_s=th_c-2;                                                                          //设置第二高温度报警线
  168.         }
  169.    else
  170.     {
  171.           th_c=th;
  172.           th_s=th_c-2;
  173.         }
  174.    
  175.    tl=(table1[13]-0x30)*10+(table1[14]-0x30);                   //存储下限温度换成有符号数温度
  176.    if(table1[12]==0x2d)
  177.     {
  178.           tl_c=tl;
  179.           tl_c=~tl_c;
  180.           tl_s=tl_c+2;
  181.         }
  182.    else
  183.     {
  184.           tl_c=tl;
  185.           tl_s=tl_c+2;                                                                                //设置低二道报警线温度
  186.         }


  187.    if(t1_c>=th_s&&t1_c<th_c)                                                         //大于第二高上限值小于最高上限,进行预报警
  188.     {
  189.           warn(20,0x80);                                                                         //控制预报警声音,点亮指示灯
  190.           out=1;
  191.         }
  192.    else if(t1_c>=th_c)                                                                         //高于最高上限
  193.     {
  194.           warn(40,0x40);                                                                         //先报警
  195.           out=0;                                                                                         //自动开发动机
  196.         }
  197.    else if(t1_c<=tl_s&&t1_c>tl_c)                                                  //进行预报警
  198.     {
  199.           warn(20,0x20);
  200.           out=1;
  201.         }
  202.    else if(t1_c<=tl_c)
  203.     {
  204.           warn(40,0x10);
  205.           out=0;
  206.         }
  207.         else
  208.          {
  209.            i=5;                                                                                                  //利用显示延时
  210.            while(i--)
  211.            {
  212.             DeelTemperatre(ReadTemperature());
  213.         show1();
  214.                 out=1;
  215.            }
  216.          }
  217.   }

  218. /*************************LCD显示****************************/

  219. /**********************延时函数***********************/
  220. void delay0()
  221. {
  222.   uint a,b;
  223.   for(a=0;a<600;a++)
  224.   for(b=0;b<600;b++);
  225. }

  226. void delay1()
  227. {
  228. uint e;
  229. for(e=100;e>0;e--);
  230. }
  231. void delay2()
  232. {
  233. uint a,b;
  234. for(a=0;a<100;a++)
  235. for(b=0;b<100;b++);
  236. }

  237. /***********************判忙函数*********************/
  238. void busy()
  239. {
  240. do
  241. {
  242.   P1=0xff;
  243.   RS=0;
  244.   RW=1;
  245.   E=0;
  246.   E=1;
  247. }while(flag);
  248. }

  249. /*************功能:写函数**********************************/
  250. /*********入口参数:con=1代表写指令,con=0代表写数据,com代表数据
  251. /*********出口参数:无;
  252. **********************************************************/                          
  253. void write(uchar con,uchar com)
  254. {
  255.   busy();
  256.   RS=con;
  257.   RW=0;
  258.   E=1;
  259.   P1=com;
  260.   E=0;
  261. }

  262. /***********************lcd初始化**********************/
  263. void init()
  264. {
  265.   write(0,0x01);
  266.   write(0,0x38);
  267.   write(0,0x0c);
  268. }

  269. /***********************显示欢迎界面********************/
  270. void show0()
  271. {
  272.   uint i;
  273.   write(0,0x80);
  274.   for(i=0;i<16;i++)
  275.   write(1,table0[i]);
  276.   busy();
  277.   write(0,0xc0);
  278.   for(i=16;i<32;i++)
  279.   write(1,table0[i]);
  280.   busy();
  281.   delay0();
  282. }

  283. /***********************显示温度界面*********************/
  284. void show1()
  285. {
  286.   uint i,j;
  287.   write(0,0x01);
  288.   write(0,0x80);
  289.   for(i=0;i<15;i++)
  290.   write(1,table1[i]);
  291.   busy();
  292.   write(0,0xc0);
  293.   for(j=0;j<13;j++)
  294.   write(1,table2[j]);
  295.   busy();
  296.   delay0();
  297. }

  298. /*************************改值函数******************************/
  299. void input()
  300. {
  301.   uchar i,sign=0,k=0;
  302.   char t=0,z=0;
  303.   ok_max=1;                                      //上限值确认键
  304.   ok_min=1;                                          //下限值确认键
  305.   write(0,0x01);                          //清屏指令
  306.   while(ok_max==1&&ok_min==1)  //当确认键按下,结束循环
  307.   {
  308.      inc=1;
  309.          dec=1;
  310.          if(inc==0)                                   //加一键按下
  311.          {
  312.           delay2();                                   //去抖动
  313.           if(inc==0)
  314.            {
  315.             if(t<99)                           //设定最高上限为99
  316.                 {
  317.                 if(t>=0)                           //对符号数进行处理,大于0,保持不变
  318.              {
  319.                   t++;
  320.                   sign=0xa0;                        //温度显示标志位
  321.                   }
  322.                 else{
  323.                    if(t==-1)                         //小于0,首先判断是否等于-1,因为再加一为0,消‘-’符号位
  324.                       {
  325.                           t++;
  326.                           k--;                                 //k为负数的绝对值
  327.                           sign=0xa0;
  328.                           }
  329.                         else{                                  //不为-1,前面要加符号位‘-’
  330.                              t++;
  331.                              k--;
  332.                              sign=0x2d;
  333.                                  }
  334.                     }
  335.                   }
  336.                   else ; //大于99不再增加
  337.             }
  338.          }
  339.          if(dec==0)                                            //减一确认键按下
  340.          {
  341.            delay2();                                                //去抖动
  342.            if(dec==0)
  343.            {
  344.             if(t<=-20);                                     //设定下限为-20
  345.             else{
  346.               if(t<=0)
  347.                  {t--;
  348.                           k++;
  349.                   sign=0x2d;
  350.                      }
  351.               else
  352.                {
  353.                         t--;
  354.                         sign=0xa0;
  355.                     }
  356.              }
  357.            }
  358.          }
  359.    if(t<=0){z=t;t=k;}                           //t<=0,取绝对值
  360.    write(0,0x80);
  361.    for(i=0;i<13;i++)
  362.    write(1,table4[i]);                                //显示提醒输入界面
  363.    busy();
  364.    write(0,0xc0);
  365.    write(1,sign);                                        //将设定的值显示
  366.    write(1,t/100%10+0x30);
  367.    write(1,t/10%10+0x30);
  368.    write(1,t%10+0x30);
  369.    write(1,0x43);
  370.    busy();
  371.    if(z<0)t=z;
  372.    delay1();
  373.    }
  374.    if(t<0)t=~t+1;
  375.    p=t;
  376.    if(ok_max==0)                                                //存储上限值
  377.    {
  378.      table1[6]=p%10+0x30;
  379.      table1[5]=p/10%10+0x30;
  380.      table1[4]=sign;}
  381.    else{                                                                //存储下限值
  382.                    table1[14]=p%10+0x30;
  383.         table1[13]=p/10%10+0x30;
  384.         table1[12]=sign;
  385.    }
  386.   }

  387. /******************外部中断0函数*******************/
  388. void Exter1(void) interrupt 2
  389. {
  390.   EX1=0;
  391.   input();
  392.   EX1=1;
  393. }


  394. void main()
  395. {
  396.   uchar l,i=5;
  397.   init();
  398.   show0();
  399.   delay2();
  400.   input();
  401.   EA=1;
  402.   EX1=1;
  403.   IT1=1;
  404.   while(1)
  405.   {
  406.    out=1;                                 //电动机开关关闭
  407.    DeelTemperatre(ReadTemperature());         //去温度值
  408.    show1();
  409.    deal(ReadTemperature());                                 //温度处理
  410.    while(i--)                                                         //利用显示延时
  411.     {
  412.           DeelTemperatre(ReadTemperature());
  413.       show1();
  414.       deal(ReadTemperature());
  415.         }
  416.   }
  417. }     
复制代码
  
回复

使用道具 举报

地板
ID:160550 发表于 2017-1-12 19:45 | 只看该作者

程序在这里,不知道哪里出了错,这是原理图

0.png (65.6 KB, 下载次数: 4)

0.png
回复

使用道具 举报

5#
ID:161477 发表于 2017-1-16 21:37 | 只看该作者
你在proteus仿真温度检测得到么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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