|
一、板子尺寸:長(zhǎng)113mmX寬72mmX高18mm
二、主要器件:?jiǎn)纹瑱C(jī)、數(shù)碼管、繼電器
三、工作電壓:有12V和24兩種可供選擇
四、板子功耗:小于300mA 芯片采用STC12C5A60S2單片機(jī)
學(xué)習(xí)型顏色識(shí)別傳感器可編程工控板的電路原理圖:
0.png (131.76 KB, 下載次數(shù): 54)
下載附件
2018-2-5 01:47 上傳
元件清單:
0.png (177.5 KB, 下載次數(shù): 42)
下載附件
2018-2-5 01:48 上傳
ALIM0013.JPG (139.31 KB, 下載次數(shù): 60)
下載附件
2018-2-5 00:50 上傳
ALIM0006.JPG (153.51 KB, 下載次數(shù): 51)
下載附件
2018-2-5 00:50 上傳
ALIM0004.JPG (141.85 KB, 下載次數(shù): 46)
下載附件
2018-2-5 00:50 上傳
ALIM0002.JPG (148.91 KB, 下載次數(shù): 54)
下載附件
2018-2-5 00:50 上傳
ALIM0001.JPG (187.52 KB, 下載次數(shù): 45)
下載附件
2018-2-5 00:50 上傳
單片機(jī)源程序如下:
- #include "demo.h"
- #include "eeprom.h"
- #define uchar unsigned char//宏定義無符號(hào)字符型
- #define uint unsigned int //宏定義無符號(hào)整型
- uint tcnt1=0;//用于刷新數(shù)碼管
- uint bainum1,shinum1,genum1;//數(shù)碼管上顯示
- uint bainum2,shinum2,genum2;//數(shù)碼管上顯示
- code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數(shù)碼管字跟
- uchar wei1[3]={0XDf,0XBf,0X7f};//數(shù)碼管1的位的控制端
- uchar wei2[3]={0XFb,0XF7,0Xef};//數(shù)碼管2的位的控制端
- bit flag_eeprom1=1;//掉電存儲(chǔ)的標(biāo)志位
- static uchar presstime=0;//時(shí)間值按鍵用到的
- uint kf0=1;//按鍵用的標(biāo)志位
- uint kt0=0;//按鍵用的標(biāo)志位
- uint keynum=0;//數(shù)碼管的位
- uint bainum11=0,shinum11=0,genum11=0;//用于傳到數(shù)碼管上顯示
- uint bainum22=0,shinum22=0,genum22=0;//用于傳到數(shù)碼管上顯示
- uint if0=1,if1=1;//觸發(fā)用的標(biāo)志位
- uint it0=0,it1=0;//觸發(fā)用的標(biāo)志位
- uint inum1=0,inum2=0;//觸發(fā)端子用的計(jì)數(shù)
- uint isecond1=0,isecond2=0;//觸發(fā)端子用的計(jì)數(shù)
- uint iminute1=0,iminute2=0;//觸發(fā)端子用的計(jì)數(shù)
- uchar inum11=0,inum12=0,inum21=0,inum22=0;//掉電存儲(chǔ)
- extern void keycan();//按鍵
- extern void keyflag();//按鍵結(jié)束調(diào)用
- extern void displaynum();//將數(shù)字傳到數(shù)碼管上顯示
- extern void operations();//操作
- void timer0_1init(void){//定時(shí)配置
- TMOD=0x11;//將定時(shí)器0,1都設(shè)置為模式1
- TL0 = 0xCD;//設(shè)置定時(shí)器0時(shí)間為2ms
- TH0 = 0xF8;//設(shè)置定時(shí)器0的初始值
- TR0=1;//開啟定時(shí)器0
- TR1=1;//開啟定時(shí)器1
- EA=1;//開總中斷
- ET0=1;//開定時(shí)器0的中斷
- }
- void main(){
- timer0_1init();
- inum11=Byte_Read(0x01);//掉電存儲(chǔ)用到
- inum12=Byte_Read(0x02);//掉電存儲(chǔ)用到
- inum21=Byte_Read(0x03);//掉電存儲(chǔ)用到
- inum22=Byte_Read(0x04);//掉電存儲(chǔ)用到
- 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();//調(diào)用按鍵
- operations();//調(diào)用操作
- if (it0==1){//當(dāng)標(biāo)志位it0等于1時(shí)
- out1=0;//out1輸出
- }
- if (it1==1){out2=0;}
- }
- }
- void operations(){//操作
- if(in1==0){//當(dāng)觸發(fā)端子1觸發(fā)
- if0=0;//將if0值改為0,定時(shí)器開始倒計(jì)時(shí)
- it0=0;//將it0置為1,out1輸出
- }
- if(in2==0){if1=0;it1=0;}
- }//操作結(jié)束
- void keycan(){//按鍵
- if(keynum==0){//當(dāng)按鍵值等于0的時(shí)候調(diào)用顯示
- displaynum();
- }
- if(key1==0){//當(dāng)按鍵1按下
- if(kf0){//當(dāng)標(biāo)志位kf0=1的時(shí)候進(jìn)行
- if(presstime>100){//當(dāng)時(shí)間值大于一百的時(shí)候
- kf0=0;//標(biāo)志位kf0=0
- kt0=1;//標(biāo)志位kt0=0
- presstime=0;//時(shí)間清零,重新進(jìn)行
- keynum++;//數(shù)碼管的位
- if(keynum==7){//當(dāng)位到7則置位0
- keynum=0;
- }
- }
- }
- }else{//當(dāng)按鍵松開
- keyflag();
- }//按鍵1結(jié)束
- if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉電存儲(chǔ)的標(biāo)志位改為1,進(jìn)行存值操作
- switch(keynum){
- case 1:
- bainum11++;//數(shù)碼管一加加
- if(bainum11>9){//當(dāng)數(shù)碼管一加加到9時(shí)置為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))//加掉電存儲(chǔ),必需加到這,不然有一些小問題
- { flag_eeprom1=0;
- saveeepro();//掉電存儲(chǔ)
- }
- }//松開按鍵進(jìn)行顯示
- if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
- switch(keynum){
- case 1:
- bainum11--;//數(shù)碼管一減減
- if(bainum11>111){//當(dāng)數(shù)碼管一減減到0時(shí)置為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();}}//松開按鍵進(jìn)行顯示
- }//按鍵結(jié)束
- void displaynum(){//將數(shù)字傳到數(shù)碼管上顯示
- if (if0==0){//當(dāng)if0==0時(shí)num1三個(gè)數(shù)碼管進(jìn)行顯示
- genum1=inum1%10;//個(gè)位
- shinum1=inum1/10%10;//十位
- bainum1=inum1/100;//百
- }else{
- bainum1=bainum11;
- shinum1=shinum11;
- genum1=genum11;
- inum1=bainum11*100+shinum11*10+genum11; //將num1三個(gè)數(shù)碼管的值付給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 {//定時(shí)器0
- //500等于1秒
- TL0 = 0xCD; //重新設(shè)置定時(shí)器0時(shí)間為2ms
- TH0 = 0xF8; //重新設(shè)置定時(shí)器0的初始值
- tcnt1++;//用于刷新數(shù)碼管
- presstime++;//按鍵用到,用于防抖
- if (if0==0){//當(dāng)if0等于0時(shí)
- isecond1++;//當(dāng)觸發(fā)1觸發(fā)后進(jìn)行計(jì)數(shù)(秒)
- if (isecond1==500){//一秒時(shí)間到
- isecond1=0;//置為0,重新開始計(jì)
- //iminute1++;
- //if(iminute1==60){//說明一分鐘到了
- // iminute1=0;
- inum1--;//inum進(jìn)行減減
- if(inum1==0){//當(dāng)inum等于0時(shí)
- if0=1;//將標(biāo)志位if0置為1
- it0=1;//將標(biāo)志位it0置為0,out1斷開
- }
- // }
- }
- }//觸發(fā)端子1的計(jì)時(shí)結(jié)束
- if (if1==0){isecond2++;if (isecond2==500){isecond2=0;
- //iminute2++;if(iminute2==60){iminute2=0;
- inum2--;if(inum2==0){if1=1;it1=1;}}}//}//觸發(fā)端子2的計(jì)時(shí)
- switch(tcnt1){
- /**************數(shù)碼管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;
- /**************數(shù)碼管1-結(jié)束*****************/
- /**************數(shù)碼管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;
- /**************數(shù)碼管2-結(jié)束*****************/
- default: tcnt1=0; P2=0XFF; break;
- }
- }//定時(shí)器0結(jié)束
- void keyflag(){//按鍵結(jié)束調(diào)用,按鍵的建議使用,這樣可以減小code,但是觸發(fā)的不建議
- if(kt0){//當(dāng)標(biāo)志位kt0=1的時(shí)候進(jìn)行
- if(presstime>100){//當(dāng)時(shí)間值大于一百的時(shí)候
- kf0=1;//標(biāo)志位kf0=1
- kt0=0;//標(biāo)志位kt0=0
- presstime=0;//時(shí)間清零,重新進(jìn)行
- }
- }
- }
- void saveeepro(){//掉電存儲(chǔ)
- inum11=inum1/100;//把int型的值拆分到char型
- inum12=inum1%100;
- inum21=inum2/100;
- inum22=inum2%100;
- Sector_Erase(0); //擦除0x01地址中的數(shù)據(jù) 一定要先擦除再寫進(jìn) 同一地址
- Byte_Program(0x01,inum11); //擦除完成就可以寫入了
- Byte_Program(0x02,inum12); //擦除完成就可以寫入了
- Byte_Program(0x03,inum21); //擦除完成就可以寫入了
- Byte_Program(0x04,inum22); //擦除完成就可以寫入了
- }
復(fù)制代碼
0.png (47.08 KB, 下載次數(shù): 39)
下載附件
2018-2-5 01:50 上傳
0.png (7.6 KB, 下載次數(shù): 48)
下載附件
2018-2-5 01:51 上傳
所有資料51hei提供下載:
GYJ-0041_學(xué)習(xí)型顏色識(shí)別傳感器發(fā)貨資料.rar
(1.4 MB, 下載次數(shù): 28)
2018-2-5 00:50 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|