1、参考网上程序或者模块提供的程序
2、仔细参读datasheet,尤其研究时序以及逻辑功能的实现
3、多动脑筋思考,学会调试程序,多百度Google。
/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用实现功能:对颜色传感器输出RGB
使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
晶振:12MHZ
编译环境:Keil
作者:zhengzhongxign39*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
|DB3-----P0.3 | DB7-----P0.7 |
---------------------------------------------------*/
//================================================*/
#define LCM_Data P0 //LCD1602数据接口
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LCM_RW = P2^3 //读写控制输入端,LCD1602的第五脚
sbit LCM_RS = P2^4 //寄存器选择输入端,LCD1602的第四脚
sbit LCM_E = P2^2 //使能信号输入端,LCD1602的第6脚
//=================颜色传感模块连接=====================
/*-----------------------------------------------------
|EO-----GND
|S0-----VCC | S2-----P2.0 | OUT-------P3.5
|S1-----VCC | S3-----P2.1 |
---------------------------------------------------*/
sbit tcs230_s2=P2^0//TCS230 S2接单片机P2.0
sbit tcs230_s3=P2^1//TCS230 S3接单片机P2.1
sbit tcs230_en=P3^0 //TCS230 EN(E0)接GND
//**************函数声明***************************************
void WriteDataLCM (uchar WDLCM)//LCD模块写数据
void WriteCommandLCM (uchar WCLCM,BuysC) //LCD模块写指令
uchar ReadStatusLCM(void)//读LCD模块的忙标
void DisplayOneChar(uchar X,uchar Y,uchar ASCII)//在第X+1行的第Y+1位置显示一个字符
void LCMInit(void)//LCD初始
void DelayMs(uint Ms)//1MS基准延时程序
void baipingheng()//白平衡子程序
void celiang()//实际颜色程序
uint ryz,gyz,byz//分别定义红色因子 绿色因子 蓝色因子
uint rb,gb,bb//RGB值
uchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
//***********************主程序******************************
main()
{
TMOD=0x51//设定T0以工作方式1定时10毫秒
LCMInit()//LCD初始
baipingheng()//上电时先白平衡一次
while(1)
{
celiang()//颜色测试
DisplayOneChar(0, 0,'R')//以十进制显示RGB中红色的分值
DisplayOneChar(0, 1, rb/100+0x30) //显示百位数据
DisplayOneChar(0, 2, rb/10%10+0x30)//显示十位数据
DisplayOneChar(0, 3, rb%10+0x30)//显示个位数据
DisplayOneChar(0, 5,'G')//以十进制显示RGB中绿色的分值
DisplayOneChar(0, 6, gb/100+0x30) //显示百位数据
DisplayOneChar(0, 7, gb/10%10+0x30)
DisplayOneChar(0, 8, gb%10+0x30)
DisplayOneChar(0, 10,'B')//以十进制显示RGB中蓝色的分值
DisplayOneChar(0, 11, bb/100+0x30)
DisplayOneChar(0, 12, bb/10%10+0x30)
DisplayOneChar(0, 13, bb%10+0x30)
//*****在LCD1602的第二行以16进制显示RGB*******************
DisplayOneChar(1, 1, tab1[rb/16])
DisplayOneChar(1, 2, tab1[rb%16])
DisplayOneChar(1, 3, 'H')
DisplayOneChar(1, 6, tab1[gb/16])
DisplayOneChar(1, 7, tab1[rb%16])
DisplayOneChar(1, 8, 'H')
DisplayOneChar(1, 11,tab1[bb/16])
DisplayOneChar(1, 12,tab1[bb%16])
DisplayOneChar(1, 13,'H')
DelayMs(250)//每隔0.25秒测试一次颜色
}
}
//******************************************************
//白平衡子程序
void celiang()
{
//*********求R值************************************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=0
tcs230_s3=0//选择红色滤光器
tcs230_en=0
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
rb=(unsigned long)(TH1*256+TL1)*255/ryz
if(rb>255)rb=255//判断RGB值是否合法
//***********求B值**************************************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=0
tcs230_s3=1//选择蓝色滤光器
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
bb=(unsigned long)(TH1*256+TL1)*255/byz
if(bb>255)bb=255//判断RGB值是否合法
//***********求G值**************************************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=1
tcs230_s3=1//选择绿色滤光器
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
tcs230_en=1
gb=(unsigned long)(TH1*256+TL1)*255/gyz
if(gb>255)gb=255//判断RGB值是否合法
}
//******************************************************
//白平衡子程序
void baipingheng()
{
//**************求取红色因子***********************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=0
tcs230_s3=0//选择红色滤光器
tcs230_en=0
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
ryz=TH1*256+TL1//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求取蓝色因子***********************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=0
tcs230_s3=1//选择蓝色滤光器
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
byz=TH1*256+TL1//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求绿红色因子***********************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=1
tcs230_s3=1//选择绿色滤光器
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
tcs230_en=1
gyz=TH1*256+TL1//其实这里的比例因子应该为255/(TH1*256+TL1)
}
/*======================================================================
LCM初始化
其他程序网上自己找找参照
同时按下标定和确认,听到蜂鸣器响后输入标定口令010201即可。
工作流程说明:
当物体放在秤盘上时,压力施加给传感器,该传感器发生d性形变,从而使阻抗发生变化,同时使用激励电压发生变化,输出一个变化的模拟信号。
该信号经放大电路放大输出到模数转换器。转换成便于处理的数字信号输出到CPU运算控制。CPU根据键盘命令以及程序将这种结果输出到显示器。直至显示这种结果。
扩展资料:注意事项
1、提前预热。
电子天平在使用前通常需要预热,而每台天平的预热时间往往不同,天平的准确度等级越高,所需预热时间就越长,可根据天平使用说明书中的要求进行预热,必要时可延长预热时间。
2、环境条件。
环境条件也是影响电子天平计量性能的一个因素。电子天平的 *** 作说明书中如果没有指定特殊温度界限,则天平应在-10℃~40℃的温度条件下正常工作;若指定了特殊的温度界限,则天平在规定的温度条件下工作;电子天平对环境的湿度也有要求,如Ⅰ级天平要求相对湿度不大于80%。
参考资料来源:百度百科-电子秤
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)