① 我是一个单片机初学者,我想问一下我需要学哪些知识
我觉得首先要看懂111条指令,懂意思就行,根本就不需要每一条都记住,因为常用的都只有四五十条罢了。那么多的指令意在可以用多种语句实现同一种功能。
还有就是一定要实际的编程,这一点是非常重要的,只有在实际编程中才能熟悉指令的应用,当然你或许会问自己什么都不懂怎么编程啊,这时候你不要着急,你可以你买一本书,有实际的例子的书,我也见过有这种书但是名字我忘记了,它每个例子是讲得十分详细,有汇编的代码,也有C语言的代码,而且每一行都有注释(名字我忘记了只记得那封皮是黑色的)你可以仿照它的代码写写看,再仿真一下,或者在实际的板子上试试看能不能实现功能,别人的程序修改了能用在自己的板子上那么就是自己的程序了。
至于仿真软件我建议用protues,专用的单片机仿真软件。
如果是自学,那么不懂的地方可以上网收索或者上论坛询问,这里有个单片机的QQ群,是官方建的你可以加上一起学习讨论群号是:7344883
还有在了解指令的同时你要了解你的板子的结构亦即电路连接才能写好你的程序。
当你学到一定程度的时候你可以学习一下单片机的外围电路设计比如液晶显示啊,A/D转换啊什么的....
总之,实际编程练习是学好单片机的唯一途径,至于它和汇编的关系,楼上的哥们儿已解释得十分清楚了的,就不多说了,免得啰嗦。
最后,祝你成功!!!
② 单片机流水灯程序
我是一名多年的单片机工程师,下面的程序你参考一下
效果图
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint i;
uchar j;
void delay_ms(uint k) //延时子程序
{
for(i=0;i<k;i++)
{
for(j=0;j<230;j++)
{
;
}
}
}
main()
{
uchar a,b;
P1=0xfe;
delay_ms(500);
b=P1;
while(1)
{
for(a=0;a<3;a++)
{
b=_crol_(b,1);
P1=b;
delay_ms(500);
}
P1=0xf0;
delay_ms(500);
P1=0xfe;
delay_ms(500);
b=P1;
}
}
如果你想学习更多单片机和程序的知识,可以看看我整理好的“17个实验学会单片机”,网络一下“17个实验学会单片机”就可以看到在首页了。
③ 如何用单片机做流水灯
因为电路用单片机控制,所以电路非常简洁。其电路原理图见下图,印制板图如下图所示。
电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口,我们这里只用到Pl口,共8个引脚。图中Cl、R9组成典型的上电复位(即在加电时单片机复位)电路,XTAL、C2、C3与AT89C2051片内振荡电路组成时钟振荡器。值得注意的是,C2、C3的容量不能与图中数值偏差太大,否则可能引起不起振或振荡不稳定。XTAL的频率可以在4-20MHz之间,不过,频率的变化会导致程序运行速度的变化,这样就需要调整延时子函数的参数。事实上,不调整参数亦可,只是此时延迟时间不再是1秒,其延迟时间会随着XTAL频率的降低而增加。
二、软件部分
本程序包含两个函数,一个是主函数,另一个是延时子函数。源程序如下(为了便于讲解,我们为每行程序加上了编号):
程序各行作用如下:
00行:把AT89C2051的头文件“AT89x051.H”包含进来。
01行:声明Delay()延时子函数,该函数有一个无符号整型参数k,同时函数前面的void表明函数不返回函数值。
02行:延时子函数的开始,同时声明两个无符号整型变量i和j。
不过请注意,这里没有象上期的程序一样,把表示函数开始的“{”单独成行,而是把下一行写在一起了。事实上,写C程序的时候,可以把多行写作一行,C编译器只要遇到分号就认为是一行语句的结束。
当然,我们不能因为C程序有这个特点,就随意把多行合作一行书写,实际书写C程序的时候,还是要养成良好的程序书写习惯,按照约定俗成的原则来书写。
03行:声明for()循环。这个循环的初始条件是i=0,终止条件是i<k,循环计数是每循环一次,用手计数的变量i加1。因此,这个循环的循环次数就是k次。这样,只要改变k的值(即改变Delay()延时子函数的参数k的值),就可以很容易地控制循环次数,从而获得不同的延时时间。
04行:声明嵌套在03循环中的一个新的for()循环,这个循环与上一个循环相似,其循环次数是120次。本循环与上一个循环嵌套后,使得总的循环次数达120×k次。
05行:第一个分号,表示L条空语句,占用一个机器时间,以实现延时的目的。后面的两个“}”中,第一个“}”是04行for()循环的结束标志,程序遇到它时,将自动返回04行,使用于循环计数的变量j加1,同时判断j是否小于120,如果否,则转入05行;第二个是03行for()循环的结束标志,程序遇到它则会返回03行
④ 51单片机实现流水灯
用个移位处理就行了 set(void) { 流水灯.c * 描述 : 该程序实现LED的流水灯显示。 该程序用于学习 LED流水本例中是调用的 intrins.h 中的
⑤ 51单片机流水灯程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//点亮第一个灯
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延时1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什么也不做
}
}
//点亮第二个灯
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//点亮剩余的灯
//省略……
while(1);
}
流水灯几点说明:
void:因为该延时函数不需要返回值,所以写为void
delay1s:该函数的函数名,命名需要符合C语言的标识符命名规则。
(): 不需要传入参数,所以括号中为空
至此我们可以把流水灯程序写为以下形式:
⑥ 很简的51单片机C语言流水灯程序
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:
#include<reg51.h> //51单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{ //delay(500);大约延时500ms.
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a,i,j;
while(1) //大循环
{
a=0xfe; //赋初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_crol_(a,1); //将a变量循环左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_cror_(a,1); //将a变量循环右移一位
}
}
}
2、51单片机是对所有兼容Intel
8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash
rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
⑦ 单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)
单片机流水灯C语言程序的源代码如下:
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp>>=1;
}
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
(7)单色流水灯单片机扩展阅读
51单片机流水灯的源代码如下
#include<reg51.h>
#include<intrins.h>
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<110;i++);
}
main()
{
inti;
while(1)
{
P0=0xfe;
for(i=0;i<8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}
⑧ 如何用单片机简单制作一个流水灯
工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)
材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。
以下程序可以直接用Keil C 直接编译执行。
//可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。
//具体实现方法可以参考如下程序:
#include<reg51.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uinta);
voidmain()
{
P1=0xfe;
while(1)
{
//向左循环点亮LED
for(i=0;i<7;i++)
{
P1=_crol_(P1,1);//左移一位,点亮下一位LED
delay(55);
}
//向右循环点亮LED
for(i=0;i<7;i++)
{
P1=_cror_(P1,1);//右移一位,,点亮上一位LED
delay(55);
}
}
}
//延时函数,延时a毫秒
voiddelay(uinta)
{
uintx,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
⑨ 51单片机中如何用汇编语言编写流水灯
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:
ORG 0000H ;复位启动
AJMP START ;
ORG 001BH ;T1中断
AJMP T1INT ;
;定义变量========================
YSJS EQU 30H;延时计数器
LED EQU 31H;LED控制缓冲器
;主程序==========================
START: MOV LED,#0FEH ;初始化数据
MOV YSJS,#0 ;
MOV TMOD,#10H ;定时器1工作于方式1,16位定时器
MOV TL1,#0B0H ;设置定时初值
MOV TH1,#3CH ;定时时间=50mS
SETB ET1 ;使能定时器1中断
SETB TR1 ;启动定时器1
SETB EA ;开总中断
MOV P1,LED ;初始化流水灯
LOOP: JMP LOOP ;循环等待中断
T1INT: PUSH PSW ;定时器1中断程序
PUSH ACC ;保护现场
MOV TH1,#3CH ;定时时间=50mS
MOV TL1,#0B0H ;
INC YSJS ;
PUSH ACC ;保护ACC
MOV A,YSJI ;
CJNE A,#2,QT1 ;50mS*2=100mS
MOV P1,LED ;
MOV A,LED ;
RL A ;累加器A的值循环左移1位
MOV LED,A ;
MOV YSJS,#0 ;
QT1: POP ACC ;恢复现场
POP PSW ;
RETI ;返回主程序
END ;汇编程序结束
(9)单色流水灯单片机扩展阅读:
实现流水灯的三个方法:
第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。
第三种,库函数实现流水灯。利用左移函数进行。
⑩ 单片机,流水灯
下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
基于单片机的流水灯介绍_51单片机流水灯的五种实现方法
基于单片机的流水灯介绍_51单片机流水灯的五种实现方法
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
1、通过改变赋值实现流水灯
void main()
{ while(1) {
P2=0xfe;
delay1ms(500); P2=0xfd; delay1ms(500); P2=0xfb;
delay1ms(500); P2=0xf7; delay1ms(500); P2=0xef; delay1ms(500); P2=0xdf;
delay1ms(500); P2=0xbf; delay1ms(500); P2=0x7f;
delay1ms(500); } }
2、通过公式运算实现流水灯
void main() {
while(1) {
uinta,b=1; P2=0xfe; delayms(500); for(a=0;a<7;a++)
P2-=b; // P2=P2-b delayms(500); b=b*2; //都化为同一类型进制运算 } } }
3、通过操作符<<与“|”实现流水灯 (通过移位实现流水灯)
void main() {
uchara,i;
while(1) {
a=0xfe; //点亮第一位LED灯 for(i=0;i<8;i++)
{ P2=a;
a=a<<1; //左移一位
a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500); } } }
4、通过库函数_crol_(字符左移)实现流水灯
void main()
{
uint a; a=0xfe; while(1) {
P2=a;a=_crol_(a,1); delay_ms(500); } }
5、采用数组实现流水灯
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(void) {
uchari;
while (1) {
for(i=0;i<8;i++) //循环点亮8只LED灯 {
P2=table[i];
delay_ms(500); //延时500毫秒 } } }