一、板子尺寸:長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)
2018-2-5 00:50 上傳
點擊文件名下載附件
|