登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看7374|回1|收藏
楼主 ID:197252 只看他
2018-11-5 16:08
花了一个星期做的单片机结课作业,代码注释清晰,可读性高。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
QQ截图20181105160318.png

单片机源程序如下:

代码:

  1. /******************************************************************
  2. * @file                                                chengxu.c
  3. *        @author                                        16自动化1班       
  4. *        @version                                终结版
  5. *        @date                                                2018年11月5号
  6. ******************************************************************
  7. *        @instructions       
  8. *        该程序实现的是对烟雾浓度的检测以百分制形式将采集到的值显示在数
  9. *        码管上,使用的是AT89系列单片机做处理器,模数转换芯片采用AD0809
  10. *        芯片。(该程序运用在大多模拟量采集转数字的传感器)
  11. ******************************************************************/


  12. #include <reg52.h>                                                                                                                                                                                                                                     //头文件
  13. #define uchar unsigned char                                                                                                                                                                                                                                  //宏定义无符号字符型
  14. #define uint  unsigned  int                                                                                                                                                                                                                                   //宏定义无符号整型
  15. code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};                         //显示段码 数码管字跟
  16. uchar wei[4]={0XEf,0XDf,0XBf,0X7f};                                                                                                                                                                                                  //位控制码
  17. sbit ST=P3^0;                                                                                                                                                                                                                                                                                   //A/D启动转换信号
  18. sbit OE=P3^1;                                                                                                                                                                                                                                                                                   //数据输出允许信号
  19. sbit EOC=P3^2;                                                                                                                                                                                                                                                                                  //A/D转换结束信号
  20. sbit CLK=P3^3;                                                                                                                                                                                                                                                                                  //时钟脉冲
  21. sbit Beep=P3^7;                                                                                                                                                                                                                                                                                 //蜂鸣器IO口
  22. uint z,x,c,v,AD0809, date;                                                                                                                                                                                                                                        //定义数据类型(全局变量)


  23. /******************************************************************
  24. us延时函数,具体延时情况跟单片机选择的晶振有关
  25. ******************************************************************/
  26. void delayus(uint i)
  27. {
  28.   while(i--);
  29. }


  30. /******************************************************************
  31. ms延时函数,具体延时情况跟单片机选择的晶振有关
  32. ******************************************************************/
  33. void delayms(uchar t)
  34. {
  35.   uchar i,j;
  36.    for(i=0;i<t;i++)
  37.    {
  38.             for(j=13;j>0;j--);
  39.                  { ;
  40.                  }
  41.    }
  42. }

  43. /*************************************************************************
  44.                                                                                                         蜂鸣器报警函数
  45. **************************************************************************/
  46. void Subeep()
  47. {
  48.         int i;
  49.         for(i=0;i<10;i++)
  50.         {
  51.                 Beep=~Beep;                                                                                                                                                                                                                                                                                //蜂鸣器输出
  52.                 delayus(12);                                                                                                                                                                                                                                                                        //如要改变发声改变延时即可
  53.         }
  54. }


  55. /**********************************************************************
  56.                                                                                                                 数码管动态扫描
  57. *********************************************************************/
  58. void xianshi()                                                                                                                                                                                                                                                                                 //显示函数
  59. {
  60. uint z,x,c,v;
  61.   z=date/1000;                                                                                                                                                                                                                                                                                 //求百分数十位
  62.   x=date%1000/100;                                                                                                                                                                                                                                                                 //求百分数的个位
  63.   c=date%100/10;                                                                                                                                                                                                                                                                         //求百分数小数点后一位
  64.   v=date%10;                                                                                                                                                                                                                                                                                         //求百分数小数点的后两位

  65.          if(z>5)                                                                                                                                                                                                                                                                                                //如果烟雾浓度大于50%蜂鸣器发出报警声
  66.          {
  67.                 Subeep();                                                                     //调用蜂鸣器报警函数
  68.          }
  69.          
  70.          if(z==10)                                                                                                                                                                                                                                                                                        //判断z的值是否是10
  71.          {
  72.                  z=9;                                                                                                                                                                                            //z赋值9
  73.                  x=9;                                                                                                                                                                                                                                                                                                        //x赋值9
  74.                  c=9;                                                                                                                                                                                                                                                                                                        //c赋值9
  75.                  v=9;                                                                                                                                                                                                                                                                                                        //v赋值9
  76.          }
  77.                         P2=0XFF;                                                                                                                                                                                                                                                                                //P2IO初始化
  78.                         P0=seg7code[z];                                                                                                                                                                                                                                                        //百分数十位赋值给数码管断码
  79.                         P2=wei[0];                                                                                                                                                                                                                                                                        //选择百分数十位显示
  80.                         delayms(3);                                                                                                                                                                                                                                                                        //显示3ms
  81.                         P2=0XFF;                                                                                                                                                                                                                                                                          //消影
  82.                         P0=seg7code[x]&0x7f;                                                                                                                                                                                                                                //百分数个位赋值给数码管断码和小数点断码
  83.                         P2=wei[1];                                                                                                                                                                                                                                                                        //选择百分数个位显示
  84.                         delayms(3);                                                                                                                                                                                                                                                                        //显示3ms
  85.                         P2=0XFF;                                                                                                                                                                                                                                                                          //消影
  86.                         P0=seg7code[c];                                                                                                                                                                                                                                                        //百分数小数点后一位赋值给数码管断码
  87.                         P2=wei[2];                                                                                                                                                                                                                                                                        //选择百分数小数点后两位显示
  88.                         delayms(3);                                                                                                                                                                                                                                                                        //显示3ms
  89.                         P2=0XFF;                                                                                                                                                                                                                                                                          //消影
  90.                         P0=seg7code[v];                                                                                                                                                                                                                                                        //百分数小数点后两位赋值给数码管断码
  91.                         P2=wei[3];                                                                                                                                                                                                                                                                        //选择百分数小数点后两位显示
  92.                         delayms(4);                                                                                                                                                                                                                                                                 //显示3ms
  93.                         P2=0XFF;                                                                                                                                                                                                                                                                                //消影
  94.   }
  95. /*************************************************************************
  96.                                 CLK振荡信号       
  97. **************************************************************************/
  98. void timer0( ) interrupt 1                                                                                                                                                                                                                                 //定时器0工作方式1
  99. {

  100. TH0=(65536-2)/256;                                                                                                                                                                                                                                                          //重装计数初值
  101. TL0=(65536-2)%256;                                                                                                                                                                                                                                                          //重装计数初值
  102. CLK=!CLK;                                                                                                                                                                                                                                                                                                  //取反
  103. }



  104. /*************************************************************************
  105.                                 主函数       
  106. **************************************************************************/
  107. void main()
  108. {
  109. TMOD=0X01;                                                                                                                                                                                                                                                                                          //定时器中断0

  110. CLK=0;                                                                                                                                                                                                                                                                                                          //脉冲信号初始值为0
  111. TH0=(65536-2)/256;                                                                                                                                                                                                                                                          //定时时间高八位初值
  112. TL0=(65536-2)%256;                                                                                                                                                                                                                                                          //定时时间低八位初值
  113. EA=1;                                                                                                                                                                                                                                                                                                                  //开CPU中断
  114. ET0=1;                                                                                                                                                                                                                                                                                                          //开T/C0中断
  115. TR0=1;
  116. while(1)                                                                                                                                                                                                                                                                                                   //无限循环
  117.         {
  118.         ST=0;                                                                                                                                                                                                                                                                                                                //使采集信号为低
  119.         ST=1;                                                                                                                                                                                                                                                                                                                //开始数据转换
  120.         ST=0;                                                                                                                                                                                                                                                                                                                //停止数据转换
  121.         while(!EOC);                                                                                                                                                                                                                                                                                //等待数据转换完毕
  122.         OE=1;                                                                                                                                                                                                                                                                                                                //允许数据输出信号
  123.         AD0809=P1;                                                                                                                                                                                                                                                                            //读取数据
  124.         OE=0;                                                                                                                                                                                                                                                                                                                //关闭数据输出允许信号
  125.         if(AD0809>=251)                                                                                                                                                                                                                                                                        //电压显示不能超过5V
  126.         AD0809=250;
  127.         date=AD0809*40;                                                                                                                                                                                                                                                                        //数码管显示的数据值,其中40为采集数据的毫安值
  128.         xianshi();                                                                                                                                                                                                                                                                                        //数码管显示函数
  129.     }
  130. }       
0.png

所有资料51hei提供下载:
基于51单片机的烟雾传感器的检测.zip (462.62 KB)
(下载次数: 65, 2018-11-5 16:01 上传)

下载积分: 黑币 -5




沙发 ID:698810 只看他
2020-2-26 22:26
很不错吗,学习了,感谢分享

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版