包括C语言程序和proteus仿真
具有显示时间 检测温度 重量检测 声光报警 以及电机控制等功能
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg52.h"
- #include "ds1302.h"
- #include "lcd.h"
- #include "temp.h"
- #include "intrins.h"
- /*对数据类型进行声明定义*/
- typedef unsigned int u16;
- typedef unsigned char u8;
- #define ulong unsigned long
- #define GPIO_MOTOR P1
- /****I/O口定义****/
- sbit KEY1 = P3^0;
- sbit KEY2 = P3^1;
- sbit KEY3 = P3^2;
- sbit BEEP = P2^7;
- sbit LED1 = P3^3;
- sbit DOUT=P3^4; //定义2543数据读取口
- sbit DIN =P3^5; //定义2543数据写入口
- sbit CS =P3^6; //定义2543片选信号口
- sbit CLK =P3^7; //定义时钟信号口
- /****变量定义****/
- bit adjust;//调节标志位 0-1
- u8 num;//闹钟调节位
- u8 hour_shi, hour_ge, minute_shi, minute_ge;//闹钟调节
- ulong Volt;//测量的电压值
- ulong AD_Volt;//测量的电压值
- ulong quality;//检测重量
- ulong quality_set=2000;//设置的重量阈值200克
- unsigned char code FFW_X[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //X反转顺序
- unsigned char code FFZ_X[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //X正转顺序
- unsigned char Direction,stop=0;
- void delay30ms(void) //误差 0us
- {
- unsigned char a,b;
- for(b=101;b>0;b--)
- for(a=147;a>0;a--);
- }
- void Delay(unsigned int t)
- {
- unsigned int k;
- while(t--)
- {
- for(k=0; k<80; k++)
- { }
- }
- }
- void Motor()
- {
- unsigned char a=30;
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if(Direction==1&&stop==0) //正转电机&电机没按下停止
- GPIO_MOTOR = FFW_X[i]&0x0F;//取数据
- if(Direction==2&&stop==0) //反转&X电机&电机没按下停止
- GPIO_MOTOR = FFZ_X[i]&0x0F;
-
- Delay(a);
- }
- }
- void Read2543(uchar addr)
- {
- uint ad=0;
- uchar i;
- CLK=0;
- CS=0;//片选段,启动2543
- addr<<=4;//对地址位预处理
- for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量
- {
- if(DOUT==1)
- ad=ad|0x01;//单片机读取ad数据
- DIN=addr&0x80;//2543读取测量地址位
- CLK=1;
- ;;;//很短的延时
- CLK=0;//产生下降沿,产生时钟信号
- ;;;
- addr<<=1;
- ad<<=1;//将数据移位准备下一位的读写
- }
- CS=1;//关2543
- ad>>=1;
- Volt=ad;//取走转换结果
- //Volt=Volt*1221;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV
-
- Volt=Volt*5000/4095;
- quality=(Volt/5.12+40)*10/4;//计算压力
- //Pressure=(Volt/5.41+40)*10/4;
-
- }
- void KEY_Control()//按键调节
- {
- if(KEY1==0)
- {
- delay30ms();
- if(KEY1==0)
- {
- stop=0;
- Direction=1;
- }
- }
- if(KEY2==0)
- {
- delay30ms();
- if(KEY2==0)
- {
- stop=0;
- Direction=2;
- }
- }
- if(KEY3==0)
- {
- delay30ms();
- if(KEY3==0)
- {
-
- stop=1;
- }
- }
-
- }
- void show_quality(void)//显示重量
- {
- quality=quality-30;
- DisplayOneChar(11,0,(char)(quality/1000+'0'));
- DisplayOneChar(12,0,(char)(quality%1000/100+'0'));
- DisplayOneChar(13,0,(char)((quality%100)/10+'0'));
-
- if( quality <= quality_set )
- {
- stop=0;
- Direction=1;
- BEEP=0;
- LED1=0;
- Delay(200);
- BEEP=1;
- LED1=1;
- Delay(300);
- }
-
- if( quality > quality_set )
- {
- stop=1;
-
- BEEP=1;
- LED1=1;
-
- }
- }
- void main()//主函数
- {
-
- LcdInit();
- DisplayOneChar(0,0,'2'); DisplayOneChar(1,0,'0'); DisplayOneChar(4,0,'-'); DisplayOneChar(7,0,'-');//2022-05-05 6
- DisplayOneChar(2,1,':'); DisplayOneChar(5,1,':'); DisplayOneChar(2,1,':');//13:39:40
- DisplayListChar(9,1,"T:"); DisplayOneChar(13,1,'.'); DisplayOneChar(15,1,'C');//T:23.5C
- DisplayOneChar(15,0,'g');
- while(1)
- {
-
- KEY_Control();//按键控制
- Motor();//步进电机控制
-
- Read2543(0);//检测重量
- show_quality();//显示重量
-
-
-
- ReadTemperature();//读取温度
- DisplayTemp();//显示温度
-
-
- Ds1302ReadTime();//读取时间
- DisplayTime();//显示时间
-
-
- }
- }
复制代码
Keil代码与Proteus8.8仿真下载:
宠物投食系统.zip
(201 KB, 下载次数: 88)
|