久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3384|回復: 0
收起左側

學習型顏色識別傳感器可編程工控板單片機源碼與原理圖等資料

[復制鏈接]
ID:280979 發表于 2018-2-5 00:51 | 顯示全部樓層 |閱讀模式
一、板子尺寸:長113mmX寬72mmX18mm
二、主要器件:單片機、數碼管、繼電器
三、工作電壓:有12V24兩種可供選擇
四、板子功耗:小于300mA
芯片采用STC12C5A60S2單片機

學習型顏色識別傳感器可編程工控板的電路原理圖:
0.png

元件清單:
0.png

ALIM0013.JPG ALIM0006.JPG ALIM0004.JPG ALIM0002.JPG ALIM0001.JPG

單片機源程序如下:
  1. #include "demo.h"
  2. #include "eeprom.h"

  3. #define uchar unsigned char//宏定義無符號字符型
  4. #define uint unsigned int  //宏定義無符號整型
  5. uint tcnt1=0;//用于刷新數碼管
  6. uint bainum1,shinum1,genum1;//數碼管上顯示
  7. uint bainum2,shinum2,genum2;//數碼管上顯示
  8. code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數碼管字跟
  9. uchar wei1[3]={0XDf,0XBf,0X7f};//數碼管1的位的控制端
  10. uchar wei2[3]={0XFb,0XF7,0Xef};//數碼管2的位的控制端
  11. bit flag_eeprom1=1;//掉電存儲的標志位
  12. static uchar presstime=0;//時間值按鍵用到的
  13. uint kf0=1;//按鍵用的標志位
  14. uint kt0=0;//按鍵用的標志位
  15. uint keynum=0;//數碼管的位
  16. uint bainum11=0,shinum11=0,genum11=0;//用于傳到數碼管上顯示
  17. uint bainum22=0,shinum22=0,genum22=0;//用于傳到數碼管上顯示
  18. uint if0=1,if1=1;//觸發用的標志位
  19. uint it0=0,it1=0;//觸發用的標志位
  20. uint inum1=0,inum2=0;//觸發端子用的計數
  21. uint isecond1=0,isecond2=0;//觸發端子用的計數
  22. uint iminute1=0,iminute2=0;//觸發端子用的計數
  23. uchar inum11=0,inum12=0,inum21=0,inum22=0;//掉電存儲
  24. extern void keycan();//按鍵
  25. extern void keyflag();//按鍵結束調用
  26. extern void displaynum();//將數字傳到數碼管上顯示
  27. extern void operations();//操作
  28. void timer0_1init(void){//定時配置
  29.         TMOD=0x11;//將定時器0,1都設置為模式1
  30.         TL0 = 0xCD;//設置定時器0時間為2ms
  31.         TH0 = 0xF8;//設置定時器0的初始值
  32.         TR0=1;//開啟定時器0
  33.         TR1=1;//開啟定時器1
  34.         EA=1;//開總中斷
  35.         ET0=1;//開定時器0的中斷
  36. }
  37. void main(){
  38.         timer0_1init();
  39.    inum11=Byte_Read(0x01);//掉電存儲用到  
  40.    inum12=Byte_Read(0x02);//掉電存儲用到
  41.    inum21=Byte_Read(0x03);//掉電存儲用到
  42.    inum22=Byte_Read(0x04);//掉電存儲用到
  43.    inum1=inum11*100+inum12;
  44.    inum2=inum21*100+inum22;
  45.    bainum11=inum1/100;
  46.    shinum11=inum1/10%10;
  47.    genum11=inum1%10;
  48.    
  49.    bainum22=inum2/100;
  50.    shinum22=inum2/10%10;
  51.    genum22=inum2%10;
  52.         while(1){
  53.                 keycan();//調用按鍵
  54.                 operations();//調用操作       
  55.                 if (it0==1){//當標志位it0等于1時
  56.                         out1=0;//out1輸出
  57.                 }
  58.                 if (it1==1){out2=0;}
  59.         }
  60. }
  61. void operations(){//操作
  62.     if(in1==0){//當觸發端子1觸發
  63.                 if0=0;//將if0值改為0,定時器開始倒計時
  64.                 it0=0;//將it0置為1,out1輸出
  65.         }
  66.     if(in2==0){if1=0;it1=0;}
  67. }//操作結束
  68. void keycan(){//按鍵
  69.         if(keynum==0){//當按鍵值等于0的時候調用顯示
  70.                 displaynum();
  71.         }

  72.     if(key1==0){//當按鍵1按下
  73.                 if(kf0){//當標志位kf0=1的時候進行
  74.                         if(presstime>100){//當時間值大于一百的時候
  75.                                 kf0=0;//標志位kf0=0
  76.                                 kt0=1;//標志位kt0=0
  77.                                 presstime=0;//時間清零,重新進行
  78.                                 keynum++;//數碼管的位
  79.                         if(keynum==7){//當位到7則置位0
  80.                                    keynum=0;
  81.                                  }

  82.                         }
  83.                   }
  84.         }else{//當按鍵松開
  85.                 keyflag();
  86.         }//按鍵1結束

  87.     if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉電存儲的標志位改為1,進行存值操作
  88.                                 switch(keynum){
  89.                                         case 1:
  90.                                                 bainum11++;//數碼管一加加
  91.                                                 if(bainum11>9){//當數碼管一加加到9時置為1
  92.                                                         bainum11=0;
  93.                                                 }
  94.                                                 break;
  95.                                         case 2:shinum11++;if(shinum11>9){shinum11=0;}break;
  96.                                         case 3:genum11++;if(genum11>9){genum11=0;}break;
  97.                                         case 4:bainum22++;if(bainum22>9){bainum22=0;}break;
  98.                                         case 5:shinum22++;if(shinum22>9){shinum22=0;}break;
  99.                                         case 6:genum22++;if(genum22>9){genum22=0;}break;
  100.                                         default:break;
  101.                                 }
  102.                         }}}else{keyflag();displaynum();
  103.                                         if((flag_eeprom1==1))//加掉電存儲,必需加到這,不然有一些小問題
  104.                                         {   flag_eeprom1=0;
  105.                                             saveeepro();//掉電存儲
  106.                                         }
  107.                         }//松開按鍵進行顯示

  108.     if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
  109.                                 switch(keynum){
  110.                                         case 1:
  111.                                                 bainum11--;//數碼管一減減
  112.                                                 if(bainum11>111){//當數碼管一減減到0時置為9
  113.                                                         bainum11=9;
  114.                                                 }
  115.                                                 break;
  116.                                         case 2:shinum11--;if(shinum11>111){shinum11=9;}break;
  117.                                         case 3:genum11--;if(genum11>111){genum11=9;}break;
  118.                                         case 4:bainum22--;if(bainum22>111){bainum22=9;}break;
  119.                                         case 5:shinum22--;if(shinum22>111){shinum22=9;}break;
  120.                                         case 6:genum22--;if(genum22>111){genum22=9;}break;
  121.                                         default:break;
  122.                                 }                               
  123.                         }}}else{keyflag();displaynum();if((flag_eeprom1==1)){flag_eeprom1=0;saveeepro();}}//松開按鍵進行顯示       

  124. }//按鍵結束
  125. void displaynum(){//將數字傳到數碼管上顯示
  126.         if (if0==0){//當if0==0時num1三個數碼管進行顯示               
  127.                 genum1=inum1%10;//個位
  128.                 shinum1=inum1/10%10;//十位
  129.                 bainum1=inum1/100;//百
  130.         }else{
  131.                 bainum1=bainum11;
  132.                 shinum1=shinum11;
  133.                 genum1=genum11;
  134.                 inum1=bainum11*100+shinum11*10+genum11;        //將num1三個數碼管的值付給inum
  135.         }
  136.         if (if1==0){
  137.                 genum2=inum2%10;
  138.                 shinum2=inum2/10%10;
  139.                 bainum2=inum2/100;
  140.         }else{
  141.                 bainum2=bainum22;
  142.                 shinum2=shinum22;
  143.                 genum2=genum22;
  144.                 inum2=bainum22*100+shinum22*10+genum22;}
  145.                                          
  146. }
  147. void timer0(void)interrupt 1  {//定時器0          
  148.         //500等于1秒
  149.         TL0 = 0xCD;                //重新設置定時器0時間為2ms
  150.         TH0 = 0xF8;                //重新設置定時器0的初始值
  151.         tcnt1++;//用于刷新數碼管
  152.         presstime++;//按鍵用到,用于防抖       
  153.         if (if0==0){//當if0等于0時
  154.                 isecond1++;//當觸發1觸發后進行計數(秒)
  155.                 if (isecond1==500){//一秒時間到
  156.                         isecond1=0;//置為0,重新開始計
  157.                         //iminute1++;
  158.                         //if(iminute1==60){//說明一分鐘到了
  159.                         //        iminute1=0;
  160.                                 inum1--;//inum進行減減
  161.                                 if(inum1==0){//當inum等于0時
  162.                                         if0=1;//將標志位if0置為1
  163.                                         it0=1;//將標志位it0置為0,out1斷開
  164.                                 }
  165.                 //        }
  166.                 }
  167.         }//觸發端子1的計時結束
  168.         if (if1==0){isecond2++;if (isecond2==500){isecond2=0;
  169.         //iminute2++;if(iminute2==60){iminute2=0;
  170.                         inum2--;if(inum2==0){if1=1;it1=1;}}}//}//觸發端子2的計時
  171.         switch(tcnt1){
  172.         /**************數碼管1-開始*****************/
  173.           case 1: P2=0XFF; P0=seg7code[bainum1];if(keynum==1 || keynum==0){P2=wei1[2];}break;
  174.           case 2: P2=0XFF; P0=seg7code[shinum1];if(keynum==2 || keynum==0){P2=wei1[1];}break;
  175.           case 3: P2=0XFF; P0=seg7code[genum1]; if(keynum==3 || keynum==0){P2=wei1[0];}break;
  176.         /**************數碼管1-結束*****************/
  177.         /**************數碼管2-開始*****************/       
  178.           case 4: P2=0XFF; P0=seg7code[bainum2];if(keynum==4 || keynum==0){P2=wei2[2];}break;
  179.           case 5: P2=0XFF; P0=seg7code[shinum2];if(keynum==5 || keynum==0){P2=wei2[1];}break;
  180.           case 6: P2=0XFF; P0=seg7code[genum2]; if(keynum==6 || keynum==0){P2=wei2[0];}break;
  181.         /**************數碼管2-結束*****************/       
  182.           default: tcnt1=0; P2=0XFF; break;
  183.          }
  184. }//定時器0結束
  185. void keyflag(){//按鍵結束調用,按鍵的建議使用,這樣可以減小code,但是觸發的不建議
  186.            if(kt0){//當標志位kt0=1的時候進行
  187.                    if(presstime>100){//當時間值大于一百的時候
  188.                         kf0=1;//標志位kf0=1
  189.                         kt0=0;//標志位kt0=0
  190.                            presstime=0;//時間清零,重新進行
  191.                         }
  192.            }
  193. }

  194. void saveeepro(){//掉電存儲
  195.                          inum11=inum1/100;//把int型的值拆分到char型
  196.                          inum12=inum1%100;
  197.                          inum21=inum2/100;
  198.                          inum22=inum2%100;
  199.                             Sector_Erase(0);           //擦除0x01地址中的數據          一定要先擦除再寫進  同一地址                               
  200.                       Byte_Program(0x01,inum11);            //擦除完成就可以寫入了
  201.                           Byte_Program(0x02,inum12);            //擦除完成就可以寫入了
  202.                       Byte_Program(0x03,inum21);            //擦除完成就可以寫入了
  203.                           Byte_Program(0x04,inum22);            //擦除完成就可以寫入了
  204. }

復制代碼
0.png 0.png

所有資料51hei提供下載:
GYJ-0041_學習型顏色識別傳感器發貨資料.rar (1.4 MB, 下載次數: 28)





回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人精品久久久国产成人一区 | 69视频在线播放 | 国产在线色| 国产美女一区二区 | 国产精品视频播放 | 一区二区国产精品 | 国产精品久久久久久久久免费桃花 | 国产精品1区 | 久久av影院 | 成人精品国产免费网站 | 日本精品一区二区三区在线观看视频 | 日韩成人av在线播放 | 午夜视频网站 | 亚洲福利在线观看 | 久草网址 | 日韩www | av片在线播放 | 日韩欧美中文字幕在线观看 | 日韩中文字幕一区 | 日本视频免费 | 亚洲精品456| 成av在线 | 欧美一卡二卡在线观看 | 午夜欧美| 国产精品久久久久aaaa | 久久久久久久国产 | 自拍偷拍第1页 | 欧美成人精品在线观看 | 在线播放中文字幕 | 亚洲品质自拍视频网站 | 久久久精彩视频 | 天堂成人国产精品一区 | 91精品国产综合久久精品图片 | 黄色大全免费看 | 伊人免费视频二 | 欧美日韩在线高清 | 一色一黄视频 | 国产 欧美 日韩 一区 | 国产成人精品免高潮在线观看 | 91在线精品视频 | 最新黄色毛片 |