好久没写日志了,冒个泡,上个最近项目写的程序表示下自己的存在//模块S2-----单片机P1.1//模块S3-----单片机P1.0//模块OUT----单片机P3.5(计数器1输入)//模块VCC----单片机VCC//模块GND----单片机GND//K4按一次进入比例因子调节模式,再按退出;探测时按K8重置//K1+,K5-控制R比例因子 K2+,K6-控制B比例因子 K3+,K7-控制G比例因子#include#include //Keil library #include //Keil library #include #define uchar unsigned char#define uint unsigned int #define DataPort P0 //LCD1602 数据端口sbit LCM_RS=P2^6; //LCD1602 控制端口 sbit LCM_RW=P2^5; //LCD1602 控制端口 sbit LCM_EN=P2^7; //LCD1602 控制端口/**引脚定义**/ sbit s2=P1^1; //TCS3200 S2 sbit s3=P1^0; //TCS3200 S3 //TCS3200 S0 模块内部默认上拉 //TCS3200 S1 模块内部默认上拉 //TCS3200 OE 模块内部接地sbit test_pin=P2^2; //用示波器看这个引脚,可知道定时器中断频率sbit K8=P1^7;sbit K1=P2^1;sbit K2=P2^0;sbit K3=P1^2; sbit K4=P1^3;sbit K5=P1^4;sbit K6=P1^5;sbit K7=P1^6;//变量、常量定义uchar ge,shi,bai ;uchar rp=3,gp=3,bp=6; //定义比例因子,具体环境可以修改uchar count; //颜色标志位(0:红 1:绿 2:蓝)uint ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子//显示数组uchar disp_R[3]; //红uchar disp_G[3]; //绿uchar disp_B[3]; //蓝uchar disp_rp[3];uchar disp_bp[3];uchar disp_gp[3];//********定义函数*****************************void delay(unsigned int k);void InitLcd();void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void baipingheng();//白平衡子程序void DisplayRGB();//显示比例因子//*********LCD1602初始化**********************void InitLcd() { WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1);}//**********检测忙信号************************void WaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80); LCM_EN=0; }//**********写命令至LCD***********************void WriteCommandLCM(uchar CMD,uchar Attribc){ if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0;} //**********写数据至LCD************************void WriteDataLCM(uchar dataW){ WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//*********写一个字符数据到指定的目标***********void DisplayOneChar(uchar X,uchar Y,uchar DData){ Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); }//**********延时函数***************void delay(unsigned int k) { unsigned int i,j; for(i=0;i 晶振10msEA=1; //开中断ET0=1; TR0=1; //启动TR1=1;}//*********************************************//数值转换出个十百千的ASCII码//*********************************************void conversion(uint temp_data) { bai=temp_data/100+0x30 ; temp_data=temp_data%100; //取余运算 shi=temp_data/10+0x30 ; ge=temp_data%10+0x30; //取余运算}/******************************************** 函数名称: main()/********************************************/void main(){ InitLcd(); //lcd初始化 TMOD=0x51; baipingheng();DisplayRGB();t0_init(); //定时计数初使? s2=0; //初始设定S2引脚s3=0; //初始设定S3引脚 while(1){DisplayOneChar(0, 0, 'T');DisplayOneChar(1, 0, 'C');DisplayOneChar(2, 0, 'S');DisplayOneChar(3, 0, '3');DisplayOneChar(4, 0, '2');DisplayOneChar(5, 0, '0');DisplayOneChar(6, 0, '0');DisplayOneChar(10, 0, 'R'); DisplayOneChar(11, 0, '['); DisplayOneChar(12, 0, disp_R[0]); DisplayOneChar(13, 0, disp_R[1]); DisplayOneChar(14, 0, disp_R[2]);DisplayOneChar(15, 0, ']'); DisplayOneChar(0, 1, 'G'); DisplayOneChar(1, 1, '['); DisplayOneChar(2, 1, disp_G[0]); DisplayOneChar(3, 1, disp_G[1]); DisplayOneChar(4, 1, disp_G[2]);DisplayOneChar(5, 1, ']');DisplayOneChar(10, 1, 'B'); DisplayOneChar(11, 1, '['); DisplayOneChar(12, 1, disp_B[0]); DisplayOneChar(13, 1, disp_B[1]); DisplayOneChar(14, 1, disp_B[2]);DisplayOneChar(15, 1, ']'); delay(1000) ;if(K8==0) break;if(K4==0){while(1){ InitLcd(); DisplayRGB(); if(K1==0) {delay(10); rp++;} if(K5==0) {delay(10); rp--;} if(K2==0) {delay(10); bp++;} if(K6==0) {delay(10); bp--;} if(K3==0) {delay(10); gp++;} if(K7==0) {delay(10); gp--;} if(K4==0) break;} } }}/******************************************** 函数名称: c10ms_out() * 函数功能: 定时中断0服务程序 修改颜色标志disp_tc(0:红 1:绿 2:蓝) 设置S0 S1 S2 选择滤波器 计算脉冲,读取色值* 入口参数: 无* 出口参数: 无/********************************************/void c10ms_out() interrupt 1{uint temp;test_pin=!test_pin; //测试定时器中断频率引脚,可以用示波器观察TR0=0; //关闭定时TR1=0; //关闭计数// count+1实现先检测绿色,再检测蓝色,然后检测红色,循环检测 if(count==0){count++; s2=1;s3=1; //选择滤波器为绿色 temp=(8<
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
一个单片机比例因子控制的例子
时间:2024-05-26 12:37:11