电路原理图如下:
设计要求
(1)利用光电开关计数系统,可在0-999任意设定计数值,超过设定值时,步进电机停止。计数时步进电机以某一恒定速度转动。
(2)超过设定值后利用220V报警灯提示。
(3)数码管显示当前计数值和设定值。(按键选择是出于设定还是计数状态)
单片机程序如下:
#include
#include
#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等于哪个,就执行哪个。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』