西门子s7 200plc读取51单片机数据
没用过PLC,但基本原理不难。
51单片机应用200实例(51单片机实例100)
首先PLC与单片机之间建立通信,这个通信可以是标准通信协议,例如串口通信、SPI、I2C等,需要读取时,PLC发送读取命令到单片机,单片机返回数据(a)。
也可以是自己做的非标通信协议。当然,推荐用标准通信协议。
51单片机C语言应用程序设计实例精讲的介绍
《51单片机C语言应用程序设计实例精讲》通过大量的实例,介绍了51单片机各种C语言应用专题程序设计的流程、方法、技巧及设计思想。全书共分31章,第1章~第3章为基础知识,介绍了51单片机开发的硬件结构、指令系统、C语言设计以及Keil8051C编译器知识;第4章~第31章为本书的重点,通过28个典型的C语言应用实例,介绍了51单片机的各种应用开发和使用技术,包括输入,输出、数据采集,控制系统、存储系统与外设扩展、信号与算法实现、网络通信与传输、电源监控与抗干扰设计。
51的用途很广,从仪器仪表、工控、计算机测控技术里用的很多,曾经看郭一篇文章说某导弹车的控制系统里就有2051,还有说西门子的工控设备里有51单片机。我觉得用的多的一般都不是标准型的51,用曾强型的多。以现在的行业来看pic的应用范围比51广。
单片机是最基本的技术,学会了单片机也只是个普通匠人,最好学好单片机后再往cpld、fpga、dsp方面发展。学无止尽啊。
LED的电压/电流非固定, 呈现曲线变化, 你要先查规格文件选好预计使用的电流量及压降. 然後计算分压後, R值应为多少, 可以得到预期的电流量. 如果LED压降太高, 可能输入电源电压值就已经不够了.
T0的在自动重装方式的最长定时时间是256us,那么只有用软件计数了,
不知你的机是运行在什么时钟/机器周期
,我设是6时钟,那么我令T0的溢出时间为200us
那么T0的初值为56
下面是程序片段
TIMECON DATA 28H;T0溢出计数器单元
T0TIME EQU 100; 溢出次数
ORG 000BH
LJMP CTC0
ORG 100H
MIAN:
MOV SP,#5FH
MOV TL0,#56;送初值
MOV TH0,#56;
ANL TOMD,#0F0H;TOMD高4位不变,T1工作方式不
;变
ORL TMOD,#02H;定义T0工作方式
SETB ET0
SETB TR0
SJMP$
CTC0:
DJNZ TIMECON,SETP
MOV TIMECON,T0TIME
SETP: ;SETP里面的内容跟你的T1嵌套即可
使T1计数
RETI
写在最后:其实写程序就应该自己写写,多写才会熟,当真的不懂时再找别的出路,而且楼上zhaojun_xf的做法不是很好,直接丢出个程序,完全抹杀别人的思想,这样不好。
你可以定义一个unsigned char的全局变量inc,设置T0为4ms定时(也就是一次定时溢出),每当进入一次中断,inc就加1,计满50次后(就相当与200ms)后,接下来想做什么自己决定,同时让inc请零,以备可以进行下一次200ms的计数.
当定时的时间远远超过定时器满量程的定时时间时,,通常把定时溢出和溢出计时变量同时使用.
Good Luck
6mz的晶振 可算出一个时钟周期为2微秒,200毫秒去除一下2微秒就是10000,然后吧10000取16进制为 27A0 ,用 FFFF减27A0再加1 得 C860,用定时方式一,TL0 ,#60H
TH0, #C8H
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:
#include
#include
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}void main() //主函数
{uchar a,i,j;
while(1) //大循环
{a=0xfe; //赋初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_crol_(a,1); //将a变量循环左移一位
}a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_cror_(a,1); //将a变量循环右移一位
}}
}2、51单片机是对所有兼容Intel
8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash
rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
#include
#include
#define LED P2
void delay(char i);
void main()
{ unsigned char LedVablue=0xFE;
while(1)
{LedVablue= _crol_(LedVablue,1); //_crol_(x,Y)是
//里面的一个库函数,相当于汇编的带进位循环
LED=LedVablue;
delay(100);
}}
void delay(char i)
{char j;
for(;i>0;i--)
for(j=0;j<250;j++);
}
字符型char 默认为signed类型
所以你的延时子程序里j循环条件一直满足
程序调用第一个delay(100)时陷入死循环
此时led=11111110 所以只有第一个灯一直亮
就会这种解释了
你确认只把初值
LED = 0xfe改成~LED = 0?
//---------------------------------------
//头文件
#include
//---------------------------------------
//---------------------------------------
//数据类型替代声明
#define u8 unsigned char
#define u16 unsigned int
//---------------------------------------
u8 led[8]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};
//---------------------------------------
//延时子函数 延时时间为n毫秒
void delay_ms(u8 n)
{u16 i;
for(;n>0;n--)
{for(i=114;i>0;i--)
{;
}}
}//---------------------------------------
//---------------------------------------
//流水一次子函数
void liushui(void)
{u8 i;
for(i=0;i<=7;i++)
{P0=led[i];
delay_ms(240);
}}
//---------------------------------------
//---------------------------------------
//主函数
void main(void)
{while(1)
{liushui();
}}
//---------------------------------------
#include
#define LED P2
void delay();
void main()
{char n;
while(1)
{LED = 0xfe;
delay();
for(n=0;n<8;n++)
{LED = (LED << 1) | 0x01;
delay();
}}
}void delay()
{char j1,j2,j3;
for(j3=0;j3<10;j3++)
{for(j2=0;j2<100;j2++)
{for(j1=0;j1<100;j1++){}
}}
}试试这个程序
我不知道你的编译器是怎样定义char的,如果char定义为有符号变量的话,char就是-127至+128大小的有符号的变量,你的for(j=0;j<250;j++)里面j<250,这个条件就会永远满足,所以就死循环了
void delay(char i)
{char j; ////////你这个j有问题,应该
//要改为unsigned char j;
//不然j永远不会达到250,这样就成了死循环
for(;i>0;i--)
for(j=0;j<250;j++);
}
unsigned char 0~255
char -127~128
电路接法?
你是置低亮 还是拉高亮啊~~~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。