您好,您可以幫助我一下嗎,這是我的程序
#include <stc8a.h>
#include <LCD1602.h>
#define uchar unsigned char
#define uint unsigned int
//=================顏色傳感模塊連接=====================
/*-----------------------------------------------------
|EO-----GND
|S0-----VCC | S2-----P1.0 | OUT-------P3.5
|S1-----VCC | S3-----P1.1 |
---------------------------------------------------*/
sbit tcs230_s2=P1^0;//TCS230 S2接單片機P1.0
sbit tcs230_s3=P1^1;//TCS230 S3接單片機P1.1
sbit tcs230_en=P3^0; //TCS230 EN(E0)接GND
//**************函數聲明***************************************
void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置顯示一個字符
void baipingheng();//白平衡子程序
void celiang();//實際顏色程序
void LCD1602_Init(void);
void LCD1602_Display_Str(uchar* str);
void Delay_ms(unsigned int ms);
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毫秒
LCD1602_Init();//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');
Delay_ms(1000);//每隔2.5秒測試一次顏色
}
}
//******************************************************
//白平衡子程序
void celiang()
{
TMOD=0x51;//設定T0以工作方式1定時10毫秒
//*********求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()
{
TMOD=0x51;//設定T0以工作方式1定時10毫秒
//**************求取紅色因子***********************
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)
}
/***********************************************
函數名稱:LCD1602_Init
功 能:LCD1602初始化
入口參數:無
返 回 值:無
備 注:詳見數據手冊定義。
************************************************/
void LCD1602_Init(void)
{
//將P04 P05 P06 P07設置為準雙向口
P0_Mode_IO_PU(PIN_4|PIN_5|PIN_6|PIN_7);
//將P41 P43 P44設置為準雙向口
P4_Mode_IO_PU(PIN_1|PIN_3|PIN_4);
Delay_ms(15); //上電延時15ms
LCD1602_SetFourMode(); //設置為四線模式
Delay_ms(5);
LCD1602_WriteCMD(0x28); //寫顯示指令(不檢測忙信號)
Delay_ms(5);
LCD1602_WriteCMD(0x28); //寫顯示指令(不檢測忙信號)
LCD1602_CheckBusy();
LCD1602_WriteCMD(0x28); //寫顯示指令
LCD1602_CheckBusy();
LCD1602_WriteCMD(0x08); //顯示關閉
LCD1602_CheckBusy();
LCD1602_WriteCMD(0x01); //清屏
LCD1602_CheckBusy();
LCD1602_WriteCMD(0x06); //顯示光標移動設置
LCD1602_CheckBusy();
LCD1602_WriteCMD(0x0c); //顯示開及光標設置
}
/***********************************************
函數名稱:LCD1602_Display_Str
功 能:lcd1602顯示字符函數
入口參數:str指針地址
返 回 值:無
備 注:無
************************************************/
void LCD1602_Display_Str(uchar* str)
{
while(*str!='\0') //未到字符串末尾
{
LCD1602_CheckBusy(); //檢測忙信號
LCD1602_WriteDAT(*str);//寫入數據
str++;
}
}
/*======================================================================
功 能: 在1602 指定位置顯示一個字符:第一行位置0~15,第二行16~31
說 明: 第 X 行,第 y 列 注意:字符串不能長于16個字符
======================================================================*/
void DisplayOneChar( uchar X, uchar Y, uchar ASCII)
{
X &= 0x1;
Y &= 0xF; //限制Y不能大于15,X不能大于1
if (X) Y |= 0x40; //當要顯示第二行時地址碼+0x40;
Y |= 0x80; // 算出指令碼
LCM_WriteCMD(Y,0); //這里不檢測忙信號,發送地址碼
LCD1602_Display_Str(&ASCII);
}
/***********************************************
函數名稱:Delay_ms
功 能:STC8系列單片機1ms延時程序
入口參數:ms:延時的毫秒數
返 回 值:無
備 注:示波器實測:1.01ms,內部時鐘:24MHz
************************************************/
void Delay_ms(unsigned int ms)
{
unsigned int i;
while( (ms--) != 0)
{
for(i = 0; i < 1850; i++);
}
} |