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