如何通过51单片机控制LED灯以1s的频率闪烁,求源代码?51单片机源代码存放在RAM30H-3FH中,求补码,将结果存入RAM40H-4FH

:暂无数据 2026-06-08 19:45:08 0

如何通过51单片机控制LED灯以1s的频率闪烁,求源代码?51单片机源代码存放在RAM30H-3FH中,求补码,将结果存入RAM40H-4FH

今天给各位分享如何通过51单片机控制LED灯以1s的频率闪烁,求源代码的知识,其中也会对如何通过51单片机控制LED灯以1s的频率闪烁,求源代码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

如何通过51单片机控制LED灯以1s的频率闪烁,求源代码

#include 《reg52.h》     //包括一个52标准内核的头文件

#define uchar unsigned char    

/******************************主函数*****************************/

void timer0();

void main() // 主程序

{

 TMOD=0x01; //定时器0工作方式1

 EA=1;

 ET0=1; //定时器0中断

 TR0=1; //启动定时器0

TH0=(65536-50000)/256;

 TL0=(65536-50000)%256; 

 while(1);  //程序循环

}

/*****************************定时器0中断*************************/

void timer0() interrupt 1  

{

 uchar t;//定义变量

 TF0=0;//定时器清0

 t++; //中断一次累加1

 if(t==20) //预置值,溢出20次就是1秒钟,晶振12MHZ

 {

  t=0;

  P3=~P3; //反转LED灯的亮灭

 }

}

/*****************************************************************/

51单片机源代码存放在RAM30H-3FH中,求补码,将结果存入RAM40H-4FH

mov R1,#30h

mov R2.#10h

mov R3,#40h

loop1:

mov a,@R1

rlc a

jnc loop2

mov a,@R1

cpl a

inc a

loop2

mov @R3,a

inc R1

inc R3

djnz R2, loop1

还不明白的采纳后给你解释;

什么是51单片机源程序

专门为51单片机设计的程序,可以是C程序,也可以是汇编程序。但如果是C程序,兼容性很强,不但51单片机能用,其它类型的CPU也可以用;如果是汇编程序,则指令必须是51单片机指令集规定的。不管是哪种程序,最终生成的二进制机器码能够在以8051为核的CPU上正确运行。

c51 库函数 是keil实现的吗可以查看源代码吗

可以看,在第一行打上比如《reg51.h》,然后在上面点右键有个选项可以展开这个头文件。
c51没有printf,那是c语言的在doc下显示的,你如果想让他显示你希望显示的东西可以给51加个液晶屏,液晶屏程序可以找现成的然后再根据需要改。
希望能帮到你~

51单片机,为什么把源代码分成几个模块后,程序运行却变慢了很多,哪里出了问题呀

模块指的是什么?子函数么?按理说函数调用以及传值都会比直接执行稍微多花一点时间,可是不会慢到能够被发现的程度吧?应该还是程序设计上有问题,函数的写法可不是照搬源代码,他要考虑到很多因素,比如函数的通用性,结构以及效率等,写得好的话甚至可以提高程序可读性以及效率。

51单片机程序编写

/*这是用LCD显示所测温度的代码,你参考一下,如果没问题的话,其他的功能你再添加就好了,不难*/

#include《reg52.h》

#include《intrins.h》

#define uint unsigned int

#define uchar unsigned char

#define Nack_number 10

//**************端口定义**************************************************

uchar flag;    //LCD控制线接口

sbit RS=P1^0;   //RS端

sbit RW=P1^1;  //读写端

sbit LCDE=P2^5;  //使能端

//mlx90614端口定义

sbit SCK=P2^1;//时钟线

sbit SDA=P2^2;//数据线

//************数据定义****************************************************

bdata uchar flag1;//可位寻址数据

sbit bit_out=flag1^7;

sbit bit_in=flag1^0;

uchar tempH,tempL,err;

//**************************  LCD1602  ***********************************

//向LCD写入命令或数据*****************************************************

#define LCD_COMMAND0      //命令

#define LCD_DATA1      // 数据

#define LCD_CLEAR_SCREEN0x01      // 清屏

#define LCD_HOMING  0x02      // 光标返回原点

//设置显示模式******* 0x08+   *********************************************

#define LCD_SHOW0x04    //显示开

#define LCD_HIDE0x00    //显示关

#define LCD_CURSOR0x02 //显示光标

#define LCD_NO_CURSOR0x00    //无光标

#define LCD_FLASH0x01    //光标闪动

#define LCD_NO_FLASH0x00    //光标不闪动

//设置输入模式********** 0x04+ ********************************************

#define LCD_AC_UP0x02     //光标右移 AC+

#define LCD_AC_DOWN0x00      //默认 光标左移 AC-

#define LCD_MOVE0x01      //画面可平移

#define LCD_NO_MOVE0x00      //默认 画面不移动

//**************************  mlx90614  ***********************************

//command mode  命令模式

#define RamAccess0x00//对RAM操作

#define EepomAccess0x20//对EEPRAM操作

#defineMode0x60//进入命令模式

#define ExitMode0x61//退出命令模式

#defineReadFlag0xf0//读标志

#define EnterSleep0xff//进入睡眠模式

//ram addressread only RAM地址(只读)

#define AbmientTempAddr0x03//周围温度

#defineIR1Addr0x04

#defineIR2Addr0x05

#define LineAbmientTempAddr0x06  //环境温度

/*0x00000x4074 16500 0.01/单元

     -40   125*/

#define LineObj1TempAddr0x07//目标温度,红外温度

/*0x27ad-0x7fff 0x3559 226100.02/单元

  -70.01-382.19  0.01   452.2*/

#defineLineObj2TempAddr0x08

//eepom address  EEPROM地址

#define TObjMaxAddr0x00//测量范围上限设定

#define TObjMinAddr0x01//测量范围下限设定

#define PWMCtrlAddr0x02//PWM设定

#define TaRangeAddr0x03//环境温度设定

#define KeAddr0x04//频率修正系数

#define ConfigAddr0x05//配置寄存器

#define SMbusAddr0x0e//器件地址设定

#define Reserverd1Addr0x0f//保留

#define Reserverd2Addr0x19//保留

#define ID1Addr0x1c//ID地址1

#define ID2Addr0x1d//ID地址2

#define ID3Addr0x1e//ID地址3

#define ID4Addr0x1f//ID地址4

//************函数声明*****************************************************

void start(); //MLX90614发起始位子程序

void stop(); //MLX90614发结束位子程序

uchar ReadByte(void); //MLX90614接收字节子程序

void send_bit(void); //MLX90614发送位子程序

void SendByte(uchar number); //MLX90614接收字节子程序

void read_bit(void); //MLX90614接收位子程序

void delay(uint N); //延时程序

uint readtemp(void); //读温度数据

void init1602(void); //LCD初始化子程序

void busy(void); //LCD判断忙子程序

void cmd_wrt(uchar cmd); //LCD写命令子程序

void dat_wrt(uchar dat); //LCD写数据子程序

void display(uint Tem); //显示子程序

void Print(uchar *str); //字符串显示程序

//*************主函数*******************************************

void main()

{

uint Tem;//温度变量

SCK=1;

SDA=1;

delay(4);

SCK=0;

delay(1000);

SCK=1;

init1602();//初始化LCD

while(1)

{

Tem=readtemp();//读取温度

cmd_wrt(0x01);//清屏

Print("  Temperature:    ");//显示字符串  Temperature: 且换行

display(Tem);//显示温度

Print(" ^C");//显示摄氏度

delay(10000);//延时再读取温度显示

}

}

void Print(uchar *str)//字符串显示程序

{

while(*str!=’\0’)//直到字符串结束

{

dat_wrt(*str);//转成ASCII码  

str++;//指向下一个字符

}

}

//*********输入转换并显示*********

void display(uint Tem)

{

uint T,a,b;

T=Tem*2;

if(T》=27315)//温度为正

{

T=T-27315;//

a=T/100;//温度整数

b=T-a*100;//温度小数

if(a》=100)//温度超过100度

{

dat_wrt(0x30+a/100);//显示温度百位

dat_wrt(0x30+a%100/10);//显示温度十位

dat_wrt(0x30+a%10);//显示温度个位

}

else if(a》=10)//温度超过10度

{

dat_wrt(0x30+a%100/10);//显示温度十位

dat_wrt(0x30+a%10);//显示温度个位

}

else//温度不超过10度

{

dat_wrt(0x30+a);//显示温度个位

}

dat_wrt(0x2e);//显示小数点

if(b》=10)//温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10);//显示温度小数点后第1位数

dat_wrt(0x30+b%10);//显示温度小数点后第2位数

}

else//温度小数点后第1位数等于0

{

dat_wrt(0x30);//显示温度小数点后第1位数0

dat_wrt(0x30+b);//显示温度小数点后第2位数

}

}

else//温度为负

{

T=27315-T;

a=T/100;

b=T-a*100;

dat_wrt(0x2d);//显示负号

if(a》=10)//温度低于负10度

{

dat_wrt(0x30+a/10);//显示温度十位

dat_wrt(0x30+a%10);//显示温度个位

}

else//温度高于负10度

{

dat_wrt(0x30+a);//显示温度个位

}

dat_wrt(0x2e);//显示小数点

if(b》=10)//温度小数点后第1位数不等于0

{

dat_wrt(0x30+b/10);//显示温度小数点后第1位数

dat_wrt(0x30+b%10);//显示温度小数点后第2位数

}

else//温度小数点后第1位数等于0

{

dat_wrt(0x30);//显示温度小数点后第1位数0

dat_wrt(0x30+b);//显示温度小数点后第2位数

}

}

}

//************************************

void start(void)//停止条件是 SCK=1时,SDA由1到0

{

SDA=1;

delay(4);

SCK=1;

delay(4);

SDA=0;

delay(4);

SCK=0;

delay(4);

}

//------------------------------

void stop(void)//停止条件是 SCK=1时,SDA由0到1

{

SCK=0;

delay(4);

SDA=0;

delay(4);

SCK=1;

delay(4);

SDA=1;

}

//---------发送一个字节---------

void SendByte(uchar number)

{

uchar i,n,dat;

n=Nack_number;//可以重发次数

Send_again:

dat=number;

for(i=0;i《8;i++) //8位依次发送

{

if(dat&0x80)   //取最高位

{

bit_out=1;    //发1

}

else

{

bit_out=0;    //发0

}

send_bit();    //发送一个位

dat=dat《《1;    //左移一位

}

read_bit();   //接收1位 应答信号

if(bit_in==1)     //无应答时重发

{

stop();

if(n!=0)

{

n--;    //可以重发Nack_number=10次

goto Repeat;//重发

}

else

{

goto exit;//退出

}

}

else

{

goto exit;

}

Repeat:

start();//重新开始

goto Send_again;//重发

exit: ;//退出

}

//-----------发送一个位---------

void send_bit(void)

{

if(bit_out==1)

{

SDA=1;   //发1

}

else

{

SDA=0;   //发0

}

_nop_();

SCK=1;   //上升沿

delay(4);delay(4);

SCK=0;

delay(4);delay(4);

}

//----------接收一个字节--------

uchar ReadByte(void)

{

uchar i,dat;

dat=0;//初值为0

for(i=0;i《8;i++)

{

dat=dat《《1;//左移

read_bit();//接收一位

if(bit_in==1)

{

dat=dat+1;//为1时对应位加1

}

}

SDA=0;//发送应答信号0

send_bit();

return dat;//带回接收数据

}

//----------接收一个位----------

void read_bit(void)

{

SDA=1;//数据端先置1

bit_in=1;

SCK=1;//上升沿

delay(4);delay(4);

bit_in=SDA;//读数据

_nop_();

SCK=0;

delay(4);delay(4);

}

//------------------------------

uint readtemp(void)

{

SCK=0;

start(); //开始条件

SendByte(0x00); //发送从地址00

SendByte(0x07); //发送命令

start(); //开始条件

SendByte(0x01); //读从地址00

bit_out=0;

tempL=ReadByte();//读数据低字节

bit_out=0;

tempH=ReadByte();//读数据高字节

bit_out=1;

err=ReadByte();//读错误信息码

stop();//停止条件

return(tempH*256+tempL);

}

//******************LCD显示子函数***********************

void init1602(void) //初始化LCD

{

cmd_wrt(0x01);//清屏

cmd_wrt(0x0c);//开显示,不显示光标,不闪烁

cmd_wrt(0x06);//完成一个字符码传送后,光标左移,显示不发生移位

cmd_wrt(0x38);//16×2显示,5×7点阵,8位数据接口

}

void busy(void) //LCD忙标志判断

{

flag=0x80;//赋初值 高位为1 禁止

while(flag&0x80)//读写操作使能位禁止时等待 继续检测

{

P0=0xff;

RS=0; //指向地址计数器

RW=1; //读

LCDE=1; //信号下降沿有效

flag=P0;//读状态位 高位为状态

LCDE=0;

}

}

void cmd_wrt(uchar cmd) //写命令子函数

{

LCDE=0;

busy();//检测 读写操作使能吗

P0=cmd; //命令

RS=0; //指向命令计数器

RW=0; //写

LCDE=1;//高电平有效

LCDE=0;

}

void dat_wrt(uchar dat) //写数据子函数

{

busy();//检测 读写操作使能吗

LCDE=0;

if(flag==16)

{

RS=0;//指向指令寄存器

RW=0; //写

P0=0XC0;//指向第二行

LCDE=1;//高电平有效

LCDE=0;

}

RS=1;//指向数据寄存器

RW=0; //写

P0=dat; //写数据

LCDE=1;//高电平有效

LCDE=0;

}

//------------延时--------------

void delay(uint n)

{

uint j;

for(j=0;j《n;j++)

{

_nop_();

}

}

用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1

  用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
  分内容转自:《51单片机C语言创新教程》温子祺等著。
  原理:
  软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮
  度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了人眼视觉暂留的特点。一般来说,每一个数码管点亮时间为1~2ms就可以了。如果某一个数码管点亮时间过长,则这个数码管的亮度过高,如果某一个数码管的点亮时间过短,则这个数码管的亮度过暗。因此我们必须设计一个定时器来定时点亮数码管,在该例子中,定时器的定时为5ms,即每个数码管点亮时间为5ms,扫描四个数码管的时间为20ms。
  源码:
  /*实验名称:数码管实验
  *描 述:在该章节的数码管实验当中,
  使用动态驱动数码管的方式来编写程序,
  程序的实现方式是数码管从0-9999循环显示
  *作 者:温子祺
  *修改日期:2010/5/4
  */
  #include "stc.h"
  #define HIGH 1
  #define LOW 0
  #define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;}
  #define LS164_CLK(x) {if((x))P0_5=1;else P0_5=0;}
  #define SEG_PORT P0
  unsigned char Timer0IRQEvent=0;
  unsigned char Time1SecEvent=0;
  unsigned int TimeCount=0;
  unsigned char SegCurPosition=0;
  code unsigned char SegCode={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
  //code unsigned char SegPosition={0xfe,0xfd,0xfb,0xf7};
  code unsigned char SegPosition={0xf7,0xfb,0xfd,0xfe};
  unsigned char SegBuf ={0};
  void LS164Send(unsigned char byte)
  {
  unsigned char j;
  for(j=0;j=7;j++)
  {
  if(byte&(1(7-j)))
  {
  LS164_DATA(HIGH);
  }
  else
  {
  LS164_DATA(LOW);
  }
  LS164_CLK(LOW);
  LS164_CLK(HIGH);
  }
  }
  void RefreshDisplayBuf(void) //刷新显示缓存
  {
  SegBuf =TimeCount%10;
  SegBuf =TimeCount/10%10;
  SegBuf =TimeCount/100%10;
  SegBuf =TimeCount/1000%10;
  }
  void SegDisplay(void)
  {
  unsig......绿竹别其三分景 红梅正报万家春 春回大地

关于51源码,如何通过51单片机控制LED灯以1s的频率闪烁,求源代码的介绍到此结束,希望对大家有所帮助。

如何通过51单片机控制LED灯以1s的频率闪烁,求源代码?51单片机源代码存放在RAM30H-3FH中,求补码,将结果存入RAM40H-4FH

本文编辑:admin

更多文章:


制作网页时通常需要在同一网页内跳转常常采用制作什么超链接(简述在网页设计中制作超链接的类型)

制作网页时通常需要在同一网页内跳转常常采用制作什么超链接(简述在网页设计中制作超链接的类型)

这篇文章给大家聊聊关于制作网页时通常需要在同一网页内跳转常常采用制作什么超链接,以及简述在网页设计中制作超链接的类型对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月5日 07:00

印刷管理软件开发平台(晨辉erp系统有都有哪些功能)

印刷管理软件开发平台(晨辉erp系统有都有哪些功能)

本篇文章给大家谈谈印刷管理软件开发平台,以及晨辉erp系统有都有哪些功能对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月5日 06:45

方丈和主持的区别(住持和方丈的区别是什么)

方丈和主持的区别(住持和方丈的区别是什么)

其实方丈和主持的区别的问题并不复杂,但是又很多的朋友都不太了解住持和方丈的区别是什么,因此呢,今天小编就来为大家分享方丈和主持的区别的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年9月5日 06:30

北京到牡丹江的火车票(K265火车经过的站点)

北京到牡丹江的火车票(K265火车经过的站点)

本篇文章给大家谈谈北京到牡丹江的火车票,以及K265火车经过的站点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月5日 06:15

网站设计毕业论文大纲(论文设计写作提纲要点)

网站设计毕业论文大纲(论文设计写作提纲要点)

大家好,今天小编来为大家解答以下的问题,关于网站设计毕业论文大纲,论文设计写作提纲要点这个很多人还不知道,现在让我们一起来看看吧!

2026年9月5日 06:00

开发工具按钮是表格部分数据清零(怎么添加一个Excel批量删除多个单元格内容按钮)

开发工具按钮是表格部分数据清零(怎么添加一个Excel批量删除多个单元格内容按钮)

大家好,今天小编来为大家解答以下的问题,关于开发工具按钮是表格部分数据清零,怎么添加一个Excel批量删除多个单元格内容按钮这个很多人还不知道,现在让我们一起来看看吧!

2026年9月5日 05:45

网页打不开飞书(如何让飞书打开html)

网页打不开飞书(如何让飞书打开html)

大家好,如果您还对网页打不开飞书不太了解,没有关系,今天就由本站为大家分享网页打不开飞书的知识,包括如何让飞书打开html的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月5日 05:30

石家庄网站优化全包(石家庄公交第三批线网线优化什么时候开始)

石家庄网站优化全包(石家庄公交第三批线网线优化什么时候开始)

大家好,如果您还对石家庄网站优化全包不太了解,没有关系,今天就由本站为大家分享石家庄网站优化全包的知识,包括石家庄公交第三批线网线优化什么时候开始的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月5日 05:15

一个卖东西的微信小程序,都需要什么条件怎么制作?我想做一个社区团购的小程序,怎么入手呢,大概需要花多少钱

一个卖东西的微信小程序,都需要什么条件怎么制作?我想做一个社区团购的小程序,怎么入手呢,大概需要花多少钱

今天给各位分享一个卖东西的微信小程序,都需要什么条件怎么制作的知识,其中也会对一个卖东西的微信小程序,都需要什么条件怎么制作进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月5日 05:00

建筑工程公司是干什么的(建筑公司是干嘛的)

建筑工程公司是干什么的(建筑公司是干嘛的)

“建筑工程公司是干什么的”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看建筑工程公司是干什么的(建筑公司是干嘛的)!

2026年9月5日 04:45

最近更新

热门文章

标签列表