时辰钟编程
A. 用plc编程24小时时钟程序
没有分没有写程序动力,告诉你思路吧
1、OB35
设定1000ms循环
2、在ob35中个累加,并且安分钟和小时寄存
3、比较,当分钟的寄存器=30时,继电器输出1s
4、分钟继存器=0时,写一段循环程序:当当前小时大于临时寄存器
进行下面的程序,继电器的输出1s和一个临时寄存器的累加,
当临时寄存器的累加值大于当前小时,就不进行循环,
5、秒闪烁这个就是500ms输出,然后弄一个500ms定时器进行不输出。
就这么多了,很简单的程序,
B. VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦
图11
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity xuan21 is
Port ( alarm,a,b: in std_logic;
y:out std_logic);
end xuan21 ;
architecture one of xuan21 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
仿真波形如下图12:
图12
(2)三位二选一:
模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。
图13
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity x213 is
Port ( alarm : in std_logic;
y:out std_logic_vector(3 downto 0);
a,b: in std_logic_vector(3 downto 0));
end x213;
architecture one of x213 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
仿真结果如下图14:
图14
8、整点报时及闹时:
模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。
图15
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity voice is
Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);
in_1000,in_500:in std_logic;
q : out std_logic);
end voice;
architecture one of voice is
begin
process(min1,min0,sec1,sec0)
begin
if min1="0101" and min0="1001" and sec1="0101" then
if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"
then q<=in_500;
elsif sec1="0101" and sec0="1001" then q<=in_1000;
else q<='0';
end if;
else q<='0';
end if;
if min1=mh and min0=ml and hou1=hh and huo0=hl then
q<=in_1000;
end if;
end process;
end one;
仿真波形如下图16
图16
9、顶层原理图:
三、感想
通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示
:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
四、参考资料:
1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,2000.(1)
2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004
3、李衍编着,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005
4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004
5、沈明山编着,EDA技术及可编程器件应用实训北京:科学出版社,2004
6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997
7、辛春艳编着,VHDL硬件描述语言北京:国防工业出版社,2002 就这些
C. 可编程作息时间控制器程序设计
主程序: 在程序开始时,首先初始化,设置中断0源允许、总允许为一,两个定时器的工作模式为一模式,整个程序由P2.6接低电平时启动,启动后,进入A段工作。在A短工作中调用显示子程序,A段工作完时进入B段工作,每段工作时都要调用显示子程序,,最后一段工作完时,关闭显示,即对P2送入0FFH
显示子程序:首先,对定时器赋初值,然后进行拆字,拆字采用除以十进行,除以十后,分别把商和余数送到显缓单元,再查七段码,把七段码送到P1,送字位口到P2口,进行动态显示,每次显示一位时延时255个指令周期(即FFH个指令周期),四位显示完后,再进行多次扫描,保证人眼看不到闪烁,最后判断设定的工作时间到没,到了几跳出显示子程序。
中断程序:进入中断后输出报警信号,同时显示器全部显示0,,最后跳出中断。
四:程序及其说明:
1.程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP BAOJING
ORG 0010H
;初始化程序
MAIN:SETB EA ;设置中断
SETB EX0
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,#0AH ;A段工作时间
CLR P3.4 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.4 ;关断外部驱动
MOV 41H,#0BH ;工作于B段
MOV R7,#14H ;B段工作时间
CLR P3.5 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.5 ;关断外部驱动
MOV 41H,#0CH ;工作于C段
MOV R7,#1EH ;C段工作时间
CLR P3.6 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.6 ;关断外部驱动
MOV 41H,#0DH ;工作于D段
MOV R7,#28H
CLR P3.7 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.7 ;关断外部驱动
MOV P2,#0FFH ;关显示
LJMP HERE ;返回判断处,确定是否继续工作
;中断报警程序
BAOJING: MOV P2.4,#00H ;指示灯亮
Mov P2.5,#00H
MOV TL0,#0E0H ;定时20ms
MOV TH0,#0B1H
SETB TR0 ;启动定时
LP:MOV P1,#3FH ; 全部显示为零
MOV P2,#00H
MOV P2.5,#00H ;扬声器工作
JNB TF0,LP ;查询定时时间到否
SETB P2.4 ;关指示灯
SETB P2.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 ;查七段码、显示
MOVC A,@A+DPTR
MOV P1,A
MOV P2,R5
LP4: DJNZ R4,LP4
INC R0 ;修改指针
MOV A,R5 ;改变显示单元
RL A
MOV R5,A
JB ACC.4,LP3 ;判断四位是否显示完
SETB TR1 ;启动定时器
JNB TF1,LP2 ;判断定时时间是否到
DJNZ R1,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指令)即可查出对应的七段码。 希望被采纳啊!!好长时间菜找到
D. 西门子PLC时钟指令晚上19时到早晨06怎么样编程
如图所示,READ_RTC是时钟读取指令,读取完后,VB0为年,VB1为月,VB2为日,VB3为时,VB4为分,VB5为秒,VB7为星期。因此用VB3做比较指令,与19和6进行比较就可以了。
望采纳。。。。。。
E. 用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设计的电路图
其实不用定时中断也能实现功能:
#include<reg51.h> 主函数
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定义0-9数组
unsigned int tmp;定义变量
void delay(unsigned int xms)定义延时函数
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定义子函数
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{
unsigned char z,s=00,m=00,h=00;给时钟初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小时显示
disp();
P2=tab[h%10];
disp();
P2=tab[m/10];分钟显示
disp();
P2=tab[m%10];
disp();
P2=tab[s/10];秒显示
disp();
P2=tab[s%10];
disp();
}
s++;
while(s==60)秒进一位,到60清0
{
m++;
s=00;
}
while(m==60)分钟进一位,到60清0
{
h++;
m=00;
}
while(h==24)小时进一位,到24清0
{
h=00;
}
}
}