找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3026|回复: 0
打印 上一主题 下一主题
收起左侧

学习型颜色识别传感器可编程工控板单片机源码与原理图等资料

[复制链接]
跳转到指定楼层
楼主
一、板子尺寸:长113mmX宽72mmX18mm
二、主要器件:单片机、数码管、继电器
三、工作电压:有12V24两种可供选择
四、板子功耗:小于300mA
芯片采用STC12C5A60S2单片机

学习型颜色识别传感器可编程工控板的电路原理图:


元件清单:




单片机源程序如下:
  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. }

复制代码


所有资料51hei提供下载:
GYJ-0041_学习型颜色识别传感器发货资料.rar (1.4 MB, 下载次数: 28)





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表