欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2764|回復: 5
收起左側

壓力傳感器控制電機 ADC0832單片機程序及Proteus仿真原理圖

[復制鏈接]
ID:1023151 發表于 2023-5-28 15:49 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
51hei.gif

單片機源程序如下:
  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, 下載次數: 71)

一 綜述
近幾年隨著畜牧業的快速發展及社會各界對畜牧業安全質量的重點關注,畜牧業產品的追蹤溯源已經成為學者們的研究熱點,為建立完善的畜牧業追溯體系需要從源頭著手,在養殖環節建立起信息化監控系統對養殖場的各環節進行實時監測,并采集每一頭牲畜的全部生命信息進行識別、分析及處理。盡管目前已存在一些畜牧業養殖場的追溯系統對養殖場進行實時監控,并實現了牲畜養殖的信息化管理,但由于系統的設計及部署實施中存在著一些弊端限制了畜牧業養殖場發展規模的擴大及信息采集工作的效率,近而大大影響了企業的經濟效益。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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
第一張圖的程序和仿真有么

有的,你下載看就可以了
回復

使用道具 舉報

ID:1023151 發表于 2024-3-22 14:44 | 顯示全部樓層

有的,你下載看就可以了
回復

使用道具 舉報

ID:1114159 發表于 2024-3-26 20:31 | 顯示全部樓層
講得很清晰
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表