![](https://img-blog.csdnimg.cn/direct/cdd31c2a29f04e848accea794c5e9b14.bmp)
![](https://img-blog.csdnimg.cn/direct/a88252a1978a48419ddba492344c3a17.jpeg)
完整版 电路图和程序代码 下载地址
部分代码展示
//程序头函数
#include <reg52.h>
//显示函数
#include <display.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1
//管脚声明
sbit LED_R= P2^2;//红灯
sbit LED_G= P2^0;//绿灯
sbit FENG = P2^5;//蜂鸣器
sbit san=P3^4; //称重机构运转(选配)
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
//按键
sbit Key1=P2^6; //设置键
sbit Key2=P2^7; //加按键
sbit Key3=P3^7; //减按键
bit bdata flag; //报警标志位
uchar set; //设置状态
//函数声明
extern uchar ADC0809();
extern void Key();
//变量
uchar temp=0;
uchar WARNING=25; //报警值
void init() //初始化函数
{
TMOD=0x01; //工作方式
TL0=0xb0;
TH0=0x3c; //赋初值(12MHz晶振的50ms)
EA=1; //打开中断总开关
ET0=1; //打开中断允许开关
TR0=1; //打开定时器开关
}
void main() //主函数
{
Init1602();//初始化显示
init(); //初始化定时器
while(1) //进入循环
{
temp=ADC0809(); //读取值
if(set==0) //只有在非设置状态时,
Display_1602(temp,WARNING); //才刷新显示实时重量值
if(temp<WARNING&&set==0) //非设置时当重量值小于报警值时
{
flag=0; //报警标志位置0,不报警
}
else if(temp>WARNING&&set==0) //非设置时当重量值大于报警值时
{
flag=1; //报警标志位置1
}
Key(); //扫描按键
}
}
//ADC0809读取信息
uchar ADC0809()
{
uchar temp_=0x00;
//初始化高阻太
OE=0;
//转化初始化
ST=0;
//开始转换
ST=1;
ST=0;
//外部中断等待AD转换结束
while(EOC==0)
//读取转换的AD值
OE=1;
temp_=Data_ADC0809;//将0809的数值读入单片机
OE=0;
return temp_; //返回读到的数据
}