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

本文目录
- 如何通过51单片机控制LED灯以1s的频率闪烁,求源代码
- 51单片机源代码存放在RAM30H-3FH中,求补码,将结果存入RAM40H-4FH
- 什么是51单片机源程序
- c51 库函数 是keil实现的吗可以查看源代码吗
- 51单片机,为什么把源代码分成几个模块后,程序运行却变慢了很多,哪里出了问题呀
- 51单片机程序编写
- 用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1
如何通过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......绿竹别其三分景 红梅正报万家春 春回大地

更多文章:
制作网页时通常需要在同一网页内跳转常常采用制作什么超链接(简述在网页设计中制作超链接的类型)
2026年9月5日 07:00
开发工具按钮是表格部分数据清零(怎么添加一个Excel批量删除多个单元格内容按钮)
2026年9月5日 05:45
石家庄网站优化全包(石家庄公交第三批线网线优化什么时候开始)
2026年9月5日 05:15
一个卖东西的微信小程序,都需要什么条件怎么制作?我想做一个社区团购的小程序,怎么入手呢,大概需要花多少钱
2026年9月5日 05:00






