可编程作息时间控制器程序设计

可编程作息时间控制器程序设计,第1张

程序: 在程序开始时,首先初始化,设置中断0源允许、总允许为一,两个定时器工作模式为一模式,整个程序由P2.6接低电平时启动,启动后,进入A段工作。在A短工作中调用显示子程序,A段工作完时进入B段工作,每段工作时都要调用显示子程序,,最后一段工作完时,关闭显示,即对P2送入0FFH

显示子程序:首先,对定时器赋初值,然后进行拆字,拆字采用除以十进行,除以十后,分别把商和余数送到显缓单元,再查七段码,把七段码送到P1,送字位口到P2口,进行动态显示,每次显示一位时延时255个指令周期(即FFH个指令周期),四位显示完后,再进行多次扫描,保证人眼看不到闪烁,最后判断设定的工作时间到拆指团没,到了几跳出显示子程序。

中断程序:进入中断后输出报警信号,同时显示器全部显示0,,最后跳出中断。

四:程序及其说明:

1.程序:

ORG 0000H

LJMPMAIN

ORG 0003H

LJMPBAOJING

ORG 0010H

初始化程序

MAIN:SETBEA 设置中断

SETBEX0

CLR IT0

MOV TMOD,#11H ;设置定时器工作模式

SETB P3.4 驱动继电器

SETB P3.5

SETB P3.6

SETB P3.7

HERE:JB P2.6,HERE 判断是否启动

进入工作阶段

GONGZUO:MOV 41H,#0AH工作于A段

MOV R7,#0AHA段工作时间

CLR P3.4 ;驱动外部继电器

LCALL SCAN 调显示程序

SETBP3.4;关断外部驱动

MOV 41H,#0BH 工作于B段

MOV R7,#14H ;B段工作时间

CLRP3.5;驱动外部继电器

LCALL SCAN 调显示程序

SETB P3.5 ;关断外部驱动

MOV 41H,#0CH 工作于C段

MOV R7,#1EH ;C段工作时间

CLRP3.6 ;驱动外部继电器

LCALL SCAN 调显示程序

SETBP3.6 ;关断外部驱动

MOV 41H,#0DH 工作于D段

MOV R7,#28H

CLRP3.7;驱动外部继电器

LCALL SCAN调显示程序

SETBP3.7 ;关断外部驱动

MOV P2,#0FFH关显示旅橘

LJMPHERE 返回逗滑判断处,确定是否继续工作

中断报警程序

BAOJING: MOV P2.4,#00H ;指示灯亮

Mov P2.5,#00H

MOV TL0,#0E0H 定时20ms

MOV TH0,#0B1H

SETBTR0 ;启动定时

LP:MOV P1,#3FH 全部显示为零

MOV P2,#00H

MOV P2.5,#00H ;扬声器工作

JNB TF0,LP ;查询定时时间到否

SETBP2.4 ;关指示灯

SETBP2.5 ;关扬声器

RETI

显示子程序

ORG 0F00H

SCAN: MOV 42H,#0EH “—”(横线)的七段码

MOV R1,#32H 延时常数

MOV TL1,#0E0H 定时20ms的常数

MOV TH1,#0B1H

LP1: MOV A,R7 拆字程序(采用除法拆字)

MOV B,#10

DIV AB

MOV 43H,A送显缓单元

MOV 44H,B

LP2: MOV R0,#41H设置显缓的初始单元

MOV R4,#0FFH 延时常数

MOV R5,#0FEH 送字位口

LP3: MOV A,@R0

MOV P2,#0FFH 关显示

MOV DPTR,#TAB 查七段码、显示

MOVCA,@A+DPTR

MOV P1,A

MOV P2,R5

LP4: DJNZR4,LP4

INC R0 修改指针

MOV A,R5 改变显示单元

RL A

MOV R5,A

JB ACC.4,LP3 判断四位是否显示完

SETB TR1 启动定时器

JNB TF1,LP2 判断定时时间是否到

DJNZR1,LP2 延时一秒是否到

DJNZ R7,LP1判断设定时间是否到

RET

ORG 10FFH

七段码表单

TAB: DB 3FH ,06H,5BH, 4FH, 66H,6DH , 7DH

DB 07H, 7FH,6FH,77H, 7CH,39H, 5EH, 40H

2.说明:

主程序:设整个系统工作有四个阶段,分为ABCD段,每段工作时间设为10S、20S、30S、40S,在程序的初始化阶段设定定时器的工作模式、中断允许,程序的运行由单片机的P2.6脚接低电平启动,进入工作阶段,在每个工作阶段显示工作段数和剩余工作时间。

在A段工作时,把“A”这个字符送达41H显缓单元,再设定A段的工作时间,送到R7寄存器中,设定对应的输出脚的工作电平值,然后调显示子程序,A段工作完毕,关闭对应的驱动输出脚。

B、C、D段工作均和A段工作相似,只是驱动不同的输出对象,最后一段工作完后,对P2口赋值高电平,关所有的显示,最后跳回判断处,判断是否继续工作。

显示子程序:在显示子程序中因为每段工作时,均要显示“—”,所以在开始时把“—”的对应序号(在本程序的七段码表中对应的序号为0EH)送到显缓单元,对定时器T1定时20ms进行赋初值,计算初值的公式为:

T1初值=2^n-fosc/12×t

由于定时器工作在1模式,振荡频率为12MHZ,所以计时器T1的初值为:E0B1(十六进制)

将设定的时间进行拆字,然后送到显缓单元。拆字采用除法的方式进行,将定时时间送到寄存器A中,然后在B中送常数10,经过相除后在寄存器A中得到高位送到显缓43H中,在寄存器B中得到低位送到显缓44H单元中,显缓单元指针首先指向显缓首地址,通过变址寻址方式查询对应的七段码送到P1口(字形口),对P2口送入字位口,每个显示位显示后经过延时255指令周期再进入下一步工作。每位显示完后,修改显示单元的指针,对指针单元的当前值自加一,然后对字位口进行左移,修改显示单元,再进行判断四位是否显示完,即判断字位口的第五位是否为1,若为1,则程序转移,继续显示;若为0,则依次执行。四位显示完后,启动定时器1,定时20ms,查询TF1的值,若TF1为0,则在此等待,若TF1为1,则R1自减1并判断是否为0,若不为0,则转移到显示部分,若为0,则顺序执行(即判断1S到否);1S到则R7自减1并判断R7是否为0,若不为0,转移到拆字部分,若为0,则跳出调用(即判断每段工作时间到设定时间没有)。

中断程序:若外部出现故障(外部故障用P3.2接低电平表示),P2.4、P2.5接低电平(即输出报警信号,指示灯亮,扬声器发出声音),对定时器定T0时20ms赋初值,计算公式为:

T0初值=2^n-fosc/12×t

由于定时器工作在1模式,振荡频率为12MHZ,所以计时器T1的初值为:E0B1(十六进制)

对P1口送入“0”的七段码,P2口送入00,每个显示单元全部显示为0,启动定时器,若定时时间没有到,则转到显示处,继续让全部显示0,,若时间到,则对P2.4、P2.5全部送入高电平,关闭报警提示,中断返回。

七段码表单:将要显示的数码或字母的七段码按在日常生活中的默认顺序定义在一个表单中,通过把表单的首地址付给DPTR,再把需要显示的数字或字母的对应序号送到寄存器A中,通过变址寻址的方式(即MOVC指令)即可查出对应的七段码。希望被采纳啊!!好长时间菜找到

共阳数码管中断程序:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]=

{

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x83,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e}

uint num,a

uchar bai,shi,ge

void init()

void delay(uint)

void display(ucharbai,ucharshi,ucharge)

uint fb()

uint fs()

uint fg()

void main()

{

init()

while(1)

{

display(fb(),fs(),fg())

}

}

void init()

{

num=0

a=0

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

}

void display(ucharbai,ucharshi,ucharge)

{

P1=0xfd

P0=table[bai]

delay(1)

P1=0xfb

P0=table[shi]

delay(1)

P1=0xf7

P0=table[ge]

delay(1)

}

void timeoff() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65526-50000)%256

a++

if(a%20==0)

{

num++

if(num==999)

{

num=0

}

}

}

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

uint fb()

{

bai=num/100

return bai

}

uint fs()

{

shi=num%100/10

return shi

}

uint fg()

{

ge =num%100%10

return ge

}

扩展资料

2个可编程定时/计数器羡衡毕·5个中断源,2个优先级(52有6个)

一个全双工串行通信口

外部数据存储器寻址空间为64kB

外部程序存储器寻址空间为64kB

逻辑 *** 作位寻址功能·双列直插40PinDIP封装

单一+5V电源供电

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出

T/C:两个定时/记数器,既可以工作在定时模式,也可以工拦戚作在记数模式;

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石兄芹英晶体和微调电容需要外接。最佳振荡频率为6M—12M。

参考资料来源:百度百科-51单片机


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

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

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存