#include<reg52h>
sbit P10=P1^0;//控制LED闪烁
unsigned char count=0;//计数变量
void main()
{
TMOD = 0x01; //设定时器0为模式1,16位模式
TH0=0xdc;
TL0=0x00; //设定时值为10ms,此时晶振频率是110592MHZ
//若晶振频率是12MHZ,则初值应为 TH0=0xd8; TL0=0xf0;
ET0 = 1; //定时器0中断打开
EA = 1; //允许CPU中断
TR0 = 1;//启动定时器0
while(1)
{
if(count==40) //04秒时间是否到
{
count=0; //计数变量清零,为下一次计数做准备
P10=!P10; //IO口取反,即LED亮灭变化
}
}
}
//定时器0中断处理子程序
void Time0() interrupt 1 using 0
{
TH0=0xdc;
TL0=0x00; //设定时值为10ms
count++; //计数加一
}
我写的这个程序应该可以,按一下灯亮,再按一下灯灭
#include
"REG52H"
sbit
LED1_01
=
P1^1;
//LED灯
sbit
KEY0_01
=
P1^2;
//按键
void
Delay_1ms(unsigned
int
Time)
{
unsigned
int
x,
y;
for(x
=
Time;
x
>
0;
x--)
for(y
=
120;
y
>
0;
y--);
}
int
main(void)
{
LED1_01
=
1;
//打开LED灯点亮
while(1)
{
if(KEY0_01
==
0)
//检测按键是否按下
{
Delay_1ms(10);
//延时去抖动
if(KEY0_01
==
0)
//确定按键按下
{
LED1_01
=
~
LED1_01;
//取反LED灯
[
亮
灭
]
}
while(KEY0_01
==
0);
//检测松手
}
}
}
你的图里有A/D转换器
AD转换函数ADC_DISC
#include
<REGX51H>
#include"defh"
#include"libh"
sbit
adc_cs=P1^0;
sbit
adc_rd=P1^1;
sbit
adc_wr=P1^2;
/ADC0804启动转换函数/
INT8U
start_ad()
{
INT8U
temp;
adc_cs=0;
adc_wr=1;
delay(1);
adc_wr=0;
delay(1);
adc_wr=1;
delay(1);
//启动AD
adc_rd=1;
delay(1);
adc_rd=0;
delay(1);
temp=P2;
delay(1);
adc_rd=1;
delay(1);
//读取数据
return
temp;
}
用这个程序。
在main()函数前面声明一下
如:
#include<reg52h>
void delay(uint i);//延时函数声明
void main(void)
{
delay(500); //延时函数调用
}
void delay(uint i) //延时函数定义
{
while(i--);
}
你这个程序死循环了,我一点一点给你纠正:
1 你有个不好的习惯,希望你改正:
定义变量的时候,请明确的指明变量的类型:unsigned char i,或者unsigned int i
而不要是unsigned i,这是不好的习惯。
2 你的这个地方是个死循环:
for(j=7;j>=0;j--)
{
led=(temp>>=1);
yanshi(50);
}
因为你的j定义的是unsigned 类型,所以,j永远都会是非负数,所以,你的for循环会一直进行,修改如下:
for(j=7;j>0;j--)
{
led=(temp>>=1);
yanshi(50);
}
3 看你的while(1)循环里:
while(1) {
if(kaiguan==0) yanshi(20);
if(kaiguan==0)
{
kaideng();
}
if(kaiguan!=1)
{led=0xff;}
}
你这样写,我问你 if(kaiguan==0)和if(kaiguan!=1)有什么区别吗?
以上就是关于急求利用定时中断方式0实现led每0.4秒闪烁一次的c语言程序!谢谢!!!全部的内容,包括:急求利用定时中断方式0实现led每0.4秒闪烁一次的c语言程序!谢谢!!!、汇编语言或C语言编写一个控制灯闪烁的程序、单片机LED闪烁程序的延时Delay()写在main()的后面,该怎么改啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)