
#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
#define yh 0x80
#define er 0x80+0x40//液晶屏的与 C51 之间的引脚连接定义
sbit rs=P2^5;
sbit en=P2^7;
sbit rw=P2^6;//如果硬件上 rw 接地,就不用写这句和后面的 rw=0
//DS1302 时钟芯片与 C51 之间的引脚连接定义
sbit IO=P3^6;
sbit SCLK=P3^5;
sbit RST=P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;//校时按键与 C51 的引脚连接定义
sbit key1=P3^2;//设置键
sbit key2=P3^3;//加键
sbit key3=P3^4;//减键
uchar code tab1[]={"20//////////"};//年显示的固定字符
uchar code tab2[]={"LOVE ::::::"};//时间显示的固定字符
//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/液晶写入指令函数与写入数据函数,以后可调用/
write_1602com(uchar com) //液晶写入指令函数
{
rs=0; //数据/指令选择置为指令
rw=0; //读写选择 置为写
P0=com; //送入数据
delay(1);
en=1; //拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;
//en 由高变低,产生下降沿,液晶执行命令
}
write_1602dat(uchar dat) //液晶写入数据函数
{
rs=1; //数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat; //送入数据
delay(1);
en=1; //en 置高电平,为制造下降沿做准备
delay(1);
en=0; //en 由高变低,产生下降沿,液晶执行命令
}
lcd_init() //液晶初始化函数//
{
write_1602com(0x38); //设置液晶工作模式,意思:162 行显示,57 点阵,8 位数据
write_1602com(0x0c); //开显示不显示光标
write_1602com(0x06); //整屏不移动,光标自动右移
write_1602com(0x01); //清显示
write_1602com(yh+1); //日历显示固定符号从第一行第 1 个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分
}
write_1602com(er+1);//时间显示固定符号写入位置,从第 2 个位置后开始显示
for(a=0;a<12;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
}
}
/DS1302 有关子函数/
void write_byte(uchar dat)//写一个字节
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;//相当于汇编中的 RRC
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte() //读一个字节
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------//
void write_1302(uchar add,uchar dat) //向 1302 芯片写函数,指定写入地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //从 1302 读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD 码转十进制函数,输入 BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal10+(bcd&=0x0F));
}
//--------------------------------------//
void ds1302_init()//1302 芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8e,0x80);//打开写保护
}
//时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向 LCD 写时分秒,有显示位置加、现示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er 是头文件规定的值 0x80+0x40
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}
//年月日显示子函数
void write_nyr(uchar add,uchar dat)//向 LCD 写年月日,有显示位置加数、显示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}
void write_week(uchar week)//写星期函数
{
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{
case 1:write_1602dat('M');//星期数为一时,显示
write_1602dat('o');
write_1602dat('n');break;
case 2:write_1602dat('T');//星期数据为二时显示
write_1602dat('u');
write_1602dat('e');break;
case 3:write_1602dat('W');//星期数据为三时显示
write_1602dat('e');
write_1602dat('d');break;
case 4:write_1602dat('T');//星期数据为四是显示
write_1602dat('h');
write_1602dat('u');break;
case 5:write_1602dat('F');//星期数据为五时显示
write_1602dat('r');
write_1602dat('i');break;
case 6:write_1602dat('S');//星期数据为六时显示
write_1602dat('t');
write_1602dat('a');break;
case 7:write_1602dat('S');//星期数据为日时显示
write_1602dat('u');
write_1602dat('n');break;
}
}
//键盘扫描有关函数
void keyscan()
{
if(key1==0)//key1 为功能键(设置键)
{
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
{
delay(20);
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8 个功能循环
switch(key1n)
{
case 1:TR0=0;//关闭定时器
write_1602com(er+0x0E);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/1016+(miao)%10;//秒数据写入 DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
case 2:write_1602com(er+11);//按 2 次 fen 位置显示光标
break;
case 3:write_1602com(er+8);//按动 3 次,shi
break;
case 4:write_1602com(yh+0x0e);//按动 4 次,week
break;
case 5:write_1602com(yh+0);//按动 5 次,ri
break;
case 6:write_1602com(yh+0x07);//按动 6 次,yue
break;
case 7:write_1602com(yh+0x04);//按动 7 次,nian
break;
case 8:write_1602com(0x0c);//按动到第 8 次,设置光标不闪烁
TR0=1;//打开定时器
TR0=1;
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao 数据写入 DS1302
write_1302(0x8e,0x80);break;
}
}
}
//------------------------------加键 key2----------------------------//
if(key1n!=0)//当 key1 按下以下。再按以下键才有效(按键次数不等于零)
{
if(key2==0)//上调键
{
delay(10);
if(key2==0)
{
delay(20);
while(!key2);
switch(key1n)
{
case 1:miao++;//设置键按动 1 次,调秒
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x0A,fen);
temp=(fen)/1016+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(7,shi);
temp=(shi)/1016+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C) ;
write_week(week);
temp=(week)/1016+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/1016+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/1016+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/1016+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
//------------------减键 key3,各句功能参照'加键'注释---------------
if(key3==0)
{
delay(10);
//调延时,消抖动
if(key3==0)
{
delay(20);
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x0D,miao);
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(10,fen);
temp=(fen)/1016+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/1016+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/1016+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/1016+(ri)%10;//十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向 DS1302 内写日期寄存器 86H 写入调整后的日期数据 BCD 码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/1016+(yue)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x88,temp); //向 DS1302 内写月份寄存器 88H 写入调整后的月份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+7); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/1016+(nian)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x8c,temp); //向 DS1302 内写年份寄存器 8cH 写入调整后的年份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+4); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
}
}
}
}
}
void init()
//定时器、计数器设置函数
{
TMOD=0x11;
//指定定时/计数器的工作方式为 3
TH0=0;
//定时器 T0 的高四位=0
TL0=0;
//定时器 T0 的低四位=0
EA=1;
//系统允许有开放的中断
ET0=1;
//允许 T0 中断
TR0=1;
//开启中断,启动定时器
}
//主函数
void main()
{
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用 DS1302 时钟的初始化子函数
init(); //调用定时计数器的设置子函数
delay(80);
while(1)
//无限循环下面的语句:
{
keyscan();
//调用键盘扫描子函数
}
}
void timer0() interrupt 1 //取得并显示日历和时间
{ //读取秒时分周日月年七个数据(DS1302 的读寄存器与写寄存器不一样)
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//显示秒、时、分数据:
write_sfm(13,miao); //秒,从第二行第 8 个字后开始显示(调用时分秒显示子函数)
write_sfm(10,fen); //分,从第二行第 5 个字符后开始显示
write_sfm(7,shi); //小时,从第二行第 2 个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri); //日期,从第二行第 9 个字符后开始显示
write_nyr(6,yue); //月份,从第二行第 6 个字符后开始显示
write_nyr(3,nian); //年,从第二行第 3 个字符后开始显示
write_week(week);
}
电路图科技名词定义
中文名称:电路图 英文名称:circuit diagram 定义1:用图形符号并按工作顺序排列,详细表示电路、设备或成套装置的全部基本组成和连接关系,而不考虑其实际位置的一种简图。目的是便于详细理解电路的作用原理,分析和计算电路特性。 应用学科:电力(一级学科);通论(二级学科) 定义2:用图形符号,表示电路设备装置的组成和连结关系的简图。 应用学科:机械工程(一级学科);机械制图、公差与配合(二级学科);机械制图(三级学科) 以上内容由全国科学技术名词审定委员会审定公布
求助编辑百科名片
电路图示例电路图(circuit diagram)的定义:用导线将电源、开关(电键)、用电器、电流表、电压表等连接起来组成电路,再按照统一的符号将它们表示出来,这样绘制出的就叫做电路图。
目录
意义
分类
组成
绘制软件
电路中电压、电阻与电流之间的关系
画法
举例
单元电路图识图方法
二极管
反向性
击穿二极管的特性曲线
二极管的反向击穿
二极管的应用
编辑本段二极管的工作原理
编辑本段二极管的类型
编辑本段根据构造分类点接触型二极管
键型二极管
合金型二极管
扩散型二极管
台面型二极管
平面型二极管
合金扩散型二极管
外延型二极管
肖特基二极管
编辑本段根据用途分类意义
分类
组成
绘制软件
电路中电压、电阻与电流之间的关系
画法
举例
单元电路图识图方法
二极管反向性击穿
二极管的特性曲线 二极管的反向击穿二极管的应用编辑本段二极管的工作原理编辑本段二极管的类型编辑本段根据构造分类
点接触型二极管 键型二极管 合金型二极管 扩散型二极管 台面型二极管 平面型二极管 合金扩散型二极管 外延型二极管 肖特基二极管编辑本段根据用途分类展开 编辑本段意义
电路图是人们为了研究和工程的需要,用国家标准化的符号绘制的一种表示各元器件组成的图形。通过电路图可以详细的知道他的工作原理,是分析性能、安装电子产品的主要设计文件。在设计电路时,也可以从容地在纸上或电脑上进行,确认完善后再进行实际安装,通过调试、改进,直至成功;而现在,我们更可以应用先进的计算机软件来进行电路的辅助设计,甚至进行虚拟的电路实验,大大提高了工作效率。
编辑本段分类
常遇到的电子电路图有原理图、方框图、装配图和印板图等 (一)原理图 图,又被叫做“电原理图”。这种图,由于它直接体现了电子电路的结构和工作原理,所以一般用在设计、分析电路中。分析电路时,通过识别图纸上所画的各种电路元件符号,以及它们之间的连接方式,就可以了解电路实际工作时的原理,原理图就是用来体现电子电路的工作原理的一种工具。 (二)方框图(框图) 方框图是一种用方框和连线来表示电路工作原理和构成概况的电路图。从根本上说,这也是一种原理图,不过在这种图纸中,除了方框和连线,几乎就没有别的符号了。它和上面的原理图主要的区别就在于原理图上详细地绘制了电路的全部的元器件和它们的连接方式,而方框图只是简单地将电路按照功能划分为几个部分,将每一个部分描绘成一个方框,在方框中加上简单的文字说明,在方框间用连线(有时用带箭头的连线)说明各个方框之间的关系。所以方框图只能用来体现电路的大致工作原理,而原理图除了详细地表明电路的工作原理之外,还可以用来作为采集元件、制作电路的依据。 (三)装配图 它是为了进行电路装配而采用的一种图纸,图上的符号往往是电路元件的实物的外形图。我们只要照着图上画的样子,依样画葫芦地把一些电路元器件连接起来就能够完成电路的装配。这种电路图一般是供初学者使用的。 装配图根据装配模板的不同而各不一样,大多数作为电子产品的场合,用的都是下面要介绍的印刷线路板,所以印板图是装配图的主要形式。 在初学电子知识时,为了能早一点接触电子技术,我们选用了螺孔板作为基本的安装模板,因此安装图也就变成另一种模式。 (四)印板图 印板图的全名是“印刷电路板图”或“印刷线路板图”,它和装配图其实属于同一类的电路图,都是供装配实际电路使用的。 印刷电路板是在一块绝缘板上先覆上一层金属箔,再将电路不需要的金属箔腐蚀掉,剩下的部分金属箔作为电路元器件之间的连接线,然后将电路中的元器件安装在这块绝缘板上,利用板上剩余的金属箔作为元器件之间导电的连线,完成电路的连接。由于这种电路板的一面或两面覆的金属是铜皮,所以印刷电路板又叫“覆铜板”。印板图的元件分布往往和原理图中大不一样。这主要是因为,在印刷电路板的设计中,主要考虑所有元件的分布和连接是否合理,要考虑元件体积、散热、抗干扰、抗耦合等等诸多因素,综合这些因素设计出来的印刷电路板,从外观看很难和原理图完全一致;而实际上却能更好地实现电路的功能。 随着科技发展,现在印刷线路板的制作技术已经有了很大的发展;除了单面板、双面板外,还有多面板,已经大量运用到日常生活、工业生产、国防建设、航天事业等许多领域。 在上面介绍的四种形式的电路图中,电原理图是最常用也是最重要的,能够看懂原理图,也就基本掌握了电路的原理,绘制方框图,设计装配图、印板图这都比较容易了。掌握了原理图,进行电器的维修、设计,也是十分方便的。因此,关键是掌握原理图。
编辑本段组成
电路图主要由元件符号、连线、结点、注释四大部分组成。 元件符号表示实际电路中的元件,它的形状与实际的元件不一定相似,甚至完全不一样。但是它一般都表示出了元件的特点,而且引脚的数目都和实际元件保持一致。 连线表示的是实际电路中的导线,在原理图中虽然是一根线,但在常用的印刷电路板中往往不是线而是各种形状的铜箔块,就像收音机原理图中的许多连线在印刷电路板图中并不一定都是线形的,也可以是一定形状的铜膜。 结点表示几个元件引脚或几条导线之间相互的连接关系。所有和结点相连的元件引脚、导线,不论数目多少,都是导通的。 注释在电路图中是十分重要的,电路图中所有的文字都可以归入注释—类。细看以上各图就会发现,在电路图的各个地方都有注释存在,它们被用来说明元件的型号、名称等等。
我自己做的一个课程设计,程序运行已经成功了:
汇编程序如下:
ORG 0000H
AJMP main
ORG 000BH ;定时器0的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 30H
main:
mov dptr,#k1;
start:
MOV P0,#00H ;中断预处理程序
MOV P1,#00H
MOV P3,#00H ;关所有灯
MOV R0,#00H ;软件计数器预清0
MOV R7,#00H
MOV R6,#00H
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;即数15536
SETB EA ;开总中断允许
SETB ET0 ;开定时/计数器0允许
SETB TR0 ;定时/计数器0开始运行
LOOP: ;判断时钟进位程序
MOV A,R1
CJNE A,#60,LOOP1 ;R1等于60吗?
MOV R1,#0
INC R2 ;R1等于60那么R2加一,R1清0
MOV A,R2
CJNE A,#60,LOOP1 ;R2等于60吗?
MOV R2,#0
INC R3 ;R2等于60那么R3加一,R2清0
MOV A,R3
CJNE A,#24,LOOP1 ;R3等于24吗?
MOV R3,#0
;R3等于24那么R3清0
LOOP1:
mov a,r2 ;如果分钟显示为0,报警
cjne a,#01H,LOOP2
mov a,r1
cjne a,#00H,LOOP3
clr p20
LOOP3:
mov a,r1 ;如果秒钟显示为1,取消报警
cjne a,#05H,LOOP2
setb p20
LOOP2: ;显示数据处理
MOV A, R1 ;取来8位二进制数
MOV B, #100
DIV AB ;除以100
MOV A, B ;取回余数
MOV B, #10
DIV AB ;再除以10
MOV R4, A ;商是十位数,存放到R4
MOV R5, B ;余数是个位,存放到R5
MOV 42H,R4
mOV 41H,R5
;R1的BCD码放入41-42H单元
MOV A, R2 ;取来8位二进制数
MOV B, #100
DIV AB ;除以100
MOV A, B ;取回余数
MOV B, #10
DIV AB ;再除以10
MOV R4, A ;商是十位数,存放到R4
MOV R5, B ;余数是个位,存放到R5
MOV 44H,R4
MOV 43H,R5
;R2的BCD码放入43-44H单元
MOV A, R3 ;取来8位二进制数
MOV B, #100
DIV AB ;除以100
MOV A, B ;取回余数
MOV B, #10
DIV AB ;再除以10
MOV R4, A ;商是十位数,存放到R4
MOV R5, B ;余数是个位,存放到R5
MOV 46H,R4
mov 45H,R5
;R3的BCD码放入45-46H单元
L1:
mov a,41h
movc a,@a+dptr
mov 51h,a
mov a,42h
movc a,@a+dptr
mov 52h,a
mov a,43h
movc a,@a+dptr
mov 53h,a
mov a,44h
movc a,@a+dptr
mov 54h,a
mov a,45h
movc a,@a+dptr
mov 55h,a
mov a,46h
movc a,@a+dptr
mov 56h,a ;将显示代码送入51H--56H
display: ;显示程序
mov p0,#0ffH;一
mov p0,51H
mov P1,#0feH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;二
mov p0,52h
mov P1,#0fdH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;三
mov p0,53h
mov P1,#0fbH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;四
mov p0,54h
mov P1,#0f7H
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;五
mov p0,55h
mov P1,#0efH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;六
mov p0,56h
mov P1,#0dfH
acall delay1S
mov p1,#0ffH
;将51H-56H数据显示,
AJMP LOOP ;工作处理程序
TIME0: ;定时器0的中断处理程序
INC R7
MOV A,R7
CJNE A,#20,T_RET ;R7单元中的值到了20了吗
T_L1:
INC R1 ;到了20那么R1+1
MOV R7,#0 ;清软件计数器
T_RET:;二十分之一秒时的程序
inc r6
mov a,r6
cjne r6,#3,T_over ;调节时间的延迟时间
mov r6,#0
jb p21,T_over1
mov a,r2
add a,#1
cjne a,#60,T_tiao1
mov a,#0
T_tiao1:
mov r2,a
T_over1:
jb p22,T_over
mov a,r3
add a,#1
cjne a,#24,T_tiao2
mov a,#0
T_tiao2:
mov r3,a
T_over:
MOV TH0,#3CH
MOV TL0,#0B0H ;如果没到一秒重置定时常数
reti
delay1s: MOV 31H,#100
D1: MOV 32H,#30
D2: DJNZ 32H,D2
DJNZ 31H,D1
RET
delay2s: MOV 33H,#255
D3: MOV 34H,#255
D4: DJNZ 34H,D4
DJNZ 33H,D3
RET
K1:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
END
有XS128的
//延时控制
void delay(void)
{
int m,n;
for(m=14000;m;m--)
{
for(n=1000;n;n--)
{}
}
}
void LED(void)
{
PORTB=0XFE;
delay();
PORTB=0XFC;
delay();
PORTB=0XF8;
delay();
PORTB=0XF0;
delay();
PORTB=0XE0;
delay();
PORTB=0XC0;
delay();
PORTB=0X80;
delay();
PORTB=0X00;
delay();
PORTB=0X00;
delay();
PORTB=0X80;
delay();
PORTB=0Xc0;
delay();
PORTB=0Xe0;
delay();
PORTB=0Xf0;
delay();
PORTB=0Xf8;
delay();
PORTB=0Xfc;
delay();
PORTB=0Xfe;
delay();
}
小问题还是挺多的。
首先,像楼上说的,P0送显示数据前应该关一下显示。考虑到你是共阳显示,mov P1,#0才对。像这样
mov P1, #0 // 关显示。
mov P0, 显示数据
mov P1, 显示哪一位。
acall delay // 延时一小段时间,调试的时候可以适当延时长一点。
djnz 。。。// 显示下一位。
关显示的位置应该在MOV P0,@R1之前。当然在delay后面也可以,但考虑到将来要改成使用定时中断,最好还是像上面这样做。
另外,这个程序应该先把中断全部关了调,不然肯定显示乱码。
以上就是关于求教一个51单片机程序。。(LCD电子时钟)全部的内容,包括:求教一个51单片机程序。。(LCD电子时钟)、8位数码管的51单片机电子钟程序用电路图、如何用51单片机制作简易电子钟等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)