电路原理图如下:
电路图
设计要求
(1)利用光电开关计数系统,可在0-999任意设定计数值,超过设定值时,步进电机停止。计数时步进电机以某一恒定速度转动。 (2)超过设定值后利用220V报警灯提示。 (3)数码管显示当前计数值和设定值。(按键选择是出于设定还是计数状态)
单片机程序如下: - #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit p1=P2^0;
- sbit p2=P2^1;
- sbit p3=P2^2;
- sbit p4=P2^3;
- sbit q1=P2^4;
- sbit q2=P2^5;
- sbit q3=P2^6;
- uchar zongshu,szzongshu;
- uchar baiwei,shiwei,gewei;
- uchar buff,times,j;
- uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar idata value[8];
- uchar key,a1,a2,a3;
- void fs_chushihua (void)
- {
- SCON=0x50; //串行控制寄存器01010000,工作方式1,允许接收
- TMOD=0x20; //工作方式控制寄存器00100000,定时器1,工作方式2
- TH1=0xfd;
- TL1=0xfd; //设置波特率9600
- TI=0; //发送中断标识位,=1表示发送结束
- TR1=1; //打开定时器T1
- }
- void delay (void)
- {
- uint i;
- for (i=0;i<230;i++);
- }
- void delay1ms (void) //开机延时1ms
- {
- uchar i;
- for (i=200;i>0;i--);
- }
- void delay5ms (void) //防止抖动,延时5ms
- {
- unsigned char i,j;
- for (i=5;i>0;i--)
- for (j=230;j>0;j--);
- }
- void xianshi (void)
- {
- switch (value[times-1])
- {
- case 0 : P0=dispcode[value[times-1]];break;
- case 1 : P0=dispcode[value[times-1]];break;
- case 2 : P0=dispcode[value[times-1]];break;
- case 3 : P0=dispcode[value[times-1]];break;
- case 4 : P0=dispcode[value[times-1]];break;
- case 5 : P0=dispcode[value[times-1]];break;
- case 6 : P0=dispcode[value[times-1]];break;
- case 7 : P0=dispcode[value[times-1]];break;
- case 8 : P0=dispcode[value[times-1]];break;
- case 9 : P0=dispcode[value[times-1]];break;
- }
- }
- void key_scan (void) //键盘输入扫描函数
- {
- uchar hang,lie;
- P1=0xf0;
- if ((P1&0xf0)!=0xf0) //行码为0,列码为1
- {
- delay1ms();
- if((P1&0xf0)!=0xf0) //有键按下,列码变为0
- {
- hang=0xfe; //逐行扫描
- times++;
- if (times==9)
- times=1;
- while ((hang&0x10)!=0) //扫描完4行后跳出
- {
- P1=hang;
- if ((P1&0xf0)!=0xf0) //本行有键按下
- {
- lie=(P1&0xf0)|0x0f;
- buff=((~hang)+(~lie));
- switch (buff) //buff等于哪个,就执行哪个。
复制代码
更多请下载附件!!
全部资料51hei下载地址:
光电计数.rar
(279.5 KB, 下载次数: 115)
|