一、板子尺寸:长113mmX宽72mmX高18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:有12V和24两种可供选择
四、板子功耗:小于300mA 芯片采用STC12C5A60S2单片机
学习型颜色识别传感器可编程工控板的电路原理图:
元件清单:
单片机源程序如下:
- #include "demo.h"
- #include "eeprom.h"
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- uint tcnt1=0;//用于刷新数码管
- uint bainum1,shinum1,genum1;//数码管上显示
- uint bainum2,shinum2,genum2;//数码管上显示
- code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
- uchar wei1[3]={0XDf,0XBf,0X7f};//数码管1的位的控制端
- uchar wei2[3]={0XFb,0XF7,0Xef};//数码管2的位的控制端
- bit flag_eeprom1=1;//掉电存储的标志位
- static uchar presstime=0;//时间值按键用到的
- uint kf0=1;//按键用的标志位
- uint kt0=0;//按键用的标志位
- uint keynum=0;//数码管的位
- uint bainum11=0,shinum11=0,genum11=0;//用于传到数码管上显示
- uint bainum22=0,shinum22=0,genum22=0;//用于传到数码管上显示
- uint if0=1,if1=1;//触发用的标志位
- uint it0=0,it1=0;//触发用的标志位
- uint inum1=0,inum2=0;//触发端子用的计数
- uint isecond1=0,isecond2=0;//触发端子用的计数
- uint iminute1=0,iminute2=0;//触发端子用的计数
- uchar inum11=0,inum12=0,inum21=0,inum22=0;//掉电存储
- extern void keycan();//按键
- extern void keyflag();//按键结束调用
- extern void displaynum();//将数字传到数码管上显示
- extern void operations();//操作
- void timer0_1init(void){//定时配置
- TMOD=0x11;//将定时器0,1都设置为模式1
- TL0 = 0xCD;//设置定时器0时间为2ms
- TH0 = 0xF8;//设置定时器0的初始值
- TR0=1;//开启定时器0
- TR1=1;//开启定时器1
- EA=1;//开总中断
- ET0=1;//开定时器0的中断
- }
- void main(){
- timer0_1init();
- inum11=Byte_Read(0x01);//掉电存储用到
- inum12=Byte_Read(0x02);//掉电存储用到
- inum21=Byte_Read(0x03);//掉电存储用到
- inum22=Byte_Read(0x04);//掉电存储用到
- inum1=inum11*100+inum12;
- inum2=inum21*100+inum22;
- bainum11=inum1/100;
- shinum11=inum1/10%10;
- genum11=inum1%10;
-
- bainum22=inum2/100;
- shinum22=inum2/10%10;
- genum22=inum2%10;
- while(1){
- keycan();//调用按键
- operations();//调用操作
- if (it0==1){//当标志位it0等于1时
- out1=0;//out1输出
- }
- if (it1==1){out2=0;}
- }
- }
- void operations(){//操作
- if(in1==0){//当触发端子1触发
- if0=0;//将if0值改为0,定时器开始倒计时
- it0=0;//将it0置为1,out1输出
- }
- if(in2==0){if1=0;it1=0;}
- }//操作结束
- void keycan(){//按键
- if(keynum==0){//当按键值等于0的时候调用显示
- displaynum();
- }
- if(key1==0){//当按键1按下
- if(kf0){//当标志位kf0=1的时候进行
- if(presstime>100){//当时间值大于一百的时候
- kf0=0;//标志位kf0=0
- kt0=1;//标志位kt0=0
- presstime=0;//时间清零,重新进行
- keynum++;//数码管的位
- if(keynum==7){//当位到7则置位0
- keynum=0;
- }
- }
- }
- }else{//当按键松开
- keyflag();
- }//按键1结束
- if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作
- switch(keynum){
- case 1:
- bainum11++;//数码管一加加
- if(bainum11>9){//当数码管一加加到9时置为1
- bainum11=0;
- }
- break;
- case 2:shinum11++;if(shinum11>9){shinum11=0;}break;
- case 3:genum11++;if(genum11>9){genum11=0;}break;
- case 4:bainum22++;if(bainum22>9){bainum22=0;}break;
- case 5:shinum22++;if(shinum22>9){shinum22=0;}break;
- case 6:genum22++;if(genum22>9){genum22=0;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();
- if((flag_eeprom1==1))//加掉电存储,必需加到这,不然有一些小问题
- { flag_eeprom1=0;
- saveeepro();//掉电存储
- }
- }//松开按键进行显示
- if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
- switch(keynum){
- case 1:
- bainum11--;//数码管一减减
- if(bainum11>111){//当数码管一减减到0时置为9
- bainum11=9;
- }
- break;
- case 2:shinum11--;if(shinum11>111){shinum11=9;}break;
- case 3:genum11--;if(genum11>111){genum11=9;}break;
- case 4:bainum22--;if(bainum22>111){bainum22=9;}break;
- case 5:shinum22--;if(shinum22>111){shinum22=9;}break;
- case 6:genum22--;if(genum22>111){genum22=9;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();if((flag_eeprom1==1)){flag_eeprom1=0;saveeepro();}}//松开按键进行显示
- }//按键结束
- void displaynum(){//将数字传到数码管上显示
- if (if0==0){//当if0==0时num1三个数码管进行显示
- genum1=inum1%10;//个位
- shinum1=inum1/10%10;//十位
- bainum1=inum1/100;//百
- }else{
- bainum1=bainum11;
- shinum1=shinum11;
- genum1=genum11;
- inum1=bainum11*100+shinum11*10+genum11; //将num1三个数码管的值付给inum
- }
- if (if1==0){
- genum2=inum2%10;
- shinum2=inum2/10%10;
- bainum2=inum2/100;
- }else{
- bainum2=bainum22;
- shinum2=shinum22;
- genum2=genum22;
- inum2=bainum22*100+shinum22*10+genum22;}
-
- }
- void timer0(void)interrupt 1 {//定时器0
- //500等于1秒
- TL0 = 0xCD; //重新设置定时器0时间为2ms
- TH0 = 0xF8; //重新设置定时器0的初始值
- tcnt1++;//用于刷新数码管
- presstime++;//按键用到,用于防抖
- if (if0==0){//当if0等于0时
- isecond1++;//当触发1触发后进行计数(秒)
- if (isecond1==500){//一秒时间到
- isecond1=0;//置为0,重新开始计
- //iminute1++;
- //if(iminute1==60){//说明一分钟到了
- // iminute1=0;
- inum1--;//inum进行减减
- if(inum1==0){//当inum等于0时
- if0=1;//将标志位if0置为1
- it0=1;//将标志位it0置为0,out1断开
- }
- // }
- }
- }//触发端子1的计时结束
- if (if1==0){isecond2++;if (isecond2==500){isecond2=0;
- //iminute2++;if(iminute2==60){iminute2=0;
- inum2--;if(inum2==0){if1=1;it1=1;}}}//}//触发端子2的计时
- switch(tcnt1){
- /**************数码管1-开始*****************/
- case 1: P2=0XFF; P0=seg7code[bainum1];if(keynum==1 || keynum==0){P2=wei1[2];}break;
- case 2: P2=0XFF; P0=seg7code[shinum1];if(keynum==2 || keynum==0){P2=wei1[1];}break;
- case 3: P2=0XFF; P0=seg7code[genum1]; if(keynum==3 || keynum==0){P2=wei1[0];}break;
- /**************数码管1-结束*****************/
- /**************数码管2-开始*****************/
- case 4: P2=0XFF; P0=seg7code[bainum2];if(keynum==4 || keynum==0){P2=wei2[2];}break;
- case 5: P2=0XFF; P0=seg7code[shinum2];if(keynum==5 || keynum==0){P2=wei2[1];}break;
- case 6: P2=0XFF; P0=seg7code[genum2]; if(keynum==6 || keynum==0){P2=wei2[0];}break;
- /**************数码管2-结束*****************/
- default: tcnt1=0; P2=0XFF; break;
- }
- }//定时器0结束
- void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
- if(kt0){//当标志位kt0=1的时候进行
- if(presstime>100){//当时间值大于一百的时候
- kf0=1;//标志位kf0=1
- kt0=0;//标志位kt0=0
- presstime=0;//时间清零,重新进行
- }
- }
- }
- void saveeepro(){//掉电存储
- inum11=inum1/100;//把int型的值拆分到char型
- inum12=inum1%100;
- inum21=inum2/100;
- inum22=inum2%100;
- Sector_Erase(0); //擦除0x01地址中的数据 一定要先擦除再写进 同一地址
- Byte_Program(0x01,inum11); //擦除完成就可以写入了
- Byte_Program(0x02,inum12); //擦除完成就可以写入了
- Byte_Program(0x03,inum21); //擦除完成就可以写入了
- Byte_Program(0x04,inum22); //擦除完成就可以写入了
- }
复制代码
所有资料51hei提供下载:
GYJ-0041_学习型颜色识别传感器发货资料.rar
(1.4 MB, 下载次数: 28)
|