1. 首页 > 科技快讯 >

51单片机应用200实例(51单片机实例100)

西门子s7 200plc读取51单片机数据

没用过PLC,但基本原理不难。

51单片机应用200实例(51单片机实例100)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 //51单片机头文件

#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 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息