用合泰单片机控制2个LED亮度,有51的程序。然后移植到了合泰单片机上 功能都一样的

合集下载

51单片机二极管发光程序

51单片机二极管发光程序

51单片机二极管发光程序
51单片机(STC89C52)可以通过控制IO口来驱动二极管发光。

下面我将为你提供一个简单的例子,演示如何在51单片机上使用C
语言编写程序来控制二极管发光。

首先,我们需要连接一个二极管到单片机的IO口上。

假设我们
将二极管连接到P1口的第0个引脚上。

然后,我们可以使用C语言编写如下的程序来让这个二极管发光:
c.
#include <reg52.h> // 包含51单片机的寄存器定义文件。

void main() {。

P1 = 0xFE; // 将P1口的第0个引脚拉低,使二极管发光。

while(1) {。

// 这里可以添加你需要的其他操作。

}。

}。

在这个简单的例子中,我们使用了reg52.h头文件来包含51单
片机的寄存器定义。

然后在main函数中,我们将P1口的第0个引
脚拉低,使二极管发光。

接着使用一个无限循环来让程序持续执行。

需要注意的是,具体的连接方式和引脚的控制可能会根据具体
的硬件电路设计而有所不同。

在实际的项目中,你可能需要根据具
体的硬件连接情况和需求来编写相应的程序。

另外,如果你需要实现更复杂的功能,比如控制二极管的闪烁、呼吸灯效果等,你可能需要使用定时器中断、PWM控制等技术来实现。

这需要更深入的学习和了解51单片机的相关知识。

希望这个简
单的例子能够帮助你入门。

51单片机控制LED灯程序设计

51单片机控制LED灯程序设计

51单片机控制LED灯程序设计首先,我们需要明确要使用到的硬件资源和引脚连接情况。

假设我们使用的是STC89C51单片机,LED灯的正极连接到单片机的P1口,负极通过电阻连接到地。

接下来,我们需要了解一些基本的汇编指令和编程规范。

在编写51单片机程序时,需要使用到一些特定的寄存器和指令。

首先是P1寄存器,它用来控制P1口的输出和输入状态。

然后是MOV指令,这是一个用来将数据从一个寄存器复制到另一个寄存器的指令。

最后是一个延时函数,可以利用循环来实现延时。

首先,我们需要初始化P1口为输出状态。

在51单片机中,IO口可以被配置为输入(1)或输出(0)。

我们可以使用MOV指令将0赋值给P1寄存器,将其配置为输出。

此外,我们还需要一个简单的延时函数,来控制LED灯的亮灭时间。

下面是一个基本的51单片机控制LED灯的程序:```assemblyORG0;程序的起始地址MOVP1,;初始化P1口为输出状态LOOP:;主循环MOVP1,;将P1的状态置为0,LED灯灭ACALLDELAY;调用延时函数,延时一段时间MOVP1,;将P1的状态置为1,LED灯亮ACALLDELAY;调用延时函数,延时一段时间JMPLOOP;无限循环DELAY:;延时函数MOVR3,;初始化循环计数器为250LOOP1:MOVR2,;初始化循环计数器为250LOOP2:MOVR1,;初始化循环计数器为250LOOP3:DJNZR1,LOOP3;内层循环DJNZR2,LOOP2;中层循环DJNZR3,LOOP1;外层循环RET;返回主程序```以上是一个简单的51单片机控制LED灯的汇编程序。

程序中通过不断切换P1口的状态来实现LED灯的亮灭。

同时,通过调用延时函数来实现亮灭的时间间隔。

在主循环中,LED灯会亮和灭各一段时间,然后无限循环。

为了将以上汇编程序烧录到单片机中,需要将其汇编为二进制文件。

通常可以使用Keil C等开发工具进行汇编和烧录操作。

合泰单片机交流电过零检测方案

合泰单片机交流电过零检测方案

Z1 5.1V D1
C4 470U/16V
C5 104
1N4007 +5V R5 100K
R3 2M
R4 2M
U1
1 PA3/PFD PA2 PA1 PA0 PB3/AN3 PB2/AN2 PB1/AN1 PB0/AN0 VSS PA4/TMR PA5/INT PA6 PA7/SDA OSC2 OSC1 VDD RES PD0/SCL 18 RST
限流电阻数值最好选取在 4M ~ 5MΩ 范围内。
• 满足更好的 EMC 对策,建议通过软件和硬件两个方面来解决,如图 1 中添加 EMI 输入
滤波器和流程图 10 中加入重置旗标的方法。
11
(2)
如果 VRMS =230V,R1=R2=2M ohms,可以得到注入电流为: :
Ij =
230 = 57.5uA < 400uA 2*10 + 2*106
6
当输入的 AC 电源为 230V AC/50Hz, 相应 ZCD 电路的实际波形如图 4 (无负载时) 和图 5 (带 负载时)。 这里 CH1 连接测试点 TP2;而 CH2 连接测试点 TP1。在图 6 所示中,当 PA5 Pin 上之输入信号电位从 0V 上升到 0.7VDD=0.7×5V=3.5V (即高准位门限值,请参照 Datasheet 之 DC 特性),此时输入信号的过零点将滞后 240µs。当然,改变两个限流电阻 R1 和 R2 的 阻值,可以改变过零点滞后时间。由此可见,合适的滞后时间不会影响 AC 电源频率测量 的精度,所以我们建议过零点限流电阻阻值最好选取为 4MΩ~ 5MΩ,从而保证过零注入 电流 Ij <
HT46R47 对 AC 过零信号进行检测

单片机一个IO口如何控制两颗发光二极管LED?

单片机一个IO口如何控制两颗发光二极管LED?

单片机一个IO口如何控制两颗发光二极管LED?
单片机的一个GPIO只能输出0和1两种状态,如果控制一个LED 灯的话,可以实现LED的亮灭控制。

两个LED具有四个状态:1)同时亮;2)同时灭;3)一个亮一个灭;4)一个灭一个亮。

如果用一个GPIO 的话,无法输出四种状态,所以要分情况讨论。

1.两只LED同时亮/灭的情况
这种情况其实是把两个LED看作是同一个,两个LED具有同样的状态,即两个LED同时点亮或者同时熄灭。

如果是这种情况可以考虑如下的电路设计:
两只LED并联,单片机以灌电流的方式驱动。

这样可以降低单片机的输出功耗。

单片机的GPIO输出高电平1时,两个LED同时熄灭;单片机的GPIO输出低电平时,两个LED同时点亮。

也可以考虑两只LED串联的情况,但是需要考虑LED自身的压降。

对于具体的实施电路,可以考虑采用三极管或者MOS作为驱动。

2.两只LED不同是亮/灭的情况
这时需要考虑将两只LED同向串联,将单片机的GPIO口接在两只LED的公共端。

其典型的示意电路图如下图所示。

两只LED同向串联后串在电源电路中,单片机的GPIO控制两个LED的公共端。

当单片机输出高电平1时LED1熄灭,而LED2被点亮(拉电流的方式);当单片机输出低电平0时LED1被点亮(灌电流的方式),而LED2熄灭。

这种情况时需要考虑电阻的选型,也可以使用三极管或者MOS管作为驱动。

Holtek(合泰)单片机指令介绍

Holtek(合泰)单片机指令介绍

影响标志:Z
INCA [m]
指令说明:
RAM
[m]+1
ALU Shifter
ACC
影响标志:Z
减1指令
DEC [m]
指令说明:
RAM
[m]-1
ALU Shifter
影响标志:Z
DECA [m]
指令说明:
RAM
[m]-1
ALU Shifter
ACC
影响标志:Z

……
〈例〉
RAM
辑单元) – STATUS (Status register 状态寄存器) – STACK (Stack register 堆栈寄存器)
MCU概述 指令系统概述 HOLTEK指令系统
指令系统概述
分类 寻址方式 指令周期 状态寄存器 指令中的常用符号
分类
HOLTEK8位系列单片机共有63条功能强大的 汇编指令。这些指令按功能可分为以下七类。
RRC [m]
指令说明:
RAM
STATUS
ALU Shifter
MSB
LSB
76543210 C
D7 D6 D5 D4 D3 D2 D1 D0 C
76543210 C C D7 D6 D5 D4 D3 D2 D1 D0
影响标志:C
RRCA [m]
指令说明:
RAM
STATUS
ALU Shifter
影响标志:Z
ORM A,[m]
指令说明:
RAM
ALU ACC“OR”[m] Shifter
ACC
影响标志:Z
OR A,X
指令说明:
ROM
ALU Shifter
ACC“OR”X

51单片机与led灯的接口原理

51单片机与led灯的接口原理

51单片机与led灯的接口原理一、引言51单片机是一种广泛应用于嵌入式系统中的微控制器。

而LED(Light Emitting Diode)灯则是一种能够直接将电能转化为光能并发出可见光的半导体器件。

在嵌入式系统中,LED灯的使用十分广泛,常用于指示灯、显示屏等方面。

本文将详细介绍51单片机与LED灯的接口原理。

二、LED灯的基本原理LED灯是一种二极管,能够将电流转化为光能并发出光线。

其结构由一个PN结和一种能够发射光的半导体材料组成。

当外加电压导通PN结时,正向电流通过PN结,并在PN结内部的蓝宝石晶体中发射光线。

三、使用端口口输出控制LED灯1. 设置引脚为输出模式:通过将相应I/O口的数据方向寄存器(Data Direction Register)设为输出方向,将对应的引脚设置为输出模式。

2. 给引脚输出高电平或低电平:通过对相应I/O口的数据寄存器(Data Register)进行操作,可以使引脚输出高电平或低电平。

3.连接LED灯:将LED灯的阳极(正极)与51单片机的引脚相连,将LED灯的阴极(负极)与51单片机的电源GND相连。

4.对LED灯进行控制:通过对引脚输出高电平或低电平,可以控制LED灯的亮灭。

四、使用通用开关二极管控制LED灯通用开关二极管可用作简单的开关元件,可以通过其导通和截止状态来控制LED灯的亮灭。

具体步骤如下:1.选择合适的开关二极管:选择一个适用于LED灯的开关二极管,要求其典型开启电压低于单片机的高电平输出电压,且最大承受电流大于LED灯的最大工作电流。

2.连接开关二极管:将开关二极管的阴极连接到单片机的引脚,将其阳极连接到LED灯的阳极。

LED灯的阴极连接到电源的GND。

3.控制开关二极管状态:通过对单片机引脚输出高低电平,可以控制开关二极管的导通和截止状态,从而控制LED灯的亮灭。

五、使用数字集成电路控制LED灯除了基本的I/O口输出控制和通用开关二极管控制外,还可以通过数字集成电路来控制LED灯的亮灭。

合泰指令教学

合泰指令教学

逻辑运算




AND OR XOR ANDM 器 ORM 器 XORM 储器 AND OR XOR CPL CPLA
A,[m] A,[m] A,[m] A,[m] A,[m]
;ACC与数据存储器做“与”运算,结果放入ACC ;ACC与数据存储器做“或”运算,结果放入ACC ;ACC与数据存储器做“异或”运算,结果放入ACC ;ACC与数据存储器做“与”运算,结果放入数据存储 ;ACC与数据存储器做“或”运算,结果放入数据存储

单片机的特点

小巧灵活、成本低、易于产品化。它能方便地组装成各种 智能式控制设备以及各种智能仪表。面向控制,能针对性 地解决从简单到复杂的各类控制任务,从而获得最佳性价 比。抗干扰能力强,适应温度范围宽,在各种恶劣条件下 都能可靠地工作,这是其它机型所无法比拟的。可以很方 便地实现多机和分布式控制,使整个系统的效率和可靠性 大为提高。
数据传送

MOV MOV MOV
A,[m] [m],A A, x
;将数据存储器送至ACC ;将ACC送至数据存储器 ;将立即数送至ACC
位运算

CLR SET
[m].i [m].i
;清除数据存储器的位 ;置位数据存储器的位
转移






JMP SZ SZA SZ SNZ SIZ SDZ SIZA 下一条指令 SDZA 下一条指令 CALL RET RET RETI
单片机指令概述
合泰单片机指令运用
了解指令,让编程序变得更容 易.
什么是单片机

单片机就是一块单片的计算机看起来就是一个黑块,他把计算机正常工 作所需要用的设备接口等全部集成在一个芯片上,并可以完成一些简 单的工作,这里举一个简单的例子让你了解单片机是什么是干什么功 能的,比如说你现在把一个led小灯,接在了单片机的P1.0引脚上,我 们要灯亮就给单片机一个 setb P1.0 的指令,我们要灯熄灭就给 clr p1.0 灯就熄了。 说到这里我们要问到底什么是单片机呢?他就是一个电脑,只不 过是微型的,麻雀虽小,五脏俱全:它内部也用和电脑功能类似的模 块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不 同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱就 相对便宜多了.

51单片机利用LED宏,控制LED等的亮度

51单片机利用LED宏,控制LED等的亮度
sbitled1=P1;
sbit led2led4=P1;
sbit led5=P1 ;
sbitled6=P1;
sbitled7=P1;
sbit ledLock=P2 ; //锁定当前8个led的状态,0锁定,1不锁定
#endif
void ledCtr(u8 ledX,u8 per) //参数1是某个灯,参数2是亮度
typedef unsigned shortint u16;
#ifndef _51LED_
#define _51LED_
#define led P1 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮
#define LED led
#define ON(x) P1(~(1(x))) //打开某个灯,开多个灯用ON(m)ON(n)
51单片机利用LED宏,控制LED等的亮度
经常用led灯来观察现象,甚至调试代码,修改代码时用0和1很不方便,而且
阅读性也不好,利用个宏,用起来方便些。
今天尝试控制灯的亮度.先试试for循环控制,占空比调节...
c代码
//#include my51.h
#include
typedef unsigned char u8;
{
u8 i=1;
for(i=1;i=100;i++)
{
if(i
{
led=on(ledX) ; //打开灯
}
else
{
led=off(ledX); //关闭灯
}
}
}
void delayms(u16 ms)//毫秒级软延时函数
{
u16 i,j;
#define OFF(x) P1|(1(x))//关闭某个灯,关多个灯用OFF(m)| OFF(n)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何移植一个51的程序到合泰单片机
下面是一个51的程序,通过一个按键控制2个LED灯的亮暗:
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
sbit button=P3^0;
sbit cold=P1^2;
sbit hot=P1^0;
uchar flag,ZKBH,ZKBC,m=0,m1=0;
bit eavalue,trvalue;
long int keytime=0;
uchar code
tableh[5][5]={{0,0,0,0,0},{5,10,15,20,25},{10,20,30,40,50},{10,20,30,40,50},{10,20,30,40,50}}; uchar code
tablec[5][5]={{10,20,30,40,50},{10,20,30,40,50},{10,20,30,40,50},{5,10,15,20,25},{0,0,0,0,0}}; void init_sys(void);
void Delay10Ms();
void tiaose();
void liangdu();
void keyscan();
void main()
{
eavalue=0;
trvalue=0;
flag=0;
P1=0xff;
init_sys();
while(1)
{
ZKBH=tableh[m][m1];
ZKBC=tablec[m][m1];
keyscan(); /*得出了flag的值为长短按键选项*/
}
}
void init_sys(void)
{
TMOD=0X01;
TH0=0XFF;
TL0=0X9c;
TR0=1;
ET0=1;
EA=1;
}
void timer0( ) interrupt 1 using 2 //PWM的产生
{
static uchar i=0;
TH0=0XFF;
TL0=0X9c;
i++;
if(i>=100)
i=0;
if(i<(ZKBH-0)) //减去0就是把char换成了int形式/*当小于等于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
hot=0;
else
hot=1;
if(i>=(100-ZKBC))
cold=0;
else
cold=1;
}
void keyscan()
{
uint temp;
flag=0;
if(!button)
Delay10Ms();
if(!button)
{
keytime=0;
while(!button){
keytime++;
temp=25;
while(temp--) ;
if(keytime>3000)
{
if(EA==0)
{
temp=60000;
while(temp--);
temp=6000;
while(temp--) ;
}
EA=eavalue;
TR0=trvalue;
P1=0xff;
flag=1;
keytime=0;//这条省去长按会闪烁
}
}
}
if(flag==1)
{
flag=0;
eavalue=~eavalue;
trvalue=~trvalue;
keytime=0;
}
if (keytime<600&&keytime>0) tiaose();
if(keytime>600&&keytime<3000) liangdu();
}
void tiaose()
{
m=m+1;
if(m>=5) m=0;
ZKBH=tableh[m][m1];
ZKBC=tablec[m][m1];
keytime=0;
}
void liangdu()
{
m1=m1+1;
if(m1>=5) m1=0;
ZKBH=tableh[m][m1];
ZKBC=tablec[m][m1];
keytime=0;
}
void Delay10Ms()
{
uint temp;
temp=1205;
while(temp--) ;
}
51的程序结束了
下面是移植到合泰单片机中,功能都是一样的。

只是对应的引脚改变了还有定时器的初值改变了
#include "HT48R01C.h"
#define uchar unsigned char
#define uint unsigned int
#define button _pa0
#define cold _pa5
#define hot _pa6
#pragma rambank0
bit eavalue;
bit trvalue;
#pragma norambank
uchar flag,ZKBH,ZKBC,m,m1;
uchar i;
uint keytime;
uint temp;
const uchar
tableh[5][5]={{0,0,0,0,0},{3,7,10,13,17},{10,20,30,40,50},{10,20,30,40,50},{10,20,30,40,50}}; const uchar
tablec[5][5]={{10,20,30,40,50},{10,20,30,40,50},{10,20,30,40,50},{3,7,10,13,17},{0,0,0,0,0}}; //uchar tableh[5][5];
//uchar tablec[5][5];
void init_sys(void);
void Delay10Ms();
void tiaose();
void liangdu();
void keyscan();
#pragma vector ISR_TIMER0 @ 0x8
void ISR_TIMER0(void)
{
_tmr0=253;
i++;
if(i>=100)
i=0;
if(i<(ZKBH-0)) //减去0就是把char换成了int形式/*当小于等于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
cold=0;
else
cold=1;
if(i>=(100-ZKBC))
hot=0;
else
hot=1;
}
void main()
{
eavalue=0;
trvalue=0;
flag=0;
keytime=0;
m=0;
m1=0;
i=0;
init_sys();
while(1)
{
ZKBH=tableh[m][m1];
ZKBC=tablec[m][m1];
keyscan();
}
}
void init_sys(void)
{
_pac0=1;
_pac5=0;
_pac6=0;
_pa=0xf;
_intc0=0x05;
_tmr0c=0x87;
_tmr0=253;
_t0on=1;
}
void keyscan()
{
flag=0;
if(!button)
// Delay10Ms();
if(!button)
{
keytime=0;
while(!button){
keytime++;
temp=25;
while(temp--) ;
if(keytime>4000)
{
if(_emi==0)
{
temp=60000;
while(temp--);
temp=6000;
while(temp--) ;
}
_emi=eavalue;
_t0on=trvalue;
_pa=0xf;
flag=1;
keytime=0;//这条省去长按会闪烁
}
}
}
if(flag==1)
{
flag=0;
eavalue=~eavalue;
trvalue=~trvalue;
keytime=0;
}
if(keytime<600&&keytime>0) tiaose();
if(keytime>600&&keytime<3000) liangdu(); }
void tiaose()
{
m=m+1;
if(m>=5) m=0;
// ZKBH=tableh[m][m1];
// ZKBC=tablec[m][m1];
keytime=0;
}
void liangdu()
{
m1=m1+1;
if(m1>=5) m1=0;
// ZKBH=tableh[m][m1]; // ZKBC=tablec[m][m1];
keytime=0;
}
void Delay10Ms()
{
uint temp;
temp=1205;
while(temp--) ; }
希望对你有所帮助.。

相关文档
最新文档