找回密码
 立即注册

QQ登录

只需一步,快速开始

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

3路纺织断线报警器电路设计程序分享 附件有原理图和程序打包好的源码

[复制链接]
跳转到指定楼层
楼主

【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!   
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h>                  //计算小数点的头文件
#include <intrins.h>          //用nop函数延时的头文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
/*数据类型定义*/
typedef signed char        int8;
typedef signed int        int16;
typedef signed long        int32;
typedef unsigned char        uint8;
typedef unsigned int        uint16;
typedef unsigned long        uint32;

#define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83//SYSCLK<12MH
#define IAP_ADDRESS 0x0000        //存储地址
#define FOSC 11059200L  
#define BAUD 9600  
uint8 sendBuf[10];          //发送缓冲区
uint8 receBuf[10];    //接收缓冲区  
sbit IN1 =  P1^0;                        /*单片机1.0引脚检测IN1是否动作*/
sbit IN2 =  P1^1;                        /*单片机1.1引脚检测IN2是否动作*/
sbit IN3 =  P1^2;                        /*单片机1.2引脚检测IN4是否动作*/
sbit IN4 =  P1^3;                        /*单片机1.3引脚检测IN2是否动作*/

sbit OUT1 = P3^5;                    /*单片机3.5引脚控制继电器OUT1*/
sbit OUT2 = P3^4;                    /*单片机3.4引脚控制继电器OUT2*/
sbit OUT3 = P3^3;                    /*单片机3.3引脚控制继电器OUT3*/
sbit OUT4 = P3^2;                    /*单片机3.2引脚控制继电器OUT4*/

sbit S1 = P5^4;                    /*单片机按键S1*/
sbit S2 = P5^5;                    /*单片机按键S2*/

sbit COM1 = P3^6;                    /*数码管显示位个位*/
sbit COM2 = P3^7;                    /*数码管显示位十位*/

//code uchar seg7code[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; //显示段码
code uchar seg7code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴数码管显示段码
uchar date;
bit  bz1=0;
bit  bz2=0;
bit  bz3=0;
bit  bz4=0;
bit  bz5=0;
bit  bz6=0;

bit sjbz1=0;
bit sjbz2=0;
bit write=0;
uint sec1=0;
uint sec2=0;
uint sec3=0;
uint sec4=0;
uint tcnt=0;
uint sj1;
uint sj2;
uchar A1,B1,C1,D1;
uchar r;
bit flag_zx=0;

bit bjbz1=0;
bit bjbz2=0;
bit bjbz3=0;
bit bjbz4=0;
/********************************************************************
                                                                        定义 ISP/IAP/EEPROM 命令
*********************************************************************/

void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
uint8 IapReadByte(uint16 addr);//读数据
void IapProgramByte(uint16 addr, uint8 dat);//写数据
void IapEraseSector(uint16 addr);//擦除数据
/********************************************************************
                                                                        延时函数
*********************************************************************/
void delay(uchar dat)//延时程序
{
uchar m,n,s;
for(m=dat;m>0;m--)
for(n=2;n>0;n--)
for(s=248;s>0;s--);
}
/****************发送函数*********************/
void senduart1()
{          
SBUF='R';while(!TI);TI=0;
SBUF='E';while(!TI);TI=0;
SBUF='A';while(!TI);TI=0;
SBUF='D';while(!TI);TI=0;
}
/********************************************************************
                                                                        定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
tcnt++; //每过250ust tcnt 加一
if(tcnt==400) //计满400 次(1/10 秒)时
{
tcnt=0; //重新再计
if(bjbz1==1){sec1++;if(sec1>=date){sec1=0;OUT1=0;bjbz1=0;}}
if(bjbz2==1){sec2++;if(sec2>=date){sec2=0;OUT2=0;bjbz2=0;}}
if(bjbz3==1){sec3++;if(sec3>=date){sec3=0;OUT3=0;bjbz3=0;}}
//if(bjbz4==1){sec4++;if(sec4>=date){sec4=0;OUT4=0;bjbz4=0;}}

}
}
/********************************************************************
                                                                        按键函数
*********************************************************************/
void key()
{
if((S1==0)&&(bz1==0)){delay(1);if(S1==0){bz1=1;if(date<100){date++;}}}if((S1==1)&&(bz1==1)){delay(1);if(S1==1){write=1;bz1=0;}}
if((S2==0)&&(bz2==0)){delay(1);if(S2==0){bz2=1;if(date>=1){date--;}}} if((S2==1)&&(bz2==1)){delay(1);if(S2==1){write=1;bz2=0;}}


//if((IN4==0)&&(bz6==0)){delay(1);if(IN4==0){bz6=1;OUT1=1;OUT2=1;OUT3=1;OUT4=1;bjbz1=0;sec1=0;bjbz2=0;sec2=0;bjbz3=0;sec3=0;}}
//if((IN4==1)&&(bz6==1)){delay(1);if(IN4==1){bz6=0;}}

if(IN1==0){bjbz1=1;} else {OUT1=1;sec1=0;}
if(IN2==0){bjbz2=1;} else {OUT2=1;sec2=0;}
if(IN3==0){bjbz3=1;} else {OUT3=1;sec3=0;}

if((OUT1==0)||(OUT2==0)||(OUT3==0)){delay(1);if((OUT1==0)||(OUT2==0)||(OUT3==0)){OUT4=0;}} else {OUT4=1;}

}

/********************************************************************
                                                                        显示函数
*********************************************************************/
void xianshi()
{
A1=date/10;
B1=date%10;
COM1=1;COM2=1;P2=seg7code[A1];COM1=0;COM2=1;delay(1);//十位显示
COM1=1;COM2=1;P2=seg7code[B1];COM1=1;COM2=0;delay(1);//个位显示
}
/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
uchar i;
for(i=0;i<5;i++)
{
receBuf=0;
}
}
/********************************************************************
                                                                        主函数
*********************************************************************/
void main()                                  
{
P2M0=0Xff;P2M1=0X00;
P5M0=0X00;P5M1=0X00;       
SCON = 0x50;
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14;               
AUXR |= 0x01;              
ES = 1;                  
EA = 1;

date= IapReadByte(0x01);//读取存储的值
if(date>=100){date=2;write=1;}

TMOD=0x02; //定时器工作在方式2
TH0=0x06; //对TH0 TL0 赋值
TL0=0x06;
TR0=1; //开始定时
ET0=1;
EA=1;
sec1=0;sec2=0;sec3=0;sec4=0;
COM1=1;COM2=1;
while(1)
{

key();//调用按键函数
xianshi();//调用显示函数        

if(write==1)  //存储数据
{
write=0;
IapEraseSector(0);  //擦除扇区
IapProgramByte(0x01,date);//写入新的地址                           
}
}               
}
/********************************************************************
                                                                                串口中断函数
*********************************************************************/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI=0; //接收标志清零
receBuf[r++&0x0F]=SBUF;     //把接受的数据存储到BUT数组中
if(receBuf[0]!=0xaa){r=0;}
if(r>=5)
{        r=0;

flag_zx=1;
}
}
if(flag_zx==1)
{                     

flag_zx=0;
//0         1     2      3     4               
//起始位   千位  百位   十位  个位
if(receBuf[0]==0xaa)          //如果开始位和结束位,还有地址都正确,进行下一步判断
{
A1=receBuf[1];
B1=receBuf[2];
C1=receBuf[3];
D1=receBuf[4];
write=1;
clear_receBuf();
}
}

}

/********************************************************************
                                                                                结束
*********************************************************************/
void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
IAP_CONTR = 0;           //
IAP_CMD = 0;           //
IAP_TRIG = 0;           //
IAP_ADDRH = 0x80;  //
IAP_ADDRL = 0;           //
}
uint8 IapReadByte(uint16 addr){//读数据
uint8 dat;
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
dat = IAP_DATA;
IapIdle();
return dat;
}
void IapProgramByte(uint16 addr, uint8 dat){//写数据
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
void IapEraseSector(uint16 addr){//擦除数据
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
/********************************************************************
                                                                                结束
*********************************************************************/

GYJ-0095-B_四路输入输出继电器带数码管显示.pdf

633.29 KB, 下载次数: 4, 下载积分: 黑币 -5

GYJ-0095-B_纺织断线报警器配套程序.zip

1.34 KB, 下载次数: 5, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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