/*=============================================================================
* FileName:TSL230.c
* Resouce Descption:
* S0:pc0;
* S1:pc1;
* S2:pc2;
* S3:pc3;
* OE:Pc5,LOW->Enable,High->Disable;
* Out:PD5;T1
* Time1:clk计数
* time2:1s计时 F=clk/1s
编者:郝飞 2011年4月21日
=============================================================================*/
#include<iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define F_POWERDOWN 0
#define F_100_2 1
#define F_100_20 2
#define F_100_100 3
#define PH_RED 0
#define PH_BLUE 1
#define PH_CLEAR 2
#define PH_GREEN 3
uint CNT1=0; //T1溢出个数
uint CNT2=0;
ulong Tisk; //T2计时1s所用的T1定时器值
uchar FrequencyMode; //TCS频率输出模式
uchar PhotoDiodeMode; //TCS虑光模式
uchar Time_1sFlag = 0; //定时器1标志
//数码管字型表,对应0,1,2,3,4,5,6,7,8,9//
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[6]={0,0,0,0,0,0}; //显示初始值:0 0 0 0 0 0
void delay_us( int t) //us
{
do
t--;
while(t>1);
}
void delay_ms(unsigned int t) //ms
{
while(t!=0)
{
delay_us(1142);
t--;
}
}
/*=============================================
* TSL230 inital
* pA0-pA3:s0-s3(out)
* OE(PA5):out
=============================================*/
void TCS230Inital(void) //..Mode Set
{
DDRC = DDRC | 0x0f; //PC0-PC3 OUT
PORTC = PORTC | 0x0f;
//PC5 out
PORTC = PORTC | 0x20; //0010 0000
DDRC = DDRC | 0x20;
PORTC = PORTC & 0xdf; //1101 1111
}
void port_init(void)
{
DDRA=0XFF;
//PORTA=0xff;
DDRD=0XFF;
//PORTD=0xff;
DDRB=0XF0;
PORTB=0xff;
}
void init_devices(void)
{
SREG=0X00; // C禁止所有中断
port_init();
TCS230Inital(); //TCS230Inital();//颜色传感器初始化
timer1_init();
timer2_init();
SREG=0X80; //开全局中断
}
void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
{
uchar i,sel=0x01;
for(i=0;i<3;i++)
{
PORTA=Table[Data[i]];
delay_us(1);
PORTD=BIT(i);
//delay_us(400);
}
}
void timer1_init(void) //定时T1初始化
{
TCCR1B=0x00; //停止定时器
TCNT1H = 0x00;
TCNT1L = 0x00; //初始值
TCCR1A = 0x00;
TCCR1B = 0x07; //外部T1 引脚,上升沿驱动
TIMSK|=0x20; //中断允许
}
//定时器T1溢出中断服务程序
#pragma interrupt_handler timer1:9
void timer1(void)
{
CNT1++;
TCNT1=0; //重装值
}
void timer2_init(void) //定时器T2初始化
{
TCCR2=0X00; //停止定时器
TCNT2=0x06; //初始值
TCCR2=0x02; //启动定时器1024分频
TIMSK|=0x40; //中断允许
}
//T2溢出中断服务程序
#pragma interrupt_handler timer2:5
void timer2(void)
{
CNT2++;
TCNT2=0x05;
if(CNT2==125)
{
TCCR1B = 0x00; //关闭计数
Tisk=CNT1*65536+TCNT1; //计算频率值
TCNT1=0; //清除计数值
TCNT2=0x05;
CNT1=0;
CNT2=0;
Time_1sFlag = 1;
TCCR1B=0x07; //开始计数
}
}
/*=====================================================================
* S0:pc0;
* S1:pC1;
* S2:pC2;
* S3:pC3;
* S1S0:00(PowerDown) 01(%20) 10(%2) 11(%100)
* s3s2:00(Red) 01(clear) 10(blue) 11(green)
* return 0:ACK 1:FOutMode erro 2:PhotoType erro
=====================================================================*/
uchar TCS230Mode(uchar FOutMode,uchar PhotoType)
{
//frequency mode 频率模式
if( FOutMode == F_POWERDOWN) //关断电源模式
{ //S1S0:00 pc1=pC0=0
PORTC = PORTC & 0xfc;
}
else if(FOutMode == F_100_2) //频率因子为2%
{ //S1S0:10 pc1=1,pc0=0
PORTC = PORTC & 0xfe;// 1111 1110
PORTC = PORTC | 0x02;// 0000 0010
}
else if(FOutMode == F_100_20) //频率因子为20%
{ //S1S0:01 pc1=0 pc0=1
PORTC = PORTC & 0xfd;//1111 1101
PORTC = PORTC | 0x01;//0000 0001
}
else if(FOutMode == F_100_100) //频率因子为100%
{ //S1S0:11 pc1=pc0=1
PORTC = PORTC | 0x03;//0000 0011
}
else
{ //频率因子参数错误返回1
return 1;
}
FrequencyMode = FOutMode;
//photoDIODE type 颜色模式
if(PhotoType==PH_RED) //滤波器类型为红色
{ //s3s2:00 pc3=pc2=0
PORTC = PORTC & 0xf3;//1111 0011
}
else if(PhotoType==PH_CLEAR) //滤波器类型为没有
{ //s3s2:01 pc3=0 pc2=1
PORTC = PORTC & 0xf7;//1111 0111
PORTC = PORTC | 0x04;//0000 0100
}
else if(PhotoType==PH_BLUE) //滤波器类型为蓝色
{ //s3s2:10 pc3=1 pc2=0
PORTC = PORTC & 0xfb;//1111 1011
PORTC = PORTC | 0x08;//0000 1000
}
else if(PhotoType==PH_GREEN) //滤波器类型为绿色
{ //s3s2:11 pc3=pc2=1
PORTC = PORTC | 0x0c;//1100 0000
//
}
else
{ //滤波器颜色参数错误返回2
return 2;
}
PhotoDiodeMode=PhotoType;
return 0; //参数正确响应返回0
}
/*=====================================================================*/
void Process(ulong X,uchar *p)
{
p[0]=X/100;
X=X%100;
p[1]=X/10;
p[2]=X%10;
}
void main()
{
init_devices();
SEI();
while(1)
{
FrequencyMode = F_100_100; //TCS频率输出模式
PhotoDiodeMode = PH_RED; //TCS虑光模式
TCS230Mode(FrequencyMode,PhotoDiodeMode);
if(Time_1sFlag==1)
{
Time_1sFlag=0;
Process(Tisk*1300/1000,Data);
Display(Data);
}
}
}
yanse-.rar_tsl230 _yanse下载
版权申诉
165 浏览量
2022-09-24
03:40:50
上传
评论
收藏 34KB RAR 举报
小波思基
- 粉丝: 72
- 资源: 1万+
最新资源
- Pytorch-pytorch深度学习教程之深度残差网络.zip
- Pytorch-pytorch深度学习教程之循环神经网络.zip
- Pytorch-pytorch深度学习教程之逻辑回归.zip
- Pytorch-pytorch深度学习教程之双向循环网络.zip
- Pytorch-pytorch深度学习教程之卷积神经网络.zip
- Pytorch-pytorch深度学习教程之前馈神经网络.zip
- Pytorch-pytorch深度学习教程之线性回归.zip
- Pytorch-pytorch深度学习教程之基本操作.zip
- 基于QT的地图可视化桌面系统后台数据库为MySQL5.7源码.zip
- 基于simulink的PLL锁相环系统仿真【包括模型,文档,参考文献,操作步骤】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0