求救:用单片机89C52程序设计 实现固定的时间间隔周期循环地开关
举个简单的例子,我们熟知的春夏秋冬就是一个典型的时间循环。经历了春天,夏天就回到来,夏天过去就是秋天,秋天过来了就是冬天,冬天过后春天又回到大地。由于时间循环具有圆的性质。
#include #define uint unsigned int;#define uchar unsigned char;void delay (uint x){uint y;uchar z;for(y=x;y>0;y--){for(x=110;x>0;x--);}}void main(){while(1){P1^0=0;delay(500); P1^0=1;delay(1000);}}//虽然给你程序了,但还是希望你自己动手,这样才能提高。//我也是从你那时学起的,知道那种渴望的滋味。特给你此段程序,希望以后自食其力。 //关于电路很简单了,自己画吧。
/* T0定时器控制脉冲 1mS~4095mS可调(对应DAC输入0~2.5V)*/
#include<reg51.h>
unsigned int TC0=0; //周期计数
unsigned int RefLed=0; //LED刷新周期
unsigned int Value1=0; //设定时间值
bit Enb=0; //输出允许值
bit Enb1=0;
unsigned char code Led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit DOUT=P1^0; //ADC串行数据
sbit SLCK=P1^1; //ADC时钟
sbit CS=P1^2; //ADC控制
sbit P13=P1^3; //1:1输出
sbit P14=P1^4; //2分频输出
sbit P15=P1^5; //1ms输出
sbit P17=P1^7; //允许输出控制端 按下一次开,再按一次关
/*============延时子程序===================*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*==========输出脉冲时间显示===============*/
void Dsp(unsigned int Vol)
{
if (RefLed < 40) //显示灯刷新部分
++RefLed;
else
RefLed=0;
switch(RefLed)
{
case 0:
P2=0x01;
P3=~Led[Vol/1000];
break;
case 10:
P2=0x02;
P3=~Led[(Vol%1000)/100];
break;
case 20:
P2=0x04;
P3=~Led[(Vol%100)/10];
break;
case 30:
P2=0x08;
P3=~Led[Vol%10];
break; //显示灯刷新完成
}
}
/*==============主程序====================*/
void main()
{
unsigned int i =0;
unsigned int Value=0;
TMOD=0x1; //定时器0 工作于方式 1
TH0=0xFC; //初始定时值1ms;65536-1000=64536=0xFC18H
TL0=0x18;
IE=0x82; //允许中断
TR0=1; //开定时器0
CS=1;
SLCK=0;
while(1)
{
Value=0;
CS=0;
SLCK=0;
for (i=0;i<12;i++) //读取Max1240的12位电压值
{
SLCK=1;
delay (1);
SLCK=0;
delay (1);
if (DOUT==1)
Value=(Value<<1)|0x0001;
else
Value = Value<<1;
delay (1);
}
CS=1;
delay (1);
Value1=Value; //把电压值赋予脉冲周期
Dsp(Value1); //显示输出脉冲周期
if ((P17==0) && (Enb==1))
{Enb1=!Enb1;}
Enb = P17;
}
}
/*============T0 中断函数=================*/
void Timer0() interrupt 1
{
unsigned int k=0;
TH0=0xFC;
TL0=0x18;
k=P13;
P15=!P15;
if(++TC0 > Value1) //当计数满Value次时为Value*mS
{
TC0=0; //计数复位
if (Enb1==1)
P13=!P13; //P13输出
else
P13=0;
}
if((k == 0) && (P13 ==1))
{ if (Enb1==1)
P14=!P14; //P14端口2分频输出
else
P14=0;
}
}
已经用仿真软件Proteus 7 Professional 7.7sp2调试通过,通过电位器调节1~4095ms方波。
并附上仿真图。如需程序请留下邮箱。不足之处请多多指教。
ntinue的作用是,结束本次循环,进行下一次呵呵
#include <reg51.h>
#define uint unsigned int;
#define uchar unsigned char;
void delay (uint x)
{
uint y;
uchar z;
for(y=x;y>0;y--)
{
for(x=110;x>0;x--);
}
}
void main()
{
while(1)
{
P1^0=0;
delay(500);
P1^0=1;
delay(1000);
}
}
//虽然给你程序了,但还是希望你自己动手,这样才能提高。
//我也是从你那时学起的,知道那种渴望的滋味。特给你此段程序,希望以后自食其力。
//关于电路很简单了,自己画吧。
我来帮帮你!
好说。其实和很简单,可以联系我。去我百度空间看看实力。然后找我做,
《用89C52单片机做设计,需要用EEPROM扩展程序存储器吗?》
答:一般不需要的,这主要看你的程序复杂程度,也就是说,程序编译后有多大,超过8K后就不得不扩展程序存储器了