第一篇:中华万年历
第一,要做一个你自己真正想用、会用的东西。你自己的产品,自己都不用,成功的可能性就很小;第二,如果你真想学技术,就要做一个你周边朋友或同学都愿意用的东西;第三,如果你真想创业,做一个是人都会用的东西。这是我觉得每一位做产品的人都会经历的三个阶段。我自己也是这么走过来的,我大一时,因为经常翘课,做了一个自己想用的课程表,自己天天用,后来我把这个软件推荐给同学。再后来我们把中华万年历,做成了一个上亿人能用的东西。
最后,我还是感谢老朋友常亮,跟他认识已经5年多了。同时我的创业伙伴们大学时在一起的,今天还在一起,可能接下来10年还会在一起。我觉得这个圈子很小,大家要珍惜这样的机会,去建立接下来5年甚至10年自己的创业伙伴,在未来的路上,大家且行且珍惜,谢谢!
第二篇:EDA万年历课程设计报告
《EDA技术及其应用》
实 训 报 告
班 级 姓 名 学 号 指导教师
目 录
一 设计要求......................................2
1.0 设计目的及意义.................................2 1.1 设计要求.......................................2
二 设计流程:....................................2
2.0 原理框图.......................................2 2.1 VHDL设计思路...................................3
三 VHDL程序......................................3
3.0 天计数模块......................................6 3.1 月计数模块.....................................7 3.2 年计数模块......................................9 3.3 调时控制模块..................................11 3.4 译码模块......................................12 3.5 扫描模块........................................12
四 心得体会.....................................14 4.0................................................14 五 附录...........................................15 5.0 顶层文件......................................15
一、设计目的及意义
1.0 设计目的及意义
在掌握EDA理论知识的基础上进一步了解EDA开发软件QuartusII的使
entity tian is port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end tian;
architecture one of tian is
signal q1:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);signal ab:std_logic_vector(1 downto 0);begin
process(clk,pan)
begin
if clk'event and clk='1'
then q1<=q1+1;
if q1=9 then q1<=“0000”;q2<=q2+1;
end if;case pan is when “00”=> if q2=3 and q1=1 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “01”=> if q2=3 and q1=0 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “10”=> if q2=2 and q1=8 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “11”=> if q2=2 and q1=9 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when others=>null;end case;end if;end process;T1(3 downto 0)<=q1;T1(6 downto 4)<=q2;end one;3.1 月计数模块
when others=>null;end case;end if;Y1(3 downto 0)<=q1;Y1(6 downto 4)<=q2;end process;end behav;
3.2 年计数模块
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity nian is port(clk :in std_logic;n1:out std_logic_vector(6 downto 0);
run:out std_logic);end entity;
architecture one of nian is signal q1,q3:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);
begin process(clk)
begin if clk'event and clk='1' then
q1<=q1+1;q3<=q3+1;
if q1=9 then q2<=q2+1;q1<=“0000”;end if;if q3=3 then q3<=“0000”;run<='1';else run<='0';end if;
if q1=9 and q2<=7 then q1<=“0001”;q2<=“000”;end if;
end if;end process;
sel:out std_logic_vector(2 downto 0));end seltime;architecture fun of seltime is signal count:std_logic_vector(2 downto 0);begin sel<=count;process(clk1)begin if(clk1'event and clk1='1')then if(count>=“101”)then count<=“000”;else count<=count+1;end if;end if;case count is when “000”=>daout<=tian(3 downto 0);dp<='0';when“001”=>daout(3)<='0';daout(2 downto 0)<=tian(6 downto 4);dp<='0';when “010”=>daout<=yue(3 downto 0);dp<='1';when“011”=>daout(3)<='0';daout(2 downto 0)<=yue(6 downto 4);dp<='0';when “100”=>daout<=nian(3 downto 0);dp<='1';when others=>daout(3 downto 2)<=“00”;daout(2 downto 0)<=nian(6 downto 4);dp<='0';end case;end process;end fun;
3.5 译码模块
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity led is port(ledi:in std_logic_vector(3 downto 0);ledo:out std_logic_vector(6 downto 0));
次万年历实训我们是四个人作为一个团队,在实训过程中,有时候一个人在编写程序时出现一点很小的错误(例如:程序中少了一个分号或者少了一个字母)就会导致整个程序编译不能通过,而四个人在一起,出现错误时一起去寻找,总会有一个人及时发现错误的,发现后及时纠正错误,然后继续开展下面的工作。这样三个人互相协作,共同努力,各自发挥自身的优势,这样工作便能顺利的进行下去,如果是一个人单独去完成,在出现错误的时候自己要想发现错误便需要很长的时间才能发现,这样很浪费时间,浪费时间的结果就是直接导致工作效率低。而在如今的社会工作中,许多公司企业都要求应聘者要有很好的团队合作精神,工作时要有高效的工作效率。因此,在这次实训中我也切身体会到了团队合作的重要性。
实训是对每个学生综合能力的检验是让我们能够更好的巩固专业知识,积累工作经验,掌握工作技能。通过这次实训,让我深深的体会到要想做好每一件事情,除了自己平时要有一定的专业知识外,还需要一定的实践动手能力,操作能力,说实话,这次实训让我学到了很多东西,也明白了很多事情。在此还要感谢王老师耐心、认真的指导。谢谢薛老师!
五、附录
5.0 顶层文件
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nianli is port(clk,clkdsp:in std_logic;k1,k2:in std_logic;dpout,d10,d20:out std_logic;ledout :out std_logic_vector(6 downto 0);sel1:out std_logic_vector(2 downto 0));
end entity;architecture one of nianli is component tian port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end component;component yue port(clk,run:in std_logic;cout:out std_logic;pan:out std_logic_vector(1 downto 0);
第三篇:数码管万年历实习报告
河南机电高等专科学校
综合实训报告
系 部: 专 业: 班 级: 学生姓名: 学 号:
2013年 6月 28日
实训任务书
1.时间:2013年6月15日~2013年6月28日 2.实训单位:河南机电高等专科学校 3.实训目的:深入学习电子产品设计制作的全过程 4.实训任务:
①加深学习电路图绘制软件的相关常识及其特点; ②以51单片机为核心设计出一个LED万年历;
③万年历具有年份、月、日、时、分、秒、周、温度、整点报时等功能; ④自己独立完成设计电路图,生成PCB,转印、腐蚀电路板,焊接等硬件制作工作;
⑤会使用keil软件编写程序,并完成烧写过程; ⑥学会调试程序,敢于发现问题,解决问题; ⑦参考相关的的书籍、资料,认真完成实训报告。
综合实训报告
前言:
万年历是我们经常见到和使用的计时工具,使用方便,功能多。但自己做一个让人满意的万年历,就不一定有那么轻而易举了,本次实训的任务就是自己亲手做一个万年历。利用本学期学过的单片机知识,设计出具有显示年、月、日、时、分、秒、周、温度功能,同时有整点报时的功能的万年历。
一、实训器件
1.温度传感器DS18B20 采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。因此,本设计DS18B20温度传感器作为温度采集模块。
2.时钟芯片DS1302 采用DS1302时钟芯片实现时钟,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。具有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。因此,本设计中采用DS1302提供时钟。
3.74LS154 74LS154 为 4 线-16 线译码器,其主要电特性的典型值如下:
当选通端(G1、G2)均为低电平时,可将地址端(ABCD)的二进制编码在一个对应的输出端,以低电平译出。若将G1和G2中的一个作为数据输入端,由ABCD对输出寻址,54/74154 还可作4线-16线数据分配器。
引出端符号: A、B、C、D 译码地址输入端(低电平有效)G1、G2 选通端(低电平有效)0-15 输出端(低电平有效)可用此种芯片作为数码管的选址芯片。4.74HC573 74HC573是八进制3态非反转透明锁存器,是高性能硅门CMOS器件。当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。输出能直接接到 CMOS,NMOS和 TTL接口上操作电压范围:2.0V~6.0V×低输入电流: 1.0uA。本实训采用此芯片作为数码管的驱动芯片。
5.数码管
本实训使用共阴极数码管作为显示器件,采用 LED 数码管动态扫描,LED 数 主电路PCB: 码管价格适中,对于显示数字也最合适。
综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用AT89S51作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;74LS154作为选址芯片;74HC573作为数码管的驱动芯片;共阴极数码管显示数字;S8550驱动扬声器。
二、实训原理
为了使万年历在包装美化时简单化及布线的方便,我将万年历分为两部分,一部分是主体部分含有年份、月、日、时、分、秒,另一部分是小模块包含周、温度。
电路图如下:
主电路图:
***9485*********2930******203919343338***61635***33212*********6545516251724***1 周,温度电路图: 周,温度PCB:
***061
三、程序编写
使用Keil软件编写程序。程序包括主函数、时间显示函数、温度显示函数、时间调整函数、DS18B20模块、DS1302模块和周计算函数等。
程序的编写使我熟练的掌握了Keil软件的应用。具体程序见附录。
四、程序的烧写与调试
程序烧写需要用专用的烧写软件将Keil软件声生成的.hex文件写进单片机里。经过多次的程序的改写与调试,最终制作出比较满意的成品。
五、成品展示:
心得体会: 经过此次实训我学到了很多,刚开始以为做万年历很难,着手开始做这个产品没有一点头绪,经过上网查资料,产生了最初的制作框架,然后就开始找芯片,查芯片资料,设计电路图,又请同学帮忙指点,修改原理图。接着买元器件,做封装,生成PCB,制作电路板,焊接元器件,最后完成了整个硬件部分的制作。完成了硬件制作后,我又编了测试软件测试硬件是否有问题,发现数码管不亮,经过问题排查及资料查询,发现单片机P0口缺少了上拉电阻,接上后,解决了问题。
编程也是比较困难的,由于掌握的知识不够多,借鉴了别人的程序,并加入自己的想法,经过调试,程序编写成功。最终完成了产品的制作。在实习的过程中我得到了别人的帮助,同时也主动帮助别人,得到了很多经验,为以后学习提供了方便。实习就是学习的过程,本次实习是最成功的一次,也是学到最多的一次。参考文献:
《单片机C51程序设计教程与实验》 北京航空航天大学出版社 《单片机原理及应用(C51语言)》 清华大学出版社 《数字电子技术》 黄河水利出版社 《Protel DXP 2004电路设计与仿真教程》 北京航空航天大学出版社 附录: 程序
万年历.c #include
uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;
uchar count=0;sbit SET=P3^4;
sbit ADD=P3^5;//增加
sbit RED=P3^6;//减小
sbit CANL=P3^7;sbit le=P2^6;sbit oe=P2^7;sbit en=P1^4;
sbit beep=P2^4;
uchar GetWeekFromDay(uchar years,uchar months,uchar days);
void WriteSet1302(uchar cmd,uchar date);
uchar ReadSet1302(uchar cmd);
void ReadyreadDS18B20(void);
uchar ReadDS18B20(void);void IntDS1302(void);
void delay1ms(uint x){ uchar i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);} void delaynus(uchar n)//延时若干微秒
{
while(n--);} void display_Year(year)//显示年
{
uchar i,j;i=year/10;j=year%10;P0=digit[2];P1=8;delay1ms(2);P0=digit[0];P1=9;delay1ms(2);P0=digit[i];P1=10;delay1ms(2);P0=digit[j];P1=11;delay1ms(1);} void display_Month(month)//显示月
{ uchar i,j;i=month/10;j=month%10;P0=digit[i];P1=6;delay1ms(2);P0=digit[j];P1=7;delay1ms(1);} void display_Day(day)//显示日
{ uchar i,j;i=day/10;j=day%10;P0=digit[i];P1=4;delay1ms(2);
P0=digit[j];P1=5;delay1ms(1);} void display_Hour(hour)//显示时
{ uchar i,j;
i=hour/10;j=hour%10;P0=digit[i];P1=2;delay1ms(2);P0=digit[j]+n*0x80;P1=3;delay1ms(1);}
void display_Minute(minute)//显示分
{ uchar i,j;i=minute/10;j=minute%10;P0=digit[i];P1=0;delay1ms(2);P0=digit[j];P1=1;delay1ms(1);} void display_Week(void)//显示周{ WEEK=GetWeekFromDay(years,months,days);
P1=12;switch(WEEK){
case 1:P0=digit[1];
delay1ms(2);
break;
case 2:P0=digit[2];
delay1ms(2);
break;
case 3:P0=digit[3];
delay1ms(2);
break;
case 4:P0=digit[4];
delay1ms(2);
break;
case 5:P0=digit[5];
delay1ms(2);
break;
case 6:P0=digit[6];
delay1ms(2);
break;
case 7:P0=digit[8];
delay1ms(2);
break;
} }
void display_Time(void)//显示实时时间
{ uchar value;value=ReadSet1302(0x83);minutes=(((value&0x70)>>4)*10+(value&0x0f));display_Minute(minutes);value=ReadSet1302(0x85);hours=(((value&0x70)>>4)*10+(value&0x0f));display_Hour(hours);value=ReadSet1302(0x87);days=(((value&0x70)>>4)*10+(value&0x0f));display_Day(days);value=ReadSet1302(0x89);months=(((value&0x70)>>4)*10+(value&0x0f));display_Month(months);value=ReadSet1302(0x8D);years=(((value&0xf0)>>4)*10+(value&0x0f));display_Year(years);display_Week();} /*****************时间调整部分*********************/
void hourset(void)//调时
{ uchar timevalue,hour;
delay1ms(500);//防止多次触发
WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302
timevalue=ReadSet1302(0x85);//读取此时的数值
hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
hour++;
delay1ms(100);
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(20);
if(RED==0)
{
hour--;
delay1ms(100);
if(hour==0)hour=23;
while(RED==0);
}
}
if(hour>=24)hour=0;
timevalue=(((hour)/10)<<4|(hour%10));
WriteSet1302(0x84,timevalue);
delay1ms(2);
display_Hour(hour);
delay1ms(10);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void minuteset(void)
//调分
{ uchar timevalue,minute;delay1ms(500);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
minute++;
if(minute>=60)timevalue=0;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(10);
if(RED==0)
{
minute--;
if(minute==0)minute=59;
delay1ms(300);
while(RED==0);
}
}
if(minute>=60)minute=0;
timevalue=((minute/10)<<4|(minute%10));
WriteSet1302(0x82,timevalue);
delay1ms(2);
display_Minute(minute);
delay1ms(10);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);}
void yearset(void)
//调年
{ uchar datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
year++;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(20);
if(RED==0)
{
year--;
delay1ms(100);
while(RED==0);
}
}
datevalue=((year/10)<<4|(year%10));
WriteSet1302(0x8c,datevalue);
delay1ms(5);
display_Year(year);
delay1ms(5);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void monthset(void)
//调月
{ uchar datevalue,month;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x89);month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(20);
if(ADD==0)
{
month++;
if(month>12)month=1;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(20);
if(RED==0)
{
month--;
delay1ms(100);
if(month==0)month=12;
while(RED==0);
}
}
datevalue=((month/10)<<4|(month%10));
WriteSet1302(0x88,datevalue);
delay1ms(5);
display_Month(month);
delay1ms(5);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void dayset(void)
//调日
{ uchar datevalue,day;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x87);day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){
if(ADD==0)
{
delay1ms(10);
if(ADD==0)
{
day++;
if(day>31)day=1;
while(ADD==0);
}
}
if(RED==0)
{
delay1ms(10);
if(RED==0)
{
if(day==0)day=31;
day--;
delay1ms(300);
while(RED==0);
}
}
datevalue=((day/10)<<4|(day%10));
WriteSet1302(0x86,datevalue);
delay1ms(5);
display_Day(day);
delay1ms(5);
if(CANL==0)
{
mode=0;
break;
}
if(SET==0)break;} WriteSet1302(0x8e,0x80);} void TimeSet(void)
//时间调整函数
{ if(SET==0){
delay1ms(20);
if(SET==0)
{ while(!SET);
mode++;
delay1ms(20);
switch(mode)
{
case 1:{yearset();delay1ms(20);}
break;
case 2:{monthset();delay1ms(20);} break;
case 3:{dayset();delay1ms(20);}
break;
case 4:{hourset();delay1ms(20);} break;
case 5:{minuteset();delay1ms(20);} break;
}
if(mode==5)mode=0;
} } } /***************显示温度模块********************/ uchar flag;/*********************显示温度整数部分*************************/ void Display_Integer(unsigned char x){
uchar s,g;s=x%100/10;g=x%10;P0=digit[s];P1=13;delay1ms(3);P0=digit[g]+0x80;P1=14;delay1ms(3);P0=digit[10];P1=15;delay1ms(1);}
void display_Temperature(void){
ReadyreadDS18B20();
TL=ReadDS18B20();
TH=ReadDS18B20();
if((TH&0XF8)!=0X00)
{
flag=1;
TL=~TL;
TH=~TH;
TL+=1;
if(TL>255)TH+=1;
TN=TH*16+TL/16;
}
TN=TH*16+TL/16;
Display_Integer(TN);} /**************** 设置模块 ******************/
void Set(void){ if(SET==0){
delay1ms(5);
if(SET==0)
{
delay1ms(50);
while(1)
{
TimeSet();
if(CANL==0)
{
break;
}
}
} } } void InitTimer0(void){
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0x0B0;
EA = 1;
ET0 = 1;
TR0 = 1;} /***************主函数**********************/
void main(){ int i;P0=0;InitTimer0();IntDS1302();
//初始化DS1302 delay1ms(5);le=1;oe=0;en=0;delay1ms(200);beep=1;while(1){
for(i=1000;i>0;i--)
{
Set();
display_Time();
Display_Integer(TN);
if(hours==7||hours==8||hours==9||hours==10||hours==11||hours==12
||hours==14||hours==15||hours==16||hours==17||hours==18||hours==19
||hours==20||hours==21||hours==22)
{
if(minutes==0x00)
{
uchar value,w,k;
value=ReadSet1302(0x81);
seconds=(((value&0x70)>>4)*10+(value&0x0f));
if(seconds>0&&seconds<2)
{
for(k=5;k>=0;k--)
{
for(w=100;w>0;w--)
{
beep=0;
delay1ms(3);
beep=1;
delay1ms(3);
}
delay1ms(1000);
}
}
else beep=1;
}
}
}
display_Temperature();
}
} void t0()interrupt 1 { TH0 = 0x3C;
TL0 = 0x0B0;count++;
if(count==10){n=0;
} if(count==20){ count=0;
n=1;
} } /*******DS1302模块*************/ sbit SCLK=P2^0;//DS1302时钟输入
sbit DATE=P2^1;//DS1302数据输入
sbit REST=P2^2;//DS1302复位端口
void Write1302(uchar date)//向1302写数据 {
uchar i;SCLK=0;delaynus(2);for(i=0;i<8;i++){
DATE=date&0x01;
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);
date>>=1;} } void WriteSet1302(uchar cmd,uchar date)//根据相应的命令输入相应的数据
{
REST=0;
SCLK=0;
REST=1;
Write1302(cmd);
delaynus(5);
Write1302(date);
SCLK=1;
REST=0;} uchar Read1302(void)//读取1302数据
{
uchar i,date;delaynus(2);for(i=0;i<8;i++){
date>>=1;
if(DATE==1)
date|=0x80;
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);} return date;
} uchar ReadSet1302(uchar cmd)//根据命令读取1302相应的值 { uchar date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;REST=0;return date;} void IntDS1302(void)//DS1302初始化 {
uchar flag;
flag= ReadSet1302(0x81);if(flag&0x80)
//判断时钟芯片是否关闭
{
WriteSet1302(0x8E,0x00);
//根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10)));
//根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((0/10)<<4|(0%10)));
//根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((0/10)<<4|(0%10)));//根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((0/10)<<4|(0%10)));//根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((0/10)<<4|(0%10)));//根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((10/10)<<4|(10%10)));//根据写年寄存器命令字,写入年的初始值
WriteSet1302(0x90,0xa5);
//打开充电功能 选择2K电阻充电方式
WriteSet1302(0x8E,0x80);
//根据写状态寄存器命令字,写入保护指令
} } /**********************操作DS18B20模块***************************/ sbit DQ=P2^3;
uchar time;void delayms(uchar x){ uchar i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);} /**********************DS18B20初始化****************************/ bit IntDS18B20(void){ bit temp;DQ=1;for(time=0;time<2;time++);DQ=0;for(time=0;time<200;time++);DQ=1;for(time=0;time<10;time++);temp=DQ;for(time=0;time<200;time++);return temp;} /**************************读DS18B20**********************/ uchar ReadDS18B20(void){ uchar dat,i;for(i=0;i<8;i++){
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
for(time=0;time<2;time++);
dat>>=1;
if(DQ==1)
dat=dat|0x80;
else
dat=dat|0x00;
for(time=0;time<10;time++);} return dat;} /*********************向DS18B20写数据**************************/ void WriteDS18B20(uchar date){
uchar i;for(i=0;i<8;i++){
DQ=1;
_nop_();
DQ=0;
DQ=date&0x01;
for(time=0;time<10;time++);
DQ=1;
for(time=0;time<1;time++);
date>>=1;
} for(time=0;time<4;time++);} /*******************为读取温度做好准备************************/ void ReadyreadDS18B20(void){ IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0X44);IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0XBE);} // 计算2000~2099年任一天星期几
// year
: 00-99 // month: 01-12 // day
: 01-31
uchar GetWeekFromDay(uchar years,uchar months,uchar days){
if(months == 1 || months == 2)
{
months+=12;
if(years> 0)
years--;
else
years;
}
return(1+((days + 2*months + 3*(months+1)/5 + years + years/4)%7));//(星期一用1表示,而星期天用7表示)}
// 返回星期几
第四篇:单片机课程设计-电子万年历
单片机及接口技术综合实验
——————电子万年日历系统一、题目:电子实时时钟/万年日历系统
二、功能要求:
1. 基本要求:
⑴ 显示准确的北京时间(时、分、秒),可用24小时制式; ⑵ 随时可以调校时间。
2. 发挥要求:
⑴ 增加公历日期显示功能(年、月、日),年号只显示最后两位; ⑵ 随时可以调校年、月、日;
⑶ 允许通过转换功能键转换显示时间或日期。
三、方案考虑:
1、硬件方案:
⑴ 显示器采用6位LED数码管(共阳),可分别显示时间或日期;(通过KB键可切换)⑵ 显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码!⑶采用“一键多用方案”,以减少按键数目。本方案只采用了两个按键 ⑷ 整体上要考虑:结构简单、布局美观、操作方便、成本低廉。
2、设计电路图如下:
3、元件清单:
⑴ 89C51
1个
⑵ IC座(40脚)
3个(其中1个用于接插89C51、2个用于接插LED段数码管)。⑶ 74LS244
1个(用于驱动6个共阳的LED段数码管)。⑷ IC座(20脚)
1个(用于接插74LS244)。(5)显示器:LED_8段数码管(共阳型)6个三极管:
(6)PNP(8550)
6个(用于驱动6个共阳型LED段数码管)。
(7)微型开关:
3个(其中1个用于复位电路、其它用于键盘)。(8)晶体振荡器(12MHz):1个(用于振荡电路)。(9)电阻器:
⑴ 3KΩ
1个(用于系统复位电路)。
⑵ 1KΩ
6个(用作PNP三极管基极电阻)。⑶ 100Ω
7个(驱动器用作74LS244输出限流电阻)。(10)电容器:
⑴ 10μF
1个(用于系统复位电路)。⑵ 30 pF
2个(用于系统振荡电路)。(11)其它:
⑴ 万能电路板(10×15):
1块 ⑵ 焊锡条:
2米 ⑶ 带插头、座的电源端子:
1条 ⑷ 各种颜色外皮的导线:
各1米(12)工具:
1.电烙铁:
1把 2.剪钳:
1把 3.镊子:
1把 4.万用表:
1个(13)设备:
编程器(MEP300或TOP851)
6个
4、软件方案:
只使用第一组工作寄存器,功能分布如下:
⑴ “时钟”基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到“秒”,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。一般来说,基准时间越短,越有利于提高时钟运行的精确度。本实验定时5mS。乘以一个整数200得到“1秒”.⑵ 用一个计数器(R4)对定时中断的次数进行计数,从而可以实现“秒”定时,同理可以实现“分”定时和“时”定时,甚至于“日”、“月”、“年”定时。
⑶ 显示器采用动态驱动时要注意到:LED的 “启辉时间”和 “余辉时间”。驱动信号的维持时间必须大于启辉时间;而驱动信号的间歇时间必须小于余辉时间。“启辉时间”和 “余辉时间”与驱动电流的大小有关,驱动电流越大,启辉时间越短,而余辉时间越长。但是,驱动电流的大小受到驱动电路的驱动能力和LED极限功耗的限制。本实验采用了74ls244和晶体管8550驱动,并进行适当的延时3ms解决上述问题。
⑷ LED的余辉时间使动态驱动显示得到保证,但也要注意到它在更新显示内容时,可能造成显示字符的混乱模糊。为此,在把“更新显示内容”写入显示器之前,必须把所有的LED熄灭,即要把一个“熄灭驱动信号”先写入显示器。
⑸对于按键的处理,采用中断。产生中断后先判有无按键被按下,还要考虑到“去抖动影响”问题,可采用软件延迟法解决这个问题,延迟时间至少10mS。而单纯进行软件延时的话会令到显示管产生断续的情况,故调用显示程序作为延时时间。这样就合理地处理好这两者的矛盾了。
⑹ 把键盘的按键分两种情况来处理,操作简单。
①
调整时间时,先按下KA键,(KA键为选择调整位置的键,如选调整秒或分),而此时的KB键只是用来加一操作。在调整时间状态下,若在十秒内检测到没有任何按键按下,则返回正常显示时钟状态。
②
而不调整时间,即不按下KA键,KB的键只用来切换显示日期和时钟。⑺ 对于自动识别“月大、月小”和“平年、闰年”的问题,主要考虑: ① 月大、月小:
1~7月:逢单月为31天;逢双月为30天,其中2月另行处理。8~12月:逢单月为30天;逢双月为31天。②平年、闰年:
仅仅处理2月份的天数:平年的2月份天数为28天,闰年的2月份天数为29天。
5、程序流程图如下:(1)电子时钟计算程序图
(2)调整流程图
程序编写如下:
;///////////////////////////////////////////////////////// ORG 0000H
LJMP START ORG 0003H LJMP PROINT0
;int0用来切换时钟调整位置
ORG 0013H
;用来调整时间,只加不减 LJMP PROINT1
ORG 001BH
;5ms的延迟,计数200次则为1秒
LJMP PROTIME
ORG 0030H
;主程序
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;0 1 2 3 4 5 6 7 8 9
ORG 0050H
START: MOV TCON,#05H
;中断初始化
MOV IE ,#8DH MOV TMOD,#10H MOV TH1,#0eCH
;定时器初始化
MOV TL1,#78H
MOV 31H,#0AH
;10秒 MOV 32H,#1EH;30分 MOV 33H,#09H;9点 MOV 34H,#0AH MOV 35H,#06H MOV 36H,#05H MOV 37H,#14H
;10号;6月;2005年
;R7 存放切换标志 0 NORMAL , 1 HOUR ,2 MINUTE ,3 SECOND ,4 YEAR,5 MONTH,6 DAY
MOV R1,#00H
;确定在调时不按键的最长时间,10秒后返回normal状态
MOV R7,#00H
;切换标志
MOV 40H,#00H
;十六进制转换BCD的高位 MOV 41H,#00H
;十六进制转换BCD的低位
MOV R6,#00H
;调时的位闪烁的时间间隔
MOV R4,#00H
;用来计数5ms的中断次数,200次则一秒
mov r3,#00h
SETB TR1
;开始计时 AGAIN:
ACALL PROSHOW
;显示
AJMP AGAIN
PROSHOW:
CJNE R3,#00H,SHOWDATE
;如果r3等于1就显示日期,等于0就显示时钟 CJNE R7,#04H,DATE1
;显示程序
AJMP SHOWDATE
;showdate显示年月日 AJMP SHOWDATE DATE1: CJNE R7,#05H,DATE2 DATE2: CJNE R7,#06H,SHOWCLOCK AJMP SHOWDATE
showCLOCK: MOV R0,33H
;showclock显示时分秒,先显示时
ACALL PROHTOD
CJNE R7,#01H,CLK1 INC R6
CJNE R6,#03H,CLK2
;若处于调时状态,则该位闪烁
MOV R6 ,#00H CLK1: clr P2.4 mov a,41H MOV P0, a
;显示时的低位 ACALL DELAY3MS CLK2: SETB P2.4 CLR P2.5 mov a,40H
MOV P0,a
;显示时的高位 ACALL DELAY3MS SETB P2.5
MOV R0,32H
;显示分 ACALL PROHTOD CJNE R7,#02H,CLK3 INC R6
CJNE R6,#03H,CLK4
;若处于调时状态,则该位闪烁
MOV R6,#00H CLK3: CLR P2.2
mov a,41H MOV P0, a
;显示分的低位 ACALL DELAY3MS CLK4:
SETB P2.2 CLR P2.3 mov a,40h MOV P0,a
;显示分的高位 ACALL DELAY3MS SETB P2.3
MOV R0,31H
;显示秒
ACALL PROHTOD CJNE R7,#03H,CLK5 INC R6
CJNE R6,#03H,CLK6
MOV R6,#00H CLK5: CLR P2.0 mov a,41H MOV P0, a
ACALL DELAY3MS CLK6: SETB P2.0 CLR P2.1 mov a,40h MOV P0,a
ACALL DELAY3MS SETB P2.1
RET
SHOWDATE: MOV R0,36H
ACALL PROHTOD CJNE R7,#04H,DAY1 INC R6
CJNE R6,#03H,DAY2
MOV R6,#00H DAY1: CLR P2.4 MOV P0,41H
ACALL DELAY3MS DAY2: SETB P2.4 CLR P2.5 MOV P0,40H
ACALL DELAY3MS SETB P2.5
MOV R0,35H
ACALL PROHTOD CJNE R7,#05H,MONTH1
;若处于调时状态,则该位闪烁
;显示秒的低位
;显示秒的高位
;显示年
;若处于调时状态,则该位闪烁;显示年的低位
;显示年的高位
;显示月
INC R6
CJNE R6,#03H,MONTH2
;若处于调时状态,则该位闪烁
MOV R6,#00H MONTH1: CLR P2.2 MOV P0,41H
;显示月的低位
ACALL DELAY3MS MONTH2: SETB P2.2
CLR P2.3 MOV P0,40H
;显示月的高位
ACALL DELAY3MS SETB P2.3
MOV R0,34H
ACALL PROHTOD CJNE R7,#06H,YEAR1 INC R6
CJNE R6,#03H,YEAR2
MOV R6,#00H YEAR1: CLR P2.0
MOV P0,41H
ACALL DELAY3MS YEAR2: SETB P2.0 CLR P2.1 MOV P0,40H
ACALL DELAY3MS SETB P2.1
RET
PROHTOD:PUSH ACC
MOV A,R0 MOV B,#0AH DIV AB MOV DPTR,#0030H MOVC A,@A+DPTR MOV 40H,A MOV A,B MOVC A,@A+DPTR MOV 41H,A POP ACC RET
;显示日
;若处于调时状态,则该位闪烁
;十六进制数转换成bcd码,且可以直接输出p0口
DELAY3MS:
;DELAY3MS MOV 45H,#08H DELAY1: MOV 46H,#0FFH DELAY2: DJNZ 46H,DELAY2 DJNZ 45H,DELAY1 RET
PROINT0:
CLR EX0
;切换键中断程序 MOV R3,#00H ACALL PROSHOW MOV C,P3.2 JC IEXIT0 MOV R1,#00H INC R7 CJNE R7,#07H,IEXIT0
MOV R7,#00H INT01: MOV C,P3.2 JC INT02 ACALL PROSHOW AJMP INT01 INT02: ACALL PROSHOW IEXIT0: SETB EX0 RETI
PROINT1:CLR EX1
ACALL PROSHOW MOV C,P3.3 JC IEXIT1 LCALL ISYEAR
;判断平年闰年
LCALL ISMONTH
;判断月份,确定最大日数
MOV R1,#00H CJNE R7,#00H,NEXT1
;若不是调时状态,按此键就是切换显示日期、时钟
INC R3 CJNE R3,#02H,IEXIT1 MOV R3,#00H AJMP IEXIT1 NEXT1: mov r3,#00h
CJNE R7,#03H,NEXT2
;修改秒位 INC 31H MOV A,31H CJNE A,#3CH,INT11
;遇60变0 MOV 31H,#00H AJMP IEXIT1
NEXT2: CJNE R7,#02H,NEXT3
;修改分位
INC 32H MOV A,31H
CJNE A,#3CH,INT11
;遇60变0 MOV 31H,#00H AJMP IEXIT1 NEXT3: CJNE R7,#01H,NEXT4
;修改时位
INC 33H MOV A,33H CJNE A,#18H,INT11
;遇24变0 MOV 33H,#00H AJMP IEXIT1 NEXT4: CJNE R7,#06H,NEXT5
;修改日
INC 34H MOV A,34H CJNE A,49H,INT11
;到月底就返回月初 MOV 34H,#01H AJMP IEXIT1
NEXT5: CJNE R7,#05H,NEXT6
;修改月
INC 35H
MOV A,35H CJNE A,#0DH,INT11
;十二月过后就跳回1月 MOV 35H,#01H AJMP IEXIT1 NEXT6: CJNE R7,#04H,INT11
;修改年
INC 36H
MOV A,36H CJNE A,#64H,INT11
MOV 36H,#00H MOV C,P3.3 INT11: JC INT12 ACALL PROSHOW AJMP INT11 INT12: ACALL PROSHOW IEXIT1: setb EX1
RETI PROTIME:
MOV TMOD,#10H MOV TH1,#3CH
;定时器初始化 MOV TL1,#60H setb tr1 INC R4
CJNE R4,#0c8H,EXIT
MOV R4,#00H
;计满1秒则清零 CJNE R7,#00H,DIAOSHI
AJMP NORMAL DIAOSHI:INC R1
;调时不按键的最长时间为10秒,在此期间又键按下重新计时
CJNE R1,#0AH,EXIT MOV R7,#00H
;到10秒则返回正常显示状态 MOV R1,#00H AJMP EXIT
NORMAL:ACALL ISYEAR
;判断平闰年,返回标志48h,0为平年,1为闰年
ACALL ISMONTH
;判断哪个月,返回该月的最大日数,存放在49h
INC 31H
MOV A,31H
;秒加一 CJNE A,#3CH,EXIT MOV 31H,#00H
INC 32H
;分加一 MOV A,32H CJNE A,#3CH,EXIT MOV 32H,#00H INC 33H
;时加一 MOV A,33H CJNE A,#18H,EXIT MOV 33H,#00H INC 34H
MOV A,34H CJNE A,49H,EXIT MOV 34H,#01H INC 35H
MOV A,35H CJNE A,#0DH,EXIT MOV 35H,#01H INC 36H
MOV A,36H CJNE A,#64H,EXIT MOV 36H,#00H;年加一;月加一;日加一 EXIT:
RETI
ISYEAR: MOV A,36H;判断平闰年
MOV B,#04H
DIV AB MOV A,B CJNE A,#00H,EXITYEAR1 MOV 48H,#01H
;闰年 SJMP EXITYEAR MOV 48H,#00H
;平年 EXITYEAR1: EXITYEAR: RETI
ISMONTH:
MOV A,35H
;开始检查月份 CJNE A,#02H,NEXTMON1
;判断二月 MOV R2,48H
CJNE R2,#00H,RUNNIAN MOV 49H,#1DH
;平年为28天,赋29给49h AJMP EXITMONTH RUNNIAN:MOV 49H,#1EH
;闰年为29天,赋30天给49h
AJMP EXITMONTH
NEXTMON1: CJNE A,#04H,NEXTMON2
AJMP XIAOYUE
NEXTMON2:CJNE A,#06H,NEXTMON3 AJMP XIAOYUE
NEXTMON3:CJNE A,#09H,NEXTMON4 AJMP XIAOYUE NEXTMON4:CJNE A,#0BH,DAYUE XIAOYUE: MOV 49H,#1FH
;四,六,九,十一月是小月,30天,但应该赋31天给比较值49h,AJMP EXITMONTH DAYUE: MOV 49H,#20H
;其他月份为大月,31天,赋32天给49h EXITMONTH: RETI END
第五篇:万年历单片机课程设计报告
课程设计报告 任务和设计要求
首先要学会安装软件,要熟悉会使用。系统设计 系统框图 硬件设计 3.1 电路原理图
课程设计报告
课程设计报告
课程设计报告
3.2 主要单元电路
3.3 元件清单 软件设计 4.1 程序流程图
课程设计报告
4.2程序清单
TIME_WEEK DATA 52H TIME_YEAR DATA 5DH TIME_MONTH DATA 5EH TIME_DATA DATA 5FH YEARH DATA 36H YEAR DATA 35H MONTH DATA 34H DAY DATA 33H HOUR DATA 32H MINUTE DATA 31H SEC DATA 30H
课程设计报告
AAA BIT P3.0 BBB BIT P3.1 AA BIT P3.3 BB BIT P3.4 CC BIT P3.5 BL BIT P3.2 BZ1 BIT 21H.0 TIMES DATA
20H COM
DATA
P1 ORG
0000H LJMP
START ORG
0003H RETI ORG
000BH LJMP INTT0 ORG
0013H RETI ORG
001BH RETI ORG
0023H RETI START:
课程设计报告
MOV
R0,#30H MOV
R7,#9 CLEETE: MOV
@R0,#00H INC
R0 DJNZ
R7,CLEETE MOV
TIMES,#00H MOV
TMOD,#01H MOV
TL0,#0C0H MOV
TH0,#63H MOV
SEC,#0 MOV
MINUTE,#0H MOV
HOUR,#0H MOV
DAY,#01H MOV
MONTH,#01H MOV
YEAR,#01H MOV
YEARH,#20H SETB
EA SETB
ET0 SETB
TR0 MOV
R4,#19 START1:
课程设计报告
CALL
DISP JNB
AA,SETMM1 JMP
START1 SETMM1: CALL
SETMM JMP START1 SETMM: CALL
DISP CALL
DISP JB AA,SETMM0 SETMM2: JNB AA,SETMM3 CLR ET0 CLR TR0 MOV
SEC,#0 MOV
TIMES,#01H MOV
R0,#MINUTE SETMM4: NOP INC22: CALL
OFFL CALL
INC11
课程设计报告
CALL
DISP JB AA,INC22 CALL DISP JB AA,INC22 INC R0 MOV A,TIMES RL A MOV TIMES,A JNB
TIMES.5, SETMM4 SETMM12: JNB AA , SETMM11 SETMM0: SETB
TR0 SETB
ET0 RET SETMM11: CALL DISP JMP
SETMM12 SETMM3: CALL
DISP JMP
SETMM2 INC11:
课程设计报告
MOV
R3,#40 INC111: MOV A,@R0 JB
BB,INC17 ADD
A,#1 DA A CALL INC000 INC13: JNB BB , INC14 INC17: MOV
@R0,A CALL
DISP DJNZ R3,INC111 RET INC14: CALL
DISP JMP
INC13 OFFL: MOV
22H,@R0 MOV
R6,#10 OFF1: MOV
R7,#10
课程设计报告
OFF2: MOV
@ R0, # 0AAH CALL
DISP DJNZ R7 , OFF2 DJNZ R6 , OFF1 MOV
@ R0 , 22H RET INC000: JB
TIMES.0, INC001 JB
TIMES.1, INC002 JB
TIMES.2, INC003 JB
TIMES.3, INC004 JB
TIMES.4, INC005 JMP
INCOUT INC005: CJNE A, #99H, INCOUT MOV
A,#00H JMP
INCOUT INC004: CJNE A, # 13H, INCOUT MOV
A,#01H JMP
INCOUT
课程设计报告
INC003: CJNE A,# 32H ,INCOUT MOV
A,#01H JMP
INCOUT INC002: CJNE A,#24H,INCOUT MOV
A,#00H JMP
INCOUT INC001: CJNE A,# 60H , INCOUT MOV
A,#00H INCOUT: RET INTT0: PUSH
ACC PUSH
PSW ORL TL0,#0C0H MOV
TH0,#63H DJNZ R4 , CLKE111 JMP
LOOP11 CLKE111: JMP
CLKE
课程设计报告
LOOP11: MOV
R4,#19H MOV
A,SEC ADD
A,#1 DA A MOV
SEC,A CJNE A, #60H , CLKE99 MOV
SEC,#0 MOV
A,MINUTE ADD
A,#1 DA A MOV
MINUTE,A CLK0: CJNE A, # 60H, CLKE MOV
MINUTE,#0 MOV
A,HOUR ADD
A,#1 DA
A MOV
HOUR,A CJNE A, # 24H, CLKE MOV
HOUR,#0 MOV
A,DAY
课程设计报告
ADD
A,#1 DA A MOV
DAY,A MOV
A,MONTH INC
A MOVC A, @A + PC SJMP
CLK1 DB
31H,28H,31H DB
30H,31H,30H DB
31H,31H,30H DB
00H,00H,00H DB
00H,00H,00H DB
31H,30H,31H CLK1: CLR C SUBB A,DAY JNC
CLKE MOV
A,MONTH CJNE A,#2,CLK3 MOV
A,YEAR ANL A,#13H JNB
ACC.4,CLK2
课程设计报告
ADD
A,#2 CLK2: ANL A,#3 JNZ
CLK3 MOV
A,DAY XRL A,#29H JZ
CLKE CLK3: MOV
DAY,#1 MOV
A,MONTH ADD
A,#1 DA
A MOV
MONTH,A CJNE A,#13H,CLKE MOV
MONTH,#1 MOV
A,YEAR ADD
A,#1 DA
A MOV
YEAR,A CLKE99: CALL
CONVERT CLKE:
课程设计报告
POP
PSW POP
ACC RETI DISP: PUSH
PSW PUSH
ACC MOV
23H,R0 DISP99: MOV
R1,#40H MOV
R0,#30H MOV
R2,#9 DISP1: MOV A,@R0 ANL A,#0FH MOV @R1,A MOV A,@R0 SWAP A ANL A,#0FH INC R1 MOV @R1,A DJNZ R2,DISP2 CALL DISPLAY
课程设计报告
MOV R0,23H POP ACC POP PSW RET DISP2: INC R1 INC R0 JMP DISP1 DISPLAY: MOV R1,#40H MOV R5,#19 SETB AAA PLAY: SETB BBB NOP CLR BBB CLR AAA MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV COM,A CALL DL1MS
课程设计报告
MOV COM,#0FFH DJNZ R5,PLAY1 CLR BBB SETB AAA RET PLAY1: INC R1 JMP PLAY TAB: DB 0C0H,0F9H,0A4H, 0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0A3H,8EH,0ABH DL1MS: MOV 25H,R7 MOV 24H,R6 MOV R7,#20 DS1: MOV R6,#10 DJNZ R6,$ DJNZ R7,DS1 MOV R7,25H MOV R6,24H RET
课程设计报告
START_YEAR EQU 01 CONVERT_YEAR DATA 5CH CONVERT_MONTH DATA 38H CONVERT_DATE DATA 37H TEMP_BYTE1 DATA 57H TEMP_BYTE2 DATA 58H TEMP_BYTE3 DATA 59H TEMP_BYTE4 DATA 5AH TEMP_BYTE5 DATA 5BH CONVERT: MOV A, YEAR MOV TIME_YEAR,A MOV A,MONTH MOV TIME_MONTH,A MOV A,DAY MOV TIME_DATA,A MOV A,TIME_YEAR MOV B,#16 DIV AB MOV CONVERT_YEAR,B MOV B,#10 MUL AB
课程设计报告
ADD A,CONVERT_YEAR MOV CONVERT_YEAR,A MOV A,TIME_MONTH JNB ACC.4,CON_02 CLR ACC.4 ADD A,#10 CON_02:MOV CONVERT_MONTH,A MOV A,TIME_DATA MOV B,#16 DIV AB MOV CONVERT_DATE,B MOV B,#10 MUL AB ADD A,CONVERT_DATE MOV CONVERT_DATE,A MOV DPTR,#MONTH_DATA MOV A,CONVERT_YEAR CON_06:CLR C SUBB A,#START_YEAR MOV B,#3 MUL AB ADD A,DPL
课程设计报告
MOV DPL,A MOV A,B ADDC A,DPH MOV DPH,A MOV A, #2 MOVC A, @A+DPTR CLR ACC.7 MOV B, #32 DIV AB MOV TEMP_BYTE1,A MOV TEMP_BYTE2,B MOV TEMP_BYTE3,#0 MOV A,CONVERT_MONTH CJNE A,#10,CON_08 CON_08:JC CON_09 MOV TEMP_BYTE3,#1 CON_09:MOV A,CONVERT_YEAR ANL A,#03H JNZ CON_10 MOV A,CONVERT_MONTH LCALL GET_RUN_DAYS_LOW SJMP CON_12
课程设计报告
CON_10:MOV A,CONVERT_MONTH LCALL GET_DAYS_LOW CON_12:MOV B,CONVERT_DATE DEC B ADD A,B MOV TEMP_BYTE4,A JNC CON_14 INC TEMP_BYTE3 CON_14:MOV A,TEMP_BYTE1 LCALL GET_DAYS_LOW DEC A ADD A,TEMP_BYTE2 MOV TEMP_BYTE5,A MOV A,CONVERT_MONTH CJNE A,TEMP_BYTE1,CON_20 MOV A,CONVERT_DATE CJNE A,TEMP_BYTE2,CON_20 CON_20:JC CON_22 LJMP CON_60 CON_22:MOV A,CONVERT_YEAR JNZ CON_24 MOV A,#100
课程设计报告
CON_24:DEC A MOV CONVERT_YEAR,A MOV A,DPL CLR C SUBB A,#3 MOV DPL,A JNC CON_26 DEC DPH CON_26:MOV A,TEMP_BYTE5 CLR C SUBB A,TEMP_BYTE4 MOV TEMP_BYTE3,A MOV CONVERT_MONTH,#12 CLR F0 CLR A MOVC A,@A+DPTR ANL A,#0F0H SWAP A;MOV TEMP_BYTE4,A JZ CON_30 MOV A, #2 MOVC A , @A+DPTR
课程设计报告
MOV C, ACC.7 MOV A, #1 MOVC A, @A+DPTR RLC A SJMP CON_34 CON_30:MOV A, #1 MOVC A, @A+DPTR CON_34:MOV TEMP_BYTE5, A CON_40:MOV A, TEMP_BYTE5 RRC A MOV TEMP_BYTE5, A JC CON_42 MOV B, #29 SJMP CON_44 CON_42:MOV B, #30 CON_44:MOV A, TEMP_BYTE3 CLR C SUBB A, B JZ CON_46 JNC CON_50 CPL A INC A
课程设计报告
CON_46: INC A MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_DATE, A MOV A, CONVERT_MONTH MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_MONTH, A MOV A, CONVERT_YEAR MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_YEAR, A CALL WEEK RET CON_50:MOV TEMP_BYTE3, A JB F0, CON_52
课程设计报告
DEC CONVERT_MONTH CON_52:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE4, CON_54 CPL F0 CON_54:SJMP CON_40 CON_60:MOV A, TEMP_BYTE4 CLR C SUBB A, TEMP_BYTE5 MOV TEMP_BYTE4, A JNC CON_62 DEC TEMP_BYTE3 CON_62:MOV CONVERT_MONTH, #1 CLR A MOVC A, @A+DPTR MOV TEMP_BYTE5, A ANL A, #0F0H SWAP A XCH A, TEMP_BYTE5 CLR F0 ANL A, #0FH MOV TEMP_BYTE1, A MOV A, #1
课程设计报告
MOVC A, @A+DPTR MOV TEMP_BYTE2, A ANL A, #0F0H ORL A, TEMP_BYTE1 SWAP A MOV TEMP_BYTE1, A MOV A, #2 MOVC A, @A+DPTR MOV C, ACC.7 MOV A, TEMP_BYTE2 ANL A, # 0FH SWAP A MOV ACC.3, C MOV TEMP_BYTE2, A CON_70:MOV A, TEMP_BYTE2 RLC A MOV TEMP_BYTE2, A MOV A, TEMP_BYTE1 RLC A MOV TEMP_BYTE1, A JC CON_72 MOV B, #29
课程设计报告
SJMP CON_74 CON_72:MOV B, #30 CON_74:MOV A, TEMP_BYTE4 CLR C SUBB A,B JNC CON_78 MOV B, A MOV A, TEMP_BYTE3 JZ CON_76 DEC TEMP_BYTE3 MOV TEMP_BYTE4, B SJMP CON_80 CON_76:MOV A, TEMP_BYTE4 LJMP CON_46
CON_78:MOV TEMP_BYTE4, A CON_80:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE5, CON_82 CPL F0 JNB F0, CON_82 SJMP CON_70 CON_82:INC CONVERT_MONTH SJMP CON_70
课程设计报告
GET_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,59,90,120,151,181,212,243,17,48,78 GET_RUN_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,60,91,121,152,182,213,244,18,49,79 MONTH_DATA:
DB 04DH,04AH,0B8H;2001 DB 00DH,04AH,04CH;2002 DB 00DH,0A5H,041H;2003 DB 025H,0AAH,0B6H;2004 DB 005H,06AH,049H;2005 DB 07AH,0ADH,0BDH;2006 DB 002H,05DH,052H;2007 DB 009H,02DH,047H;2008 DB 05CH,095H,0BAH;2009 DB 00AH,095H,04EH;2010 DB 00BH,04AH,043H;2011
课程设计报告
DB 04BH,055H,037H;2012 DB 00AH,0D5H,04AH;2013 DB 095H,05AH,0BFH;2014 DB 004H,0BAH,053H;2015 DB 00AH,05BH,048H;2016 DB 065H,02BH,0BCH;2017 DB 005H,02BH,050H;2018 DB 00AH,093H,045H;2019 DB 047H,04AH,0B9H;2020 DB 006H,0AAH,04CH;2021 DB 00AH,0D5H,041H;2022 DB 024H,0DAH,0B6H;2023 DB 004H,0B6H,04AH;2024 DB 069H,057H,03DH;2025 DB 00AH,04EH,051H;2026 DB 00DH,026H,046H;2027 DB 05EH,093H,03AH;2028 DB 00DH,053H,04DH;2029 DB 005H,0AAH,043H;2030 DB 036H,0B5H,037H;2031 DB 009H,06DH,04BH;2032 DB 0B4H,0AEH,0BFH;2033
课程设计报告
DB 004H,0ADH,053H;2034 DB 00AH,04DH,048H;2035 DB 06DH,025H,0BCH;2036 DB 00DH,025H,04FH;2037 DB 00DH,052H,044H;2038 DB 05DH,0AAH,038H;2039 DB 00BH,05AH,04CH;2040 DB 005H,06DH,041H;2041 DB 024H,0ADH,0B6H;2042 DB 004H,09BH,04AH;2043 DB 07AH,04BH,0BEH;2044 DB 00AH,04BH,051H;2045 DB 00AH,0A5H,046H;2046 DB 05BH,052H,0BAH;2047 DB 006H,0D2H,04EH;2048 DB 00AH,0DAH,042H;2049 DB 035H,05BH,037H;2050 DB 009H,037H,04BH;2051 DB 084H,097H,0C1H;2052 DB 004H,097H,053H;2053 DB 006H,04BH,048H;2054 DB 066H,0A5H,03CH;2055
课程设计报告
DB 00EH,0A5H,04FH;2056 DB 006H,0B2H,044H;2057 DB 04AH,0B6H,038H;2058 DB 00AH,0AEH,04CH;2059 DB 009H,02EH,042H;2060 DB 03CH,097H,035H;2061 DB 00CH,096H,049H;2062 DB 07DH,04AH,0BDH;2063 DB 00DH,04AH,051H;2064 DB 00DH,0A5H,045H;2065 DB 055H,0AAH,0BAH;2066 DB 005H,06AH,04EH;2067 DB 00AH,06DH,043H;2068 DB 045H,02EH,0B7H;2069 DB 005H ,02DH, 04BH;2070 DB 08AH, 095H, 0BFH;2071 DB 00AH, 095H, 053H;2072 DB 00BH, 04AH, 047H;2073 DB 06BH, 055H, 03BH;2074 DB 00AH, 0D5H, 04FH;2075 DB 005H, 05AH, 045H;2076 DB 04AH, 05DH, 038H;2077
课程设计报告
DB 00AH, 05BH, 04CH;2078 DB 005H, 02BH, 042H;2079 DB 03AH, 093H, 0B6H;2080 DB 006H, 093H, 049H;2081 DB 077H, 029H, 0BDH;2082 DB 006H, 0AAH, 051H;2083 DB 00AH, 0D5H, 046H;2084 DB 054H, 0DAH, 0BAH;2085 DB 004H, 0B6H, 04EH;2086 DB 00AH, 057H, 043H;2087 DB 045H, 027H, 038H;2088 DB 00DH, 026H, 04AH;2089 DB 08EH, 093H, 03EH;2090 DB 00DH, 052H, 052H;2091 DB 00DH, 0AAH, 047H;2092 DB 066H, 0B5H, 03BH;2093 DB 005H, 06DH, 04FH;2094 DB 004H, 0AEH, 045H;2095 DB 04AH, 04EH, 0B9H;2096 DB 00AH, 04DH, 04CH;2097 DB 00DH, 015H, 041H;2098 DB 02DH, 092H, 0B5H;2090
课程设计报告
DB 00DH, 053H, 049H;2100 TIME_WEEK1 DATA 52H WEEK: MOV A, TIME_YEAR MOV B, #16 DIV AB MOV TEMP_BYTE1, B MOV B, #10 MUL AB ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH JB ACC.7, GETW02 MOV A, #100 ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH CLR ACC.7 GETW02: JNB ACC.4, GETW04 ADD A , #10 CLR ACC.4 GETW04: MOV TEMP_BYTE2,A
课程设计报告
MOV A, TIME_DATA MOV B, #16 DIV AB MOV TEMP_BYTE3, B MOV B, #10 MUL AB ADD A, TEMP_BYTE3 MOV TEMP_BYTE3, A MOV A ,TEMP_BYTE1 ANL A, #03H JNZ GETW10 MOV A, TEMP_BYTE2 CJNE A, #3,GETW06 GETW06: JNC GETW10 DEC TEMP_BYTE3 GETW10: MOV A,TEMP_BYTE2 LCALL GET_CORRECT ADD A, TEMP_BYTE1 MOV B, #7 DIV AB
MOV A, TEMP_BYTE1
课程设计报告
ANL A, #0FCH RR A RR A ADD A, B ADD A, TEMP_BYTE3 MOV B, #7 DIV AB MOV A, B CJNE A, #0,OUTOUT MOV B, #8 OUTOUT: MOV TIME_WEEK, B RET GET_CORRECT: MOVC A, @A+PC RET DB 0,3,3,6,1,4,6,2,5,0,3,5 END 系统仿真及调试
课程设计报告 仿真结果及分析
课程设计报告
上图为运行时的显示,左边两个数码管显示器显示的是年、月、日,中间的显示的是时、分、秒,右边显示的是农历日期以及星期。若想要调试时间,可通过右下方两个并联开关调试,左边开关调试数码管显示位置,右边的调试增1。此刻是2013年11月29日下午15:02,星期五,时间准确。训练体会
在整个单片机课程设计中,想要做出这个完整的设计过程,必须突破几个难点:
1、元件得找准却,6路驱动可以用74LS244代替。
2、连线不能连错,对应的输入输出端标上序号。
3、程序代码不能敲错。
4、由于单管显示的星期数不稳定,可以采用双管显示。参考文献:单片机课程设计指导。