A. 用C语言编写8051单片机程序
/********************************
/* MCU: AT89S52
/* MCU-crystal: 12M
/* Version: 01
/* Last Updata: 2009-2-21
/* Author:
/* Description:
/* 使用定时器0,定时中断2ms一次对数码管显示扫描;
/* 三个位管要以扫描方式显示,使用共阳管,计数速度为1S;
/* 段A-H接到P0.1....7,位选为 P1.0,1,2;
/* 流水也以计数方式从200到250在P2口显示,低电平有效;
/****************************************************/
#include <reg52.h>
unsigned char code num_disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//共阳数字字形0到9
unsigned char code bit_sel[]={0xfb,0xfd,0xfe};//低电平有效数字个十百位选择
unsigned char buf[3]={0,0,2};//计算中的个十百位暂时存放处
unsigned char one,ten,second;//个十位变量和流水灯显示3秒的时间变量
unsigned char rate;//扫描速度,调整以适应显示效果
unsigned char stop=0, flag=1,flag1=0;//闪烁3秒的标志位,用于主函数对中断的关断参数传递
unsigned int t,tt;//2ms变量
unsigned char rate;//与变量t同步,辅助赋值变
/**********主函数**********/
main(void)
{
TMOD=0X01;
TH0=0xf8;//定时2ms
TL0=0x30;
ET0=1;
EA=1;
TR0=1;
while(1)
{ if(stop==1)//判断stop信号,为1后便关闭定时器
{ TR0=0;
ET0=0;
EA=0;
}
}
}
/*******************中断*******************/
void timer0() interrupt 1
{
TH0=0xf8;//重新赋值定时2ms
TL0=0x30;
if(flag==0)//定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务
{
t++;
if(t==500)
{ t=0;
one++;
P2=200+ten*10+one; //在P2口的流水等,也是从200开始计数。
if(one==10)
{ one=0;
ten++;
if(ten==5)
{ flag=1;//转向执行闪烁任务
}
}
}
}
else//flag已经==1;转向else执行流水灯闪烁任务
{ tt++;
if(tt==500)
{ tt=0;
second++;
P2=~P2;//流水灯全部以1S速度闪烁
if(second==3)stop=1;//判断3秒时间到,关闭中断,停止闪烁,数码管熄灭
}
}
rate++;
P0=0XFF;//消隐
if(rate==3)rate=0;
P0=num_disp[buf[rate]];
P1=bit_sel[rate];
buf[0]=one;
buf[1]=ten;
//因为百位没有变,所以不用赋值
}
B. 一个花样流水灯单片机程序(要求1,3,5,7灯亮,2,4,6,8灯亮然后全灭)
先把P1口全部接低电平。
ORG 0000H。
AJMP START。
ORG 0040H。
AA:MOV P1,#55H。
ACALL DELAY。
MOV P1,#0AAH。
ACALL DELAY。
MOV P1,#00H。
ACALL DELAY。
AJMP AA。
DELAY:MOV R5,#256。
LOOP2:MOV R4,#256。
LOOP1:NOP。
NOP。
DJNZ R4,LOOP1。
DJNZ R5,LOOP2。
RET。
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。
在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
C. 51单片机设计流水灯程序,用C语言
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
voiddelay(void)
{
uchari,j;
for(i=0;i<150;i++)
for(j=0;j<240;j++);
}
main()
{
ucharled,i,j;
while(1)
{
for(i=0;i<8;i++)
{
led=0xfe<<i;
for(j=0;j<8-i;j++)
{
P0=led;
led=_crol_(led,1);
delay();
}
}
}
}
D. 单片机程序解释
1、
ORG 0000H //程序入口
LJMP START //跳到START处
ORG 000BH //定义定时器/计数器T0的中断入口地址
LJMP T0_INT //跳到T0_INT处,即T0中断的服务程序标号
START:
MOV TMOD, #02 //设置定时器/计数器的工作方式,这里为方式2,8位的常数自动重装
MOV TH0, #6 //定时器置初值,T0的高位
MOV TL0, #6 //定时器置初值,T0的低位
MOV R7, #40 //赋值
MOV R6, #50 //赋值
CLR P3.4 ;输出低电平,开始响了// P3.4位清零
SETB TR0 //启动定时器
LLLL:
JNB TF0, $ ;等待 //等中断时间到
CLR TF0 //定时器的溢出标志位清零
DJNZ R7, LLLL
MOV R7, #40
DJNZ R6, LLLL //循环中断,一直让时间间隔满足0.5秒
MOV R6, #50
CPL P3.4 ;输出高电平,停止发音 // P3.4 取反
CLR TR0 //关闭定时器
SJMP $
END
2、 ORG 0000H //程序的入口地址
LJMP START //跳到START处
ORG 000BH //定义定时器T0的中断入口地址
LJMP T0_INT //跳到T0的中断服务程序处
START:
MOV TMOD, #02 //设置定时器/计数器的工作方式,这里为方式2,8位的常数自动重装
MOV TH0, #6 //定时器置初值,T0的高位
MOV TL0, #6 //定时器置初值,T0的低位
SETB TR0 //启动定时器T0
MOV IE, #10000010B 开启允许总中断和T0中断
MOV R7, #40 //赋值
MOV R6, #50 //赋值
SJMP $ //等待中断
T0_INT: // 中断服务程序
DJNZ R7, T0_END
MOV R7, #40
DJNZ R6, T0_END
MOV R6, #50 //以上的都是为了让时间足够
CPL P3.4 // P3.4取反
T0_END:
RETI //子程序返回
END