仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <REG52.H>
- #include <intrins.h>
- #define uchar unsigned char //宏定義方便以后用
- #define uint unsigned int
- #define ulong unsigned long
- //定義ADC0832的借接口
- sbit ADC_CS = P2^4;
- sbit ADC_Clk = P2^5;
- sbit ADC_DATI = P2^6;
- sbit ADC_DATO = P2^7;
- //定義LED的指示燈接口
- sbit LED_RED = P1^6;
- sbit LED_YELLOW = P1^7;
- //LCD port
- sbit LcdRs= P2^0;
- sbit LcdRw= P2^1;
- sbit LcdEn= P2^2;
- sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口
- //L298N 電機控制接口
- sbit IN1= P1^2;
- sbit IN2= P1^3;
- //向LCD寫入命令或數據************************************************************
- #define LCD_COMMAND 0 // Command
- #define LCD_DATA 1 // Data
- #define LCD_CLEAR_SCREEN 0x01 // 清屏
- #define LCD_HOMING 0x02 // 光標返回原點
- //設置顯示模式************************************************************
- #define LCD_SHOW 0x04 //顯示開
- #define LCD_HIDE 0x00 //顯示關
- #define LCD_CURSOR 0x02 //顯示光標
- #define LCD_NO_CURSOR 0x00 //無光標
- #define LCD_FLASH 0x01 //光標閃動
- #define LCD_NO_FLASH 0x00 //光標不閃動
- //內部等待函數**************************************************************************
- unsigned char LCD_Wait(void)
- {
- LcdRs=0;
- LcdRw=1; _nop_();
- LcdEn=1; _nop_();
- //while(DBPort&0x80);//在用Proteus仿真時,注意用屏蔽此語句,在調用GotoXY()時,會進入死循環,
- //可能在寫該控制字時,該模塊沒有返回寫入完備命令,即DBPort&0x80==0x80
- //實際硬件時打開此語句
- LcdEn=0;
- return DBPort;
- }
- void LCD_Write(bit style, unsigned char input)
- {
- LcdEn=0;
- LcdRs=style;
- LcdRw=0; _nop_();
- DBPort=input; _nop_();//注意順序
- LcdEn=1; _nop_();//注意順序
- LcdEn=0; _nop_();
- LCD_Wait();
- }
- void LCD_SetDisplay(unsigned char DisplayMode)
- {
- LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
- }
- //設置輸入模式************************************************************
- #define LCD_AC_UP 0x02
- #define LCD_AC_DOWN 0x00 // default
- #define LCD_MOVE 0x01 // 畫面可平移
- #define LCD_NO_MOVE 0x00 //default
- void LCD_SetInput(unsigned char InputMode)
- {
- LCD_Write(LCD_COMMAND, 0x04|InputMode);
- }
- //初始化LCD************************************************************
- void LCD_Initial()
- {
- LcdEn=0;
- LCD_Write(LCD_COMMAND,0x38); //8位數據端口,2行顯示,5*7點陣
- LCD_Write(LCD_COMMAND,0x38);
- LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動
- }
- //************************************************************************
- void GotoXY(unsigned char x, unsigned char y)
- {
- if(y==0)
- LCD_Write(LCD_COMMAND,0x80|x);
- if(y==1)
- LCD_Write(LCD_COMMAND,0x80|(x-0x40));
- }
- void Print(unsigned char *str) //在LCD上顯示數據,內部調用
- {
- while(*str!='\0')
- {
- LCD_Write(LCD_DATA,*str);
- str++;
- }
- }
- void LCD_Print(unsigned char x, unsigned char y, unsigned char *str) //指定的位置打印指定數據
- {
- GotoXY(x,y);
- Print(str);
- }
- void LCD_Print_num(unsigned char x, unsigned char y,long int temp_num) //指定的位置顯示數值
- {
- uchar temp_tab[7]=0;
- long int num=0;
- uchar i=0;
- num=temp_num;
- GotoXY(x,y);
- if(num<0)
- {
- num=0-num;
- LCD_Write(LCD_DATA,'-');
- }
- temp_tab[0]=num/1000000%10+0x30;
- temp_tab[1]=num/100000%10+0x30;
- temp_tab[2]=num/10000%10+0x30;
- temp_tab[3]=num/1000%10+0x30;
- temp_tab[4]=num/100%10+0x30;
- temp_tab[5]=num/10%10+0x30;
- temp_tab[6]=num%10+0x30;
- for(i=0;i<7;i++)
- {
- if(temp_tab[i]!=0x30)break;
- }
-
- if(i==7)
- {
- LCD_Write(LCD_DATA,0x30);
- }
- else
- {
- while(i<7)
- {
- LCD_Write(LCD_DATA,temp_tab[i]);
- i++;
- }
- }
- }
- /****************************************************************************
- 函數功能:AD轉換子程序
- ****************************************************************************/
- uchar adc0832(uchar temp_CH)
- {
- uchar temp_data = 0x00; //AD值
- uchar i,temp_ad_val1,temp_ad_val2;
- temp_ad_val2 = 0x00;
- temp_ad_val1 = 0x00;
- ADC_Clk = 0; //初始化
- ADC_DATI = 1;
- _nop_();
- ADC_CS = 0;
- _nop_();
- ADC_Clk = 1;
- _nop_();
-
- if ( temp_CH == 0x00 ) //通道選擇
- {
- ADC_Clk = 0;
- ADC_DATI = 1; //通道0的第一位
- _nop_();
- ADC_Clk = 1;
- _nop_();
- ADC_Clk = 0;
- ADC_DATI = 0; //通道0的第二位
- _nop_();
- ADC_Clk = 1;
- _nop_();
- }
- else
- {
- ADC_Clk = 0;
- ADC_DATI = 1; //通道1的第一位
- _nop_();
- ADC_Clk = 1;
- _nop_();
- ADC_Clk = 0;
- ADC_DATI = 1; //通道1的第二位
- _nop_();
- ADC_Clk = 1;
- _nop_();
- }
- ADC_Clk = 0;
- ADC_DATI = 1;
- for( i = 0;i < 8;i++ ) //前讀取8位的值
- {
- _nop_();
- temp_ad_val2 <<= 1;
- ADC_Clk = 1;
- _nop_();
- ADC_Clk = 0;
- if (ADC_DATO)
- temp_ad_val2 |= 0x01;
- else
- temp_ad_val2 |= 0x00;
- }
- for (i = 0; i < 8; i++) //后讀取8位的值
- {
- temp_ad_val1 >>= 1;
- if (ADC_DATO)
- temp_ad_val1 |= 0x80;
- else
- temp_ad_val1 |= 0x00;
- _nop_();
- ADC_Clk = 1;
- _nop_();
- ADC_Clk = 0;
- }
- if (temp_ad_val2 == temp_ad_val1) //比較前8位與后8位的值,如果不相同舍去。若一直出現顯示為零,請將該行去掉
- temp_data = temp_ad_val1;
- _nop_();
- ADC_CS = 1; //釋放ADC0832
- ADC_DATO = 1;
- ADC_Clk = 1;
- return temp_data;
- }
- //*****************************
- //**顯示數據
- //*****************************
- void Display_data(void)
- {
- ulong temp=0,temp2=0;
- temp=adc0832(0);
- temp=temp*500/255;//單位放大了100倍
- temp2=temp/100;
- if(temp2)
- {
- LCD_Print_num(4,1,temp2);
- Print(".");
- temp2=temp%100;
- LCD_Print_num(6,1,temp2);
- }
- else
- {
- LCD_Print(4,1,"0.");
- temp2=temp%100;
- LCD_Print_num(6,1,temp2);
- }
- Print("pa");
- Print(" ");
-
-
-
- }
- // 電機正轉
- void come()
- {
- IN1=1;
- IN2=0;
- }
- //電機倒轉
- void back()
- {
- IN1=0;
- IN2=1;
- }
- //電機停止
- void stop()
- {
- IN1=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus仿真下載:
壓力傳感器控制電機ADC0832.zip
(118.62 KB, 下載次數: 71)
2023-5-28 15:48 上傳
點擊文件名下載附件
一 綜述
近幾年隨著畜牧業的快速發展及社會各界對畜牧業安全質量的重點關注,畜牧業產品的追蹤溯源已經成為學者們的研究熱點,為建立完善的畜牧業追溯體系需要從源頭著手,在養殖環節建立起信息化監控系統對養殖場的各環節進行實時監測,并采集每一頭牲畜的全部生命信息進行識別、分析及處理。盡管目前已存在一些畜牧業養殖場的追溯系統對養殖場進行實時監控,并實現了牲畜養殖的信息化管理,但由于系統的設計及部署實施中存在著一些弊端限制了畜牧業養殖場發展規模的擴大及信息采集工作的效率,近而大大影響了企業的經濟效益。
|