找回密码
 立即注册

QQ登录

只需一步,快速开始

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

压力传感器控制电机 ADC0832单片机程序及Proteus仿真原理图

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



单片机源程序如下:
  1. #include <REG52.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char         //宏定义方便以后用
  4. #define uint unsigned int  
  5. #define ulong unsigned long


  6. //定义ADC0832的借接口
  7. sbit ADC_CS   = P2^4;
  8. sbit ADC_Clk = P2^5;
  9. sbit ADC_DATI = P2^6;
  10. sbit ADC_DATO = P2^7;

  11. //定义LED的指示灯接口
  12. sbit LED_RED = P1^6;
  13. sbit LED_YELLOW = P1^7;

  14. //LCD port
  15. sbit LcdRs= P2^0;
  16. sbit LcdRw= P2^1;
  17. sbit LcdEn= P2^2;
  18. sfr  DBPort= 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

  19. //L298N   电机控制接口
  20. sbit IN1= P1^2;
  21. sbit IN2= P1^3;


  22. //向LCD写入命令或数据************************************************************
  23. #define LCD_COMMAND                        0      // Command
  24. #define LCD_DATA                        1      // Data
  25. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  26. #define LCD_HOMING                  0x02      // 光标返回原点


  27. //设置显示模式************************************************************
  28. #define LCD_SHOW                        0x04    //显示开
  29. #define LCD_HIDE                        0x00    //显示关         

  30. #define LCD_CURSOR                        0x02         //显示光标
  31. #define LCD_NO_CURSOR                0x00    //无光标                     

  32. #define LCD_FLASH                        0x01    //光标闪动
  33. #define LCD_NO_FLASH                0x00    //光标不闪动

  34. //内部等待函数**************************************************************************
  35. unsigned char LCD_Wait(void)
  36. {
  37.   LcdRs=0;
  38.   LcdRw=1;        _nop_();
  39.   LcdEn=1;        _nop_();
  40.   //while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
  41.   //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
  42.   //实际硬件时打开此语句
  43.   LcdEn=0;
  44.   return DBPort;               
  45. }

  46. void LCD_Write(bit style, unsigned char input)
  47. {
  48.   LcdEn=0;
  49.   LcdRs=style;
  50.   LcdRw=0;                _nop_();
  51.   DBPort=input;        _nop_();//注意顺序
  52.   LcdEn=1;                _nop_();//注意顺序
  53.   LcdEn=0;                _nop_();
  54.   LCD_Wait();        
  55. }

  56. void LCD_SetDisplay(unsigned char DisplayMode)
  57. {
  58.   LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        
  59. }

  60. //设置输入模式************************************************************
  61. #define LCD_AC_UP                        0x02
  62. #define LCD_AC_DOWN                        0x00      // default

  63. #define LCD_MOVE                        0x01      // 画面可平移
  64. #define LCD_NO_MOVE                        0x00      //default

  65. void LCD_SetInput(unsigned char InputMode)
  66. {
  67.   LCD_Write(LCD_COMMAND, 0x04|InputMode);
  68. }


  69. //初始化LCD************************************************************
  70. void LCD_Initial()
  71. {
  72.   LcdEn=0;
  73.   LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
  74.   LCD_Write(LCD_COMMAND,0x38);
  75.   LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  76.   LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  77.   LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
  78. }

  79. //************************************************************************
  80. void GotoXY(unsigned char x, unsigned char y)
  81. {
  82.   if(y==0)
  83.     LCD_Write(LCD_COMMAND,0x80|x);
  84.   if(y==1)
  85.     LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  86. }

  87. void Print(unsigned char *str)         //在LCD上显示数据,内部调用
  88. {
  89.   while(*str!='\0')
  90.   {
  91.     LCD_Write(LCD_DATA,*str);
  92.     str++;
  93.   }
  94. }

  95. void LCD_Print(unsigned char x, unsigned char y, unsigned char *str) //指定的位置打印指定数据
  96. {
  97.   GotoXY(x,y);
  98.   Print(str);
  99. }

  100. void LCD_Print_num(unsigned char x, unsigned char y,long int temp_num) //指定的位置显示数值
  101. {
  102.   uchar temp_tab[7]=0;
  103.   long int num=0;
  104.   uchar i=0;
  105.   num=temp_num;
  106.   GotoXY(x,y);
  107.   if(num<0)
  108.   {
  109.     num=0-num;
  110.     LCD_Write(LCD_DATA,'-');
  111.   }
  112.   temp_tab[0]=num/1000000%10+0x30;
  113.   temp_tab[1]=num/100000%10+0x30;
  114.   temp_tab[2]=num/10000%10+0x30;
  115.   temp_tab[3]=num/1000%10+0x30;
  116.   temp_tab[4]=num/100%10+0x30;  
  117.   temp_tab[5]=num/10%10+0x30;
  118.   temp_tab[6]=num%10+0x30;
  119.   for(i=0;i<7;i++)
  120.   {
  121.     if(temp_tab[i]!=0x30)break;
  122.   }
  123.   
  124.   if(i==7)
  125.   {
  126.     LCD_Write(LCD_DATA,0x30);
  127.   }
  128.   else
  129.   {
  130.     while(i<7)
  131.     {
  132.       LCD_Write(LCD_DATA,temp_tab[i]);
  133.       i++;
  134.     }
  135.   }
  136. }

  137. /****************************************************************************
  138. 函数功能:AD转换子程序
  139. ****************************************************************************/

  140. uchar adc0832(uchar temp_CH)
  141. {         
  142.   uchar temp_data = 0x00;      //AD值
  143.   uchar i,temp_ad_val1,temp_ad_val2;
  144.   temp_ad_val2 = 0x00;
  145.   temp_ad_val1 = 0x00;
  146.   ADC_Clk = 0;       //初始化
  147.   ADC_DATI = 1;
  148.   _nop_();
  149.   ADC_CS = 0;
  150.   _nop_();
  151.   ADC_Clk = 1;
  152.   _nop_();
  153.   
  154.   if ( temp_CH == 0x00 )      //通道选择
  155.   {
  156.     ADC_Clk = 0;
  157.     ADC_DATI = 1;      //通道0的第一位
  158.     _nop_();
  159.     ADC_Clk = 1;
  160.     _nop_();
  161.     ADC_Clk = 0;
  162.     ADC_DATI = 0;      //通道0的第二位
  163.     _nop_();
  164.     ADC_Clk = 1;
  165.     _nop_();
  166.   }
  167.   else
  168.   {
  169.     ADC_Clk = 0;
  170.     ADC_DATI = 1;      //通道1的第一位
  171.     _nop_();
  172.     ADC_Clk = 1;
  173.     _nop_();
  174.     ADC_Clk = 0;
  175.     ADC_DATI = 1;      //通道1的第二位
  176.     _nop_();
  177.     ADC_Clk = 1;
  178.     _nop_();
  179.   }
  180.   ADC_Clk = 0;
  181.   ADC_DATI = 1;
  182.   for( i = 0;i < 8;i++ )      //前读取8位的值
  183.   {
  184.     _nop_();
  185.     temp_ad_val2 <<= 1;
  186.     ADC_Clk = 1;
  187.     _nop_();
  188.     ADC_Clk = 0;
  189.     if (ADC_DATO)
  190.       temp_ad_val2 |= 0x01;
  191.     else
  192.       temp_ad_val2 |= 0x00;
  193.   }
  194.   for (i = 0; i < 8; i++)      //后读取8位的值
  195.   {
  196.     temp_ad_val1 >>= 1;
  197.     if (ADC_DATO)
  198.       temp_ad_val1 |= 0x80;
  199.     else
  200.       temp_ad_val1 |= 0x00;
  201.     _nop_();
  202.     ADC_Clk = 1;
  203.     _nop_();
  204.     ADC_Clk = 0;
  205.   }
  206.   if (temp_ad_val2 == temp_ad_val1)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  207.     temp_data = temp_ad_val1;
  208.   _nop_();
  209.   ADC_CS = 1;        //释放ADC0832
  210.   ADC_DATO = 1;
  211.   ADC_Clk = 1;
  212.   return temp_data;
  213. }

  214. //*****************************
  215. //**显示数据
  216. //*****************************
  217. void Display_data(void)
  218. {
  219.         ulong temp=0,temp2=0;


  220.         temp=adc0832(0);
  221.         temp=temp*500/255;//单位放大了100倍
  222.         temp2=temp/100;
  223.         if(temp2)
  224.         {
  225.                 LCD_Print_num(4,1,temp2);
  226.                 Print(".");
  227.                 temp2=temp%100;
  228.                 LCD_Print_num(6,1,temp2);
  229.         }
  230.         else
  231.         {
  232.                 LCD_Print(4,1,"0.");
  233.                 temp2=temp%100;
  234.                 LCD_Print_num(6,1,temp2);
  235.         }
  236.         Print("pa");
  237.         Print("      ");
  238.         
  239.   
  240.   
  241. }

  242. // 电机正转
  243. void come()
  244. {
  245.   IN1=1;
  246.   IN2=0;
  247. }

  248. //电机倒转
  249. void back()
  250. {
  251.   IN1=0;
  252.   IN2=1;
  253. }

  254. //电机停止
  255. void stop()
  256. {
  257.   IN1=0;
  258. ……………………

  259. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码与Proteus仿真下载:
压力传感器控制电机ADC0832.zip (118.62 KB, 下载次数: 70)

一 综述
近几年随着畜牧业的快速发展及社会各界对畜牧业安全质量的重点关注,畜牧业产品的追踪溯源已经成为学者们的研究热点,为建立完善的畜牧业追溯体系需要从源头着手,在养殖环节建立起信息化监控系统对养殖场的各环节进行实时监测,并采集每一头牲畜的全部生命信息进行识别、分析及处理。尽管目前已存在一些畜牧业养殖场的追溯系统对养殖场进行实时监控,并实现了牲畜养殖的信息化管理,但由于系统的设计及部署实施中存在着一些弊端限制了畜牧业养殖场发展规模的扩大及信息采集工作的效率,近而大大影响了企业的经济效益。

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:884739 发表于 2024-3-13 22:31 | 只看该作者
第一张图的程序和仿真有么
回复

使用道具 举报

板凳
ID:489394 发表于 2024-3-22 02:22 | 只看该作者
没有文件啊
回复

使用道具 举报

地板
ID:1023151 发表于 2024-3-22 14:43 | 只看该作者
周翔宇 发表于 2024-3-13 22:31
第一张图的程序和仿真有么

有的,你下载看就可以了
回复

使用道具 举报

5#
ID:1023151 发表于 2024-3-22 14:44 | 只看该作者

有的,你下载看就可以了
回复

使用道具 举报

6#
ID:1114159 发表于 2024-3-26 20:31 | 只看该作者
讲得很清晰
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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