×
单片机 > 单片机程序设计 > 详情

51单片机的光电开关计数

发布时间:2021-06-24 发布时间:
|

电路原理图如下:

设计要求

(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等于哪个,就执行哪个。





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会