PIC程序设计问题

PIC程序设计问题,第1张

#include "pic.h"

unsigned char dispbitcnt //数码管位码扫描变量

unsigned char second //秒变量

unsigned char minite //分团歼告变量

unsigned char hour //时变量

unsigned char tcnt //秒信号产生变量

unsigned char mstcnt //扫描时间变量

const unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90}

//0123456789段码

const unsigned char dispbitcode[6]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf}

//123456位码

unsigned char dispbuf[6]={0,0,0,0,0,0}

//缓冲数组

//**************TMR0中断数码管扫描程序塌明*********************

void interrupt tmr0(void)

{

if(T0IE &&T0IF)

{

T0IF=0 //清除中断标志位

{

PORTC=dispcode[dispbuf[dispbitcnt]]

PORTA=dispbitcode[dispbitcnt]

dispbitcnt++

if(dispbitcnt==6)

{dispbitcnt=0

}

}

tcnt++ //中断产生秒信号

if(tcnt==244)

{tcnt=0

second++

if(second==60)

{second=0

minite++

if(minite==60)

{minite=0

hour++

if(hour==24)

{hour=0

}

}

}

dispbuf[4]=second%10

dispbuf[5]=second/10

dispbuf[2]=minite%10

dispbuf[3]=minite/10

dispbuf[0]=hour%10

dispbuf[1]=hour/10

}

}

}

///****************1ms延改衡时程序******************

void delay_1ms(unsigned int i)

{

unsigned char j

for(i!=0i--)

for(j=141j!=0j--)

}

///****************按键检测*********************

void key_scan(void)

{

while(1)

{

if(RB0==0)

{

delay_1ms(20)

if(RB0==0)

{second++

if(second==60)

{second=0

}

dispbuf[4]=second%10

dispbuf[5]=second/10

while(RB0==0)

}

}

if(RB1==0)

{

delay_1ms(20)

if(RB1==0)

{

minite++

if(minite==60)

{minite=0

}

dispbuf[2]=minite%10

dispbuf[3]=minite/10

while(RB1==0)

}

}

if(RB2==0)

{

delay_1ms(20)

if(RB2==0)

{

hour++

if(hour==24)

{

hour=0

}

}

dispbuf[0]=hour%10

dispbuf[1]=hour/10

while(RB2==0)

}

}

}

//***************端口初始化***********************

void PORT_INIT(void)

{

TRISA=0 //A口输出

ADCON1=0x06//数字I/O

TRISC=0 //C口输出

TRISB=0XFF //B口输入

}

//***************TMR0初始**************************

void TMR0_INIT(void)

{

GIE=1 //开启全局中断

OPTION=0X03//开启内部上拉,预分频比1/16

T0IF=0 //清中断标志

T0IE=1 //允许TMR0中断

}

//*************主程序********************

void main(void)

{

while(1)

{

dispbitcnt=0

PORT_INIT()

PORTC=0x00 //开段码

PORTA=0x00 //开位码

delay_1ms(200) //延时

delay_1ms(200) //延时

delay_1ms(200) //延时

delay_1ms(200) //延时

PORTA=0xff //关位码

TMR0_INIT()//调初始子程序

TMR0=0 //开启TMR0中断

key_scan() //按键检测子程序

}

}

PIC系列单片机的查表程序可以利用子程世逗序带值返回的特点来实现。

具体是在主程序中先取出表数据拿此地址放入W,接着调用子程序,子程序的第一条指令将消返迅W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据返回到主程序。

西门子特殊存储器(SM)标志位:

SM0.0-PLC上电运行时,该位始终为1(始终为ON)。

SM0.1-该位在首次扫描时为1,慎物首用途之一是调用初始化子程蚂蔽序。

SM0.1、SM0.0是这两个是西门子PLC的特殊存储器。SM0.0:上电后该位始终为1;SM0.1:该位在首次扫描时为1,然后为0,用途之一是调用初始化子程序。

特殊标志继电器(SM) 的使用方法:

特殊标志继电器用“SM”表示,特殊标志继电器区根据功能和性质不同具有位、字节、字和双字 *** 作方式。其中SMB0、SMB1为系统状态字,只能读取其中的状态数据,不能改写,可以位寻址。系统状态字中部分常用的标志位说明如下: SM0.0:始终接通;

SM0.1:首宽数次扫描为1,以后为0,常用来对程序进行初始化;

SM0.2:当机器执行数学运算的结果为负时,该位被置1;

SM0.3:开机后进入RUN方式,该位被置1一个扫描周期;

SM0.4:该位提供一个周期为1分钟的时钟脉冲,30秒为1,30秒为0;

SM0.5:该位提供一个周期为1秒钟的时钟脉冲,0.5秒为1,0.5秒为0;

SM0.6:该位为扫描时钟脉冲,本次扫描为1,下次扫描为0;

SM1.0:当执行某些指令,其结果为0时,将改位置1;

SM1.1:当执行某些指令,其结果溢出或为非法数值时,将改位置1;

SM1.2:当执行数学运算指令,其结果为负数时,将改位置1;

SM1.3:试图除以0时,将改位置1;

S7-200中SM0.0的用法:

1、SM0.0在程序运行时始终为ON。

2、SM0.0是一个无条件的常闭触点,用来启动无条件运行的指令。 只要上电,SM0.0必然是“1”。因此程序中那些不受任何条件限制,必须要执行的指令就用它作为触发触点。PLC-家园 plczone.com


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12504342.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存