找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6527|回复: 3
收起左侧

基于51单片机的光电开关计数仿真设计+程序

[复制链接]
ID:469198 发表于 2019-3-13 10:45 | 显示全部楼层 |阅读模式
电路原理图如下:

电路图

电路图

计要求
1)利用光电开关计数系统,可在0-999任意设定计数值,超过设定值时,步进电机停止。计数时步进电机以某一恒定速度转动。
2)超过设定值后利用220V报警灯提示。
3)数码管显示当前计数值和设定值。(按键选择是出于设定还是计数状态)

单片机程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit p1=P2^0;
  6. sbit p2=P2^1;
  7. sbit p3=P2^2;
  8. sbit p4=P2^3;

  9. sbit q1=P2^4;
  10. sbit q2=P2^5;
  11. sbit q3=P2^6;


  12. uchar zongshu,szzongshu;
  13. uchar baiwei,shiwei,gewei;
  14. uchar buff,times,j;
  15. uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  16. uchar idata value[8];
  17. uchar  key,a1,a2,a3;

  18. void fs_chushihua (void)
  19. {
  20.    SCON=0x50;          //串行控制寄存器01010000,工作方式1,允许接收
  21.    TMOD=0x20;          //工作方式控制寄存器00100000,定时器1,工作方式2
  22.    TH1=0xfd;         
  23.    TL1=0xfd;                 //设置波特率9600
  24.    TI=0;                         //发送中断标识位,=1表示发送结束
  25.    TR1=1;                         //打开定时器T1
  26. }

  27. void delay (void)
  28. {
  29.   uint i;
  30.   for (i=0;i<230;i++);
  31. }

  32. void delay1ms (void)   //开机延时1ms
  33. {
  34.    uchar i;
  35.    for (i=200;i>0;i--);
  36. }

  37. void delay5ms (void)        //防止抖动,延时5ms
  38. {
  39.    unsigned char i,j;
  40.    for (i=5;i>0;i--)
  41.    for (j=230;j>0;j--);
  42. }

  43. void xianshi (void)
  44. {  
  45.    switch (value[times-1])
  46.    {
  47.        case 0 : P0=dispcode[value[times-1]];break;
  48.            case 1 :        P0=dispcode[value[times-1]];break;
  49.            case 2 :        P0=dispcode[value[times-1]];break;
  50.            case 3 :        P0=dispcode[value[times-1]];break;
  51.            case 4 :        P0=dispcode[value[times-1]];break;
  52.            case 5 : P0=dispcode[value[times-1]];break;
  53.            case 6 :        P0=dispcode[value[times-1]];break;
  54.            case 7 : P0=dispcode[value[times-1]];break;
  55.            case 8 :        P0=dispcode[value[times-1]];break;
  56.            case 9 :        P0=dispcode[value[times-1]];break;
  57.    }
  58. }

  59. void  key_scan (void)         //键盘输入扫描函数
  60. {   
  61.    uchar hang,lie;
  62.    P1=0xf0;
  63.    if ((P1&0xf0)!=0xf0)        //行码为0,列码为1
  64.    {
  65.       delay1ms();
  66.           if((P1&0xf0)!=0xf0)  //有键按下,列码变为0
  67.           {
  68.              hang=0xfe;          //逐行扫描
  69.                  times++;
  70.                  if (times==9)
  71.                  times=1;
  72.                  while ((hang&0x10)!=0)         //扫描完4行后跳出
  73.                  {
  74.                     P1=hang;
  75.                         if ((P1&0xf0)!=0xf0)    //本行有键按下
  76.                         {
  77.                            lie=(P1&0xf0)|0x0f;
  78.                            buff=((~hang)+(~lie));
  79.                            switch (buff) //buff等于哪个,就执行哪个。
复制代码


更多请下载附件!!
0.png

全部资料51hei下载地址:
光电计数.rar (279.5 KB, 下载次数: 115)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:864140 发表于 2020-12-21 10:33 | 显示全部楼层
刚好要用到光电开关计数,没想到一下子就找到了这方面的资料,非常有帮助。
回复

使用道具 举报

ID:866712 发表于 2020-12-23 22:49 | 显示全部楼层
不搞电路图 只是单片机可以用吗
回复

使用道具 举报

ID:1066117 发表于 2023-3-28 09:07 | 显示全部楼层
找了好好久,多谢分享,太棒了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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