time0()
interrupt
1
using
1{
//用定时器中断来产生时钟信号
TR1=~TR1
TL0=......
TH1=......
}
serial()
interrupt
4
using
2
//定时器中断串行通信
{
a=SBUF
//a为接收到的数据
RI=0
}
真不知道你是什么意思。51、52单片机串行口是用定时器1或定时器2产生时钟频率的,而且是不用中断方式的,只要打开定时器就可以了。你的意思是用定时器0来产生时钟频率呢还是只作定时?我是当作定时给你编的。
可我又奇怪,看你的设计要求好像不需要定时的。真是搞不懂你。
还有,串行口通信要根据单片机晶振频率,通信波特率来来确定工作方式和定时器初值的,所以你的问题最好再详细点。
直接略过前面的三个主回路不用看,后面开始,先是三个热继电器,不用考虑。然后是三个停止,不用考虑。第一个是SB1按下,KM1得电并自保,同时,给KT1\KT2电,时间继电器开始计时。到设定时间后,KM2、KM3依次启动。很基本的图纸啊。如果要完全的顺序控制,还可以用KM2启动KT3,道理同理KM1启动KT1。因为按要求,应该是电机1启动后,电机2启动,电机2启动后电机3启动。图中设计,如果KT2与KT3时间设定不对,那顺序就错了。
#include <REGX52.H>bit aj = 0
sbit clk1=P1^0 //定义X脉冲输出位
sbit dir1=P1^1 //定义X正反转控制位
sbit ena1=P1^2 //定义Y使能控制位
sbit x1 =P1^6
unsigned int k=0,x11,y11,cycle=2000,yk,xk,xk1//定义开始控制位
unsigned char x = 1
unsigned int kx
void delay(unsigned int i)
{
unsigned int j,k
for(j=ij>0j--)
for(k=300k>0k--)
}
void inistartx(void) //X初始化函数
{
xk=0
dir1=1
cycle=9600
kx=300
TR0=1
P2_0=0
while(xk1<400)
TR0=0
kx=0
delay(500)
xk=0
cycle=9600
dir1=0
xk1=0
kx=700
TR0=1
while(x==1&&xk1<801)//
TR0=0
delay(500)
cycle=9600
xk1=0
dir1=1
kx=300
TR0=1
while(xk1<400)
TR0=0
kx=0
clk1=0
xk1=0
}
void exint0_init( )
{
IT0 =1 //下降沿产生中断
EX0 =1 //使能外部中断
EA =1 //使能全局中断
}
void initime0(void) //初始化定时器0
{
TH0=0xf8
TL0=0x30
}
void time0() interrupt 1 //定时器0中断函数
{
if(xk1<100){cycle=cycle-80}
if(xk1>=100&&xk1<=kx){cycle=1600}
if(xk1>kx) {cycle=cycle+80}
TH0=(65536-cycle)/256 //定时5000次= 5000us = 5 ms 65536-5000=60536=0xec78
TL0=(65536-cycle)%256
//TH0=0xf8 //定时器1为X或者Y提供脉冲数
//TL0=0x30 //频率500cycle=2000 cycle=2500=》频率=400
xk1++
clk1=~clk1
k++
}
void exint0() interrupt 0 //接近开关接P3.2,发生中断停止
{
TR0=0
x=0
ena1=0
}
void main (void)
{
x1=1
TMOD = 0x01
IE=0xAF //EA - ET2 - ES - ET1 - EX1- ET0 - EX0 允许(总中断EA) ET2 ET1 ET0中断
initime0()
exint0_init()
inistartx()
TR2=1
while(aj ==0)
inistartx()
TR1=1
//IP= 0x00 //- - PT2 PS PT1 PX1 PT0 PX0
////TCON =0x00 //TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
//T2CON =0x00 //TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T CP/RL2
while(1){
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)