Ⅰ 一个51单片机,晶振为12MHz,让前三个LED灯分别以1ms,1s,5s的频率闪烁,怎么用c语言写,谢谢各位了~~
要实现51单片机上的三个LED灯分别以1ms, 1s, 5s的频率闪烁,可以通过定时器来控制。首先,我们设定定时器0为16位定时模式,计时50ms。然后设置一个变量进行定时器中断计数,当计数达到10(即0.5s)时,LED2的状态取反;当计数达到5000(即2.5s)时,LED3的状态取反。这样,LED1将以1ms的频率闪烁,几乎无法被人眼察觉;LED2将以1s的频率闪烁;LED3将以5s的频率闪烁。
具体实现代码如下:
#include
unsigned int count = 0;
sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
void main() {
TMOD = 0x01; // 设置定时器0工作模式1
TH0 = (65536 - 500) / 256; // 计时50ms
TL0 = (65536 - 500) % 256;
EA = 1; // 开全局中断
ET0 = 1; // 开定时器0中断
TR0 = 1; // 启动定时器0
}
void time0() interrupt 1 {
led1 = ~led1;
count++;
if (count % 1000 == 0) {
led2 = ~led2;
}
if (count == 5000) {
led3 = ~led3;
count = 0;
}
}
这段代码中,通过定时器0的中断服务程序(time0)实现对LED1、LED2和LED3的控制。需要注意的是,在实际应用中,可能需要根据具体硬件环境调整定时器的预设值,以确保定时精度。
为了使LED1的闪烁速度接近1ms,我们通过设定定时器0来计时50ms,再通过中断计数的方式实现1ms的闪烁频率。而LED2和LED3则分别以1s和5s的频率闪烁,通过调整中断计数的倍数来实现。
这种方法适用于需要精确控制LED闪烁频率的应用场景。通过这种方式,我们可以轻松地实现不同频率的LED闪烁,而无需复杂的硬件设计。
以上代码和方法仅为一种实现思路,具体实现时还需要根据实际情况进行适当调整,确保硬件和软件的完美配合。
Ⅱ 在51单片机中怎样用一个按键按键LED灯的闪烁和停止,编写出主要的程序就可以了,新手上路请多多包涵呢
在51单片机中实现按键控制LED灯的闪烁和熄灭功能,可以通过按键计数来区分两种状态。当按键被按下并释放时,LED开始闪烁,而再次按下时,LED则熄灭。
具体实现步骤如下:
首先,需要定义按键和LED的端口。例如,假设按键连接到P1.0,LED连接到P1.1。接下来,编写主函数,在其中实现按键的检测和LED状态的控制。
1. 初始化端口,设置按键输入,LED输出。
2. 进入主循环,读取按键状态,如果按键被按下,则计数器加一。
3. 根据计数器的奇偶性决定LED的状态。如果计数器为奇数,LED闪烁;如果为偶数,LED熄灭。
4. 通过延时函数控制闪烁频率和熄灭状态的保持时间。
下面是简化后的伪代码示例:
c
void main() {
// 初始化端口
P1M0 = 0x00; // 设置P1.0为输入
P1M1 = 0x00; // 设置P1.1为输出
P1T0 = 0x00; // P1.0作为输入
P1T1 = 0x01; // P1.1作为输出
// 初始化计数器
int count = 0;
// 主循环
while (1) {
// 读取按键状态
if (P1IN & 0x01) {
count++;
}
// 根据计数器的奇偶性控制LED状态
if (count % 2 == 1) {
// LED闪烁
P1OUT = 0x02; // 设置P1.1为高电平
} else {
// LED熄灭
P1OUT = 0x00; // 设置P1.1为低电平
}
// 延时函数
delay();
}
}
以上代码仅为示例,具体实现可能需要根据实际硬件和编译器进行调整。对于初学者来说,理解这个过程和实现步骤非常重要。希望这篇指南对你有所帮助。
Ⅲ 51单片机怎么用c语言写一个按钮控制一个led的闪烁,按一下开始闪烁,再按就灭掉
bit flash;//闪烁标志位
sbit led=P0^0;
sbit P01=P0^1;
sbit P02=P0^2;
void main()
{
P01=P02=0;
flash=0;
led=0;
while(1)
{
scankey();
ledflash();
}
}
void scankey()//键盘扫描
{
P01=1;//行线给1
if(P02)//如果P02也是1则说明接通
{
delay(10);//去抖动10MS
if(P02)//再次确定按键按下
{
while(P02){flash=flash}//按住按键的动作
flash=~flash;//按键按下后执行动作
}
}
}
void ledflash()
{
if(flash)
{
led=1;//点亮
delay(100);//延时100MS
led=0;//熄灭
}
else led=0;
}
void delay(unsigned int i)
{自己根据单片机频率写个1MS带形参的演示程序}
这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,只是个大框而已(比如函数声明,定义端口什么的)
Ⅳ 51单片机LED延时闪烁delay(50000); 用定时器延时代替delay(50000)延时怎么样写
//初始化函数:用于初始化各种参数
void init() {
TMOD = 0x01; //设置定时器0,GATE = 0, C/T = 0 , M1M0 = 01(方式1,16位定时器/计数器)
//赋初值
TH0 = THx;
TL0 = TLx;
EA = 1; //中断总闸·开!
ET0 = 1; //定时器0中断·开!
TR0 = 1; //定时器0·运行!
}
//定时器0的中断函数:由定时器中断自动调用,你只需要写好中断后要怎么处理就好
void timeInt_T0 () interrupt 1 {
//每中断一次都要重新赋初值
TH0 = THx;
TL0 = TLx;
//记够20次中断后,刷新显示
if(++counter == 20)
refresh();
}