TCS230颜色识别传感器的AVRmega128驱动程序
/*
TCS230颜色识别传感器程序
接口定义:S0接PE0 S1接PE1 S2接PE2 S3接PE3 OUT接PD0(INT0) OE接PE4
*/
#include
#include
#define uchar unsigned char #define uint unsigned int /*引脚定义*/
#define S0_OUT DDRE|=BIT(0) #define S0_1 PORTE|=BIT(0) #define S0_0 PORTE&=~BIT(0)
#define S1_OUT DDRE|=BIT(1) #define S1_1 PORTE|=BIT(1) #define S1_0 PORTE&=~BIT(1)
#define S2_OUT DDRE|=BIT(2) #define S2_1 PORTE|=BIT(2) #define S2_0 PORTE&=~BIT(2)
#define S3_OUT DDRE|=BIT(3) #define S3_1 PORTE|=BIT(3) #define S3_0 PORTE&=~BIT(3)
#define E_OUT DDRE|=BIT(4) #define E_1 PORTE|=BIT(4) #define E_0 PORTE&=~BIT(4)
#define OUT_OUT DDRD|=BIT(0) #define OUT_IN DDRD&=~BIT(0) #define OUT_1 PORTD|=BIT(0) #define OUT_0 PORTD&=~BIT(0)
void delay(uint ms);
void delay_us(uint us); void init(void);
void init_1602(void);
void init_TCS230(void); void display(uint a);
void RGB(void);
void write_com_1602(uchar command);
void write_data_1602(uchar data);
void display1602(void);
#pragma interrupt_handler int0:2 #pragma interrupt_handler timer1_ovf:15
const uchar table_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const uchar table_wei[]={0x01,0X02,0X04,0X08};
uchar ge=0,shi=0,bai=0,qian=0; uint blue_temp=0,red_temp=0,green_temp=0,red=0,blue=0,green=0;
void main(void)
{
init();
init_1602();
init_TCS230();
S0_1; S1_1; //输出比例因子为100%
S2_0; S3_0; //选择红色滤波器
while(1)
{
display(red/10);
}
}
void init(void)
{
DDRA=0XFF;
DDRB=0XFF;
DDRC=0XFF;
DDRD=0XFF;
DDRE=0XFF;
}
void init_TCS230(void)
{
S0_OUT;
S1_OUT;
S2_OUT;
S3_OUT;
E_OUT;
OUT_IN;
OUT_1;
E_0; //TCS230使能
S0_1; S1_1; //输出比例因子为100%
S2_0; S3_0; //选择红色滤波器
TCCR1B|=BIT(2); //256分频
TCNT1=0X85EE;
TIMSK|=BIT(2);
EICRA|=BIT(1);
EIMSK|=BIT(0);
SREG|=BIT(7);
}
void display1602(void) {
}
/********************************************************************
* 名称 : RGB()
* 功能 : 检测颜色的三原色
* 输入 : 无
* 输出 : 无
***********************************************************************/
void RGB(void)
{
}
#pragma interrupt_handler int0:2
void int0(void)
{
red_temp++;
}
#pragma interrupt_handler timer1_ovf:15
void timer1_ovf(void) {
TCNT1=0X85EE;
red=red_temp;
red_temp=0;
}
/********************************************************************
* 名称 : 1602液晶的初始化和发送数据、指令函数 * 功能 : 配置1602液晶
* 输入 : 显示数据、指令
* 输出 : 无
***********************************************************************/
void write_com_1602(uchar command)
{
PORTF&=~BIT(3);// RS
PORTF&=~BIT(0);// R/W
PORTC=command;
delay(1);
PORTF|=BIT(2);// E
delay(1);
PORTF&=~BIT(2);
delay(5);
}
void write_data_1602(uchar data)
{
PORTF|=BIT(3);// RS
PORTF&=~BIT(0);// R/W
PORTC=data;
delay(1);
PORTF|=BIT(2);// E
delay(1);
PORTF&=~BIT(2);
delay(5);
}
void init_1602(void) {
DDRC=0xFF;
DDRF|=BIT(0)|BIT(2)|BIT(3);
PORTF&=~BIT(2);
write_com_1602(0x38);
write_com_1602(0x01);
write_com_1602(0x0c);
write_com_1602(0x06);
write_com_1602(0x80); }
/********************************************************************
* 名称 : display()
* 功能 : 4位数码管的显示函数
* 输入 : 显示值,最大值为9999
* 输出 : 无
***********************************************************************/
void display(uint a) {
ge=a%10;
shi=(a/10)%10;
bai=(a/100)%10;
qian=(a/1000)%10;
PORTA=~table_duan[qian];
PORTB=table_wei[0];
delay(1);
PORTA=~table_duan[bai];
PORTB=table_wei[1];
delay(1);
PORTA=~table_duan[shi];
PORTB=table_wei[2];
delay(1);
PORTA=~table_duan[ge];
PORTB=table_wei[3];
delay(1);
}
/********************************************************************
* 名称 : delay()
* 功能 : 8M晶振时延时1ms
* 输入 : 时间值
* 输出 : 无
***********************************************************************/
void delay(uint ms) {
uint x,y;
for(x=0;x