找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的钢丝绳检测Proteus仿真+程序

[复制链接]
跳转到指定楼层
楼主
钢丝绳检测仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #include  <math.h>    //Keil library  
  5. #include  <stdlib.h>  //Keil library  
  6. #define uchar unsigned char //定义一下方便使用
  7. #define uint  unsigned int
  8. #define ulong unsigned long


  9. sbit RS = P2^0;
  10. sbit RW = P2^1;
  11. sbit EN = P2^2;         
  12. sbit BF = P0^7;           //忙碌标志位,,将BF位定义为P0.7引脚

  13. sbit ADOUT=P1^7;        //ADC        数据输入
  14. sbit ADCLK=P1^6;                //ADC  CLK
  15. sbit ADCS=P1^5;                //ADC  CS

  16. sbit key1=P3^6;   //定义按键
  17. sbit spk=P3^7;   //定义蜂鸣器
  18. sbit led=P3^5;   //定义led
  19. uchar count;
  20. uint DATA1=0;                                //采集值

  21. /*************延时函数*************/
  22. void delay(uint n)
  23. {  uint x,y;
  24.    for(x=n;x>0;x--)
  25.        for(y=121;y>0;y--);
  26. }

  27. /***********判忙函数***********/
  28. bit LCD_Check_Busy()
  29. {
  30.         bit result;
  31.         RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
  32.     RW=1;
  33.     EN=1;        //E=1,才允许读写
  34.     _nop_();   //空操作
  35.     _nop_();
  36.     _nop_();
  37.     _nop_();   //空操作四个机器周期,给硬件反应时间       
  38.     result=BF;  //将忙碌标志电平赋给result
  39.    EN=0;         //将E恢复低电平
  40.    return result;
  41. }
  42. /***********写入命令函数***********/
  43. void write_com(uchar com)
  44. {
  45. while(LCD_Check_Busy()); //忙则等待
  46. RS=0;
  47. RW=0;
  48. EN=1;
  49. P0= com;
  50. _nop_();
  51. EN=0;
  52. }
  53. /**********写入数据函数**********/
  54. void write_dat(uchar dat)
  55. {
  56. while(LCD_Check_Busy()); //忙则等待
  57. RS=1;
  58. RW=0;
  59. EN=1;
  60. P0= dat;
  61. _nop_();
  62. EN=0;
  63. }
  64. /*******写入字符函数***********/
  65. void LCD_Write_Char(uchar x,uchar y,uchar dat)
  66. {   
  67. if (y == 0)
  68.   {    write_com(0x80 + x);    }   
  69. else
  70.   {    write_com(0xC0 + x);    }      
  71. write_dat( dat);
  72. }
  73. /******写入字符串函数***********/
  74. void Write_String(uchar x,uchar y,uchar *s)
  75. {   
  76. while (*s)
  77.   {   
  78.   LCD_Write_Char(x,y,*s);   
  79.   s++;
  80.   x++;   
  81.   }
  82. }
  83. /*****初始化函数******/
  84. void LCD_Init()
  85. {
  86.    write_com(0x38); /*显示模式设置*/
  87.    delay(5);
  88.    write_com(0x06);/*显示光标移动设置*/
  89.    delay(5);
  90.    write_com(0x0C); /*显示开及光标设置*/
  91.    write_com(0x01);  /*显示清屏*/
  92.    }
  93. /*----------------ADC采样函数程序-----------------------------------------------*/
  94. void adc0831()                  
  95. {
  96. uchar i;
  97. DATA1=1;
  98. _nop_(); _nop_(); _nop_();
  99. ADCS=0;
  100. _nop_(); _nop_(); _nop_();
  101. ADCLK=1;
  102. _nop_(); _nop_(); _nop_();
  103. ADCLK=0;
  104. _nop_(); _nop_(); _nop_();
  105. ADCLK=1;
  106. _nop_(); _nop_(); _nop_();
  107. ADCLK=0;
  108. for(i=0;i<8;i++)
  109. {
  110.   DATA1<<=1;
  111.   if(ADOUT)
  112.   {
  113.    DATA1++;
  114.   }
  115.   ADCLK=1;
  116.   _nop_();  _nop_();  _nop_();
  117.   ADCLK=0;
  118.   _nop_();  _nop_();  _nop_();
  119. }
  120. ADCS=1;
  121. _nop_(); _nop_();
  122. // return DATA1;       
  123. }               
  124. ///***********************************************************************
  125. void lcd1()
  126. {
  127. //        uint e;
  128. //        uchar e0,e1,e2,e3;

  129. if(DATA1>340)
  130. {
  131.          Write_String(0,1,"   OFF Normal  ");
  132.         spk=0;
  133.         led=0;
  134. }
  135. else
  136. {
  137.         Write_String(0,1,"    Normal     ");
  138.         spk=1;
  139.         led=1;
  140. }
  141. /*
  142.                  e=DATA1;
  143.                 e0 = e/1000  +48;
  144.           e1 = (e/100)%10+48;
  145.           e2 = (e/10)%10+48;
  146.                 e3 = e%10+48;

  147.           Write_String(8,1,"Q=");    //
  148.                 LCD_Write_Char(10,1,e0);
  149.                 LCD_Write_Char(11,1,e1);
  150.                 LCD_Write_Char(12,1,e2);
  151.                 LCD_Write_Char(13,1,e3);
  152.          Write_String(14,1,"Kg");
  153. */


  154. }

  155. void key()
  156. {
  157.         if(key1==0)                 //kay5  +1         
  158.         {
  159.         delay(1);         //延时消抖
  160.         if(key1==0)
  161.         while(!key1);//等待松手       
  162. //        KA=!KA;
  163.         }
  164. }

  165. /*----------------主函数-----------------------------------------------*/
  166. int main(void)
  167. {

  168.         LCD_Init();                                 //初始化液晶屏       
  169.         delay(10);                                        //延时用于稳定,可以去掉
  170.         write_com(0x01);                        //清屏
  171.         Write_String(0,0," Welcome to use ");   //写入的是设备信息
  172.         Write_String(0,1,"      ");   //写入第二行信息,可以写自己的名字什么的
  173.   delay(500);
  174.         //write_com(0x01);                        //清屏
  175.         while (1)
  176.         {                       
  177.                 adc0831();  //质量采集
  178.                 key();               
  179.                 lcd1();
  180.                 delay(100);               //延时,两次发射之间要至少有10ms间隔
  181.            }
  182. }
复制代码

所有资料51hei提供下载:
C052931.zip (189.81 KB, 下载次数: 24)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:528640 发表于 2019-6-4 00:15 | 只看该作者
非常有哟有用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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