
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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)