请教c51单片机,c语言编程,关于控制LED灯闪烁频率?

作者&投稿:谯信 (若有异议请与网页底部的电邮联系)
~ ## 代码
```

#include <reg51.h>
sbit LED = P2^0;
sbit K1 = P3^0;
sbit K2 = P3^1;
unsigned int freq = 50; // 初始频率为50Hz
void Timer0_ISR() interrupt 1
{
static unsigned int cnt = 0;
cnt++;
if(cnt == 1000/freq)
{
LED = ~LED; //每达到一定时间就更改LED灯状态
cnt = 0;
}
TF0 = 0;
}
void main()
{
unsigned int temp;
TMOD = 0x01; //设置T0为模式1
TH0 = 0xF8; //设置计时初值,到达此计时器将复位
TL0 = 0xCC; //使用最高电平9004H
ET0 = 1; //使能定时器中断
EA = 1; //开放全局中断
TR0 = 1; //启动定时器0
LED = 0; //关闭LED灯
while(1)
{
if(K1 == 0) // K1按下,增加频率
{
while(K1 == 0); // 等待按键释放
freq += 20;
if(freq > 100) freq = 100; // 频率上限100Hz
}
else if(K2 == 0) // K2按下,降低频率
{
while(K2 == 0);
freq -= 20;
if(freq < 10) freq = 10; // 频率下限10Hz
}
temp = 1000/freq/2; // 延时一半周期,确保闪烁频率正确
while(temp--);
}
}
```
> 其中,通过TMOD、TH0和TL0寄存器设置定时器T0为13位模式,并且设置了计时初值,以启动定时器0。同时开放了定时器中断,并将定时器中断优先级设置为1(即高优先级)。在无限循环中,不断检测K1和K2按键状态,以改变全局变量“freq”并控制LED灯的闪烁频率;然后使用一个计时器中断服务程序来控制LED灯的闪烁,具体实现方式请参考代码注释。最后,为了保证每个周期的闪烁持续时间与频率相符,应该在循环内部加入一个延时操作,等待一定时间再进入下一次循环。


高职高专电子技术系列教材·单片机原理及应用内容简介
接着,教材深入探讨指令系统,解释各种指令的功能与应用,为后续的学习打下坚实的基础。在教学内容中,还涉及定时器\/计数器、串行口、中断系统等核心模块,详细讲解这些系统的工作原理与编程方法,帮助读者理解单片机在实际应用中的灵活性和多样性。此外,教材还介绍了汇编语言程序设计、C51程序设计等内容,让...

c51单片机中,每条c语言需要的时间是多少啊,是一个机器周期还是时钟周 ...
你说的是指令周期,根据指令的不同,一般一个指令需要1-4个机器周期来完成(比如乘法或除法就需要48个时钟周期来完成),一般的51单片机都是12分频,也就是说1个机器周期分为12个时钟周期。请你好好理解时钟周期--机器周期--指令周期三者之间的关系。目前STC有不少型号的单片机有单时钟周期指令,一个...

c51单片机,用c语言写一个p1口并行输出,要求亮1秒,灭1秒。
用1S定时,假设定时器基准为1ms if(t_1s >= 1000){ P1 ^= 0XFF;t_1s = 0;}

C51单片机脉冲累加器(C语言程序)
include <reg52.h> define uchar unsigned char define uint unsigned int sbit key =P2^5;sbit key1=P2^4;sbit key2=P2^3;sbit key3=P2^2;sbit pwm=P1^0;uint pwm_value=1960;uint count=0;void timer0(void) interrupt 1 using 1 { switch(count){ case 1:pwm=1;TH0=-pwm_value...

如何学习C51单片机
学习单片机,这几点是要学的。1. 单片机语言,语言都不认识,难也没有办法写单片机的软件的了,但这个还是比较简单,单片机的 语言和汇编差不多,也没有多少条。2. 单片机的结构,指令机器周期,中断,REGISTER,时钟 ,看门狗,计数器,各个IO 口的外部中断情况,如何让单片机分时间段,或别的办法,...

c语言编程c51单片机
include <reg51.h> define uchar unsigned char define uint unsigned int main(){ uint xdata *xp;\/\/定义指向片外RAM的指针 uint data *p;\/\/定义指向片内RAM的指针 uchar i;\/\/定义循环变量 xp=0x100;\/\/指向片外RAM的100H单元 p=0x30;\/\/指向片内RAM的30H单元 for(i=0;i<10;i++){\/\/...

单片机C51编程(C语言):1到100的求和显示,在数码管里显示出来.
include <reg51.h> include <stdio.h> define uchar unsigned char void convert();void display();void delay();\/\/共阴:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F code unsigned char Led[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x...

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!
extern就可以。在一个文件里定义:bdata m;sbit x=m^1;然后在另一个文件里声明:extern bdata m;(如果不使用m可以不声明。)extern bit x;这样就可以使用了。如果变量较多,建议楼上的方法,用全局头文件。

单片机C51编程(C语言):用数码管实现学号的显示,直接显示。学号从7041931...
首先想问:要用到9个数目管吗?我觉得用后几位数字意思一下就可以了,毕竟写出来就证明你会了。这里就用后8个数字吧,刚好使用一个I\/O口 假设数目管共阴,用P0口控制7个段,用P1口控制8个位。\/\/这里我只给出重点,简单的初始化操作你自己也可以写 unsigned char led7_seg[10] = {写入0到9...

求c51单片机电子钟程序(c语言)
lcd_wcmd(0x0c); \/\/显示开,关光标 delay_ms(1);lcd_wcmd(0x06); \/\/向右移动光标 delay_ms(1);lcd_wcmd(0x01); \/\/清除LCD显示屏 delay_ms(1);} \/\/=== 往DS1302写入1Byte数据 (内部函数) === void w_byte(uchar dat){ uchar i;for(i=8; i>0; i--){ IO = dat &...

北海市13258257165: 单片机c语言编程(关于单片机c语言编程的基本详情介绍)
池泼小儿: 1、单片机c语言编程是基于C语言的单片机编程.2、单片机的C语言采用C51编译器(简称C51).3、由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用.

北海市13258257165: 急急急急求,单片机C51的C语言程序 -
池泼小儿: ;***************************;; DAC0832 ;;***************************; ORG 0000H START: MOV DPTR,#7FFFH MOV A,#00H MOVX @DPTR,A LCALL DELAY MOV A,#0FEH MOVX @DPTR,A LCALL DELAY SJMP LOOP DELAY: MOV R6,#00H DELAY2: MOV R5,#00H DELAY1: DJNZ R5,DELAY1 DJNZ R6,DELAY2 RET END

北海市13258257165: C51单片机怎么用C语言实现数值的开方和平方运算? -
池泼小儿: C51是基于标准的C语言扩展而来的,所以,标准C语言能做的东西,C51也可以. 平方运算,自不必说,就是两个数相乘: 例如:float a,b,c; c = a*b; 开方,则需要用到库函数: 标准c语言里用的是 sqrt()函数,这个函数包含在math.h文件中. 所以: #include <math.h> c = sqrt(a); 就可以了

北海市13258257165: C51单片机C语言编程的问题 -
池泼小儿: 问题出现编译器把计算后的值直接送到P1了,a值没有更新 你程序的还有个问题在于更新P1口后需要延时至少0.5秒,否则你是不可能看到LED有闪烁的修改办法,2种 1把a声明成全局变量 2把while全改成for

北海市13258257165: c51单片机可以运行c语言程序?
池泼小儿: 严格的说法,C51可以用C语言来编程1般C语言是不能直接运行的,它必须编译成目标代码才能运行你可以用C写C51的程序,然后通过编译器生成目标代码后上传到单片机.就能够运行了

北海市13258257165: 用C语言对单片机编程如何定义C51单片机 -
池泼小儿: 这个不是定义,而是头文件包含.头文件里大部分是类似下面的一起端口定义.#define P0 *(unsigned char *)0x801a sbit P00=P0^0; sbit P01=P0^1; ……//数字是我臆造的,不同的CPU值是不同的.这样子的定义可以让你只需要知道怎么用端口,而不需要去知道端口位置.所以当你知道端口位置时,不用包含头文件,自己写这些宏定义,也能达到同样的效果.你说的ATx51是不是指atmel的系列单片机??是的话,用reg51就可以了,一样的.

北海市13258257165: 51单片机c语言是什么意思? -
池泼小儿: C 语言, 是计算机编程语言. 适合于入门者学习、使用. 51 单片机,是一种微型计算机. 用 C 语言,对其编程,就是“51单片机c语言”.

北海市13258257165: 请问单片机C语言编程与单片机C51编程的区别是什么? -
池泼小儿: 51是单片机的一种.基于不同内核(CPU)的单片机,其指令系统不同,所以编译器不同.C51将C编译成51汇编,而单片机C语言应该通指,不过国内常把51与单片机等同起来.

北海市13258257165: 请教C51单片机,C语言编程,怎样把一个四位数存入(读取)外部数据存储器?请举例说明. -
池泼小儿: //外部绝对地址定义,具体地址根据你所需存在哪个地址单元而定#define uchar unsigned char#define uint unsigned int uchar xdata XRAM _at_ 0xFF00[4];//指定外部存储地址 uchar DATA1[4]; //你先把你的四位数每位单独分离出来存到这个4成员数组 void main(void) { uchar i; for(i=0;i<4;i++) { XRAM[i]=DATA1[i] } }

北海市13258257165: 请问单片机C语言编程与单片机C51编程的区别是什么?
池泼小儿: 我觉得这两个只是一种说法的问题,深究没有什么意义,我们一般说C51也就是说在51单片机上用C语言进行开发,而单片机C语言可能更强调的开发语言是C语言而不是汇编语言. 如果你是初学者学习单片开发的话,并且有一定的C语言基础的话,建议从郭天祥老师的单片视频教程开始学习,有空可以去我的网站 http://www.fujiangyun.com 看看,相互讨论讨论.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网