当前位置:文档之家› 用51单片机做的万年历,显示用12864液晶

用51单片机做的万年历,显示用12864液晶

用51单片机做的万年历,显示用12864液晶
用51单片机做的万年历,显示用12864液晶

LCD12864.c

#include "reg52.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

#define LCD_DB_PORT P0 //液晶DB0~DB7 #define LCD_START_ROW 0xc0 //起始行

#define LCD_PAGE 0xb8 //页指令

#define LCD_COL 0x40 //列指令

//液晶引脚定义

sbit LCD_DI=P2^0;

sbit LCD_RW=P2^1;

sbit LCD_E=P2^2;

sbit LCD_CS1=P2^3;

sbit LCD_CS2=P2^4;

sbit LCD_RST=P2^5;

bit Reverse_Display=0;

//检查LCD是否忙

bit LCD_Check_Busy(void)

{ LCD_DB_PORT=0xff;

LCD_RW=1; _nop_(); LCD_DI=0;

LCD_E=1; _nop_(); LCD_E=0;

return(bit)(P0&0x80);

}

//向LCD发送命令

void LCD_Write_Command(uchar c)

{ while(LCD_Check_Busy());

LCD_DB_PORT=0xff; LCD_RW=0; _nop_(); LCD_DI=0;

LCD_DB_PORT=c; LCD_E=1; _nop_(); LCD_E=0;

}

//向LCD发送数据

void LCD_Write_Data(uchar d)

{ while(LCD_Check_Busy());

LCD_DB_PORT=0xff;

LCD_RW=0;_nop_();LCD_DI=1;

//根据Reverse_Display决定是否反相显示

if(!Reverse_Display)LCD_DB_PORT=d;else LCD_DB_PORT=~d;

LCD_E=1;_nop_();LCD_E=0;

}

//初始化LCD

void LCD_Initialize(void)

{ LCD_CS1=1;LCD_CS2=1;

LCD_Write_Command(0x38);

LCD_Write_Command(0x0f);

LCD_Write_Command(0x01);

LCD_Write_Command(0x06);

LCD_Write_Command(LCD_START_ROW);

}

//通用显示函数

//从第P页第L列开始显示W个字节数据,数据在r所指向的缓冲//每字节8位是垂直显示的,高位在下,低位在上

//每个8*128的矩形区域为一页

//整个LCD右由64*64的左半屏和64*64的右半屏构成

void Common_Show(uchar P,uchar L,uchar W,uchar *r)

{ uchar i;

if(L<64) //显示在左半屏或左右半屏

{ LCD_CS1=1;LCD_CS2=0;

LCD_Write_Command(LCD_PAGE+P);

LCD_Write_Command(LCD_COL+L);

if(L+W<64) //全部显示在左右半屏

{ for(i=0;i

}

else //如果越界则跨左右半屏显示

{ for(i=0;i<64-L;i++)LCD_Write_Data(r[i]); //左半屏显示

LCD_CS1=0;LCD_CS2=1; //右半屏显示

LCD_Write_Command(LCD_PAGE+P);

LCD_Write_Command(LCD_COL);

for(i=64;i

}

}

else //全部显示在右半屏

{ LCD_CS1=0;LCD_CS2=1;

LCD_Write_Command(LCD_PAGE+P);

LCD_Write_Command(LCD_COL+L-61);

for(i=0;i

}

}

//显示8*16点阵字符

void Display_A_Char_8X16(uchar P,uchar L,uchar *M) { Common_Show(P,L,8,M);

Common_Show(P+1,L,8,M+8);

}

//显示一个16*16点阵汉字

void Display_A_WORD(uchar P,uchar L,uchar *M) { Common_Show(P,L,16,M); //显示汉字上半部分Common_Show(P+1,L,16,M+16);

}

Main.c

#include "reg52.h"

#include "intrins.h"

#include "string.h"

#include "LCD_12864.c"

#define uchar unsigned char

#define uint unsigned int

/*extern void LCD_Initialize(void);

extern void Display_A_Char_8X16(uchar P,uchar L,uchar *M); extern void Display_A_WORD(uchar P,uchar L,uchar *M);

//在调整日期时间时,用该位决定是否反白显示

extern bit Reverse_Display=0;

*/

sbit SDA=P1^0; //DS1302数据线

sbit CLK=P1^1; //DS1302时钟线

sbit RST=P1^2; //DS1302复位线

sbit k1=P3^4; //选择

sbit k2=P3^5; //加

sbit k3=P3^6; //减

sbit k4=P3^7; //确定

uchar tCount=0;

//一年中每个月的天数,2月的天数由年份决定

uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};

//所读取的日期时间

uchar DateTime[7];

//当前调整的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)

//5对应星期,星期调节由年月日调整自动完成

char Adjust_Index=-1;

//水平与垂直偏移

uchar H_Offset=10,V_Page_Offset=0;

//年月日,星期,时分秒汉字点阵(16*16)------------------------------- uchar code DATE_TIME_WORDS[]={

/*-- 文字: 年--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x 04,0x00,0x00,

0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x 04,0x04,0x00,

/*-- 文字: 月--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x 00,0x00,0x00,

0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x

/*-- 文字: 日--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x 00,0x00,0x00,

0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x 00,0x00,0x00,

/*-- 文字: 星--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00, 0x00,0x00,0x00,

0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x 40,0x00,0x00,

/*-- 文字: 期--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xF E,0x00,0x00,

0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x 7F,0x00,0x00,

/*-- 文字: 时--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x

0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x0 0,0x00,0x00,

/*-- 文字: 分--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x 40,0x80,0x00,

0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x 00,0x00,0x00,

/*-- 文字: 秒--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x 10,0x60,0x00,

0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x 03,0x00,0x00,

};

//星期几的汉字点阵(16*16)----------------------------------

uchar code WEEDDAY_WORDS[]={

/*-- 文字: 日--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x 00,0x00,0x00,

0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x 00,0x00,0x00,

/*-- 文字: 一--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x 80,0x80,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,

/*-- 文字: 二--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x 00,0x00,0x00,

0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x 10,0x10,0x00,

/*-- 文字: 三--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x 04,0x00,0x00,

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x 20,0x20,0x00,

/*-- 文字: 四--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x FC,0x00,0x00,

0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x 7F,0x00,0x00,

/*-- 文字: 五--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x 02,0x00,0x00,

0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x 40,0x40,0x00,

/*-- 文字: 六--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x 20,0x20,0x00,

0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x 60,0x00,0x00,

};

//半角数字点阵(8*16)---------------------------------------------------- uchar code DIGITS[]={

/*-- 文字: 0 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x

10,0x0F,0x00,

/*-- 文字: 1 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x 20,0x00,0x00,

/*-- 文字: 2 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x 21,0x30,0x00,

/*-- 文字: 3 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x 11,0x0E,0x00,

/*-- 文字: 4 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x 3F,0x24,0x00,

/*-- 文字: 5 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x 11,0x0E,0x00,

/*-- 文字: 6 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x 11,0x0E,0x00,

/*-- 文字: 7 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x 00,0x00,0x00,

/*-- 文字: 8 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x 22,0x1C,0x00,

/*-- 文字: 9 --*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x 11,0x0F,0x00,

};

//向DS1302写入一字节

void Write_A_Byte_TO_DS1302(uchar x)

{ uchar i;

for(i=0;i<8;i++)

{ SDA=x&1; CLK=1; CLK=0; x>>=1;

}

}

//从DS1302读取一字节

uchar Get_A_Byte_FROM_DS1302(void) { uchar i,b,t;

for(i=0;i<8;i++)

{ b>>=1; t=SDA; b|=t<<7; CLK=1; CLK=0;

}

//BCD码转换

return(b/16*10+b%16);

}

//从DS1302指定位置读数据

uchar Read_Data(uchar addr)

{ uchar dat;

RST=0; CLK=0; RST=1;

Write_A_Byte_TO_DS1302(addr);

dat=Get_A_Byte_FROM_DS1302();

CLK=1; RST=0;

return(dat);

}

//向DS1302某地址写入数据

void Write_DS1302(uchar addr,uchar dat)

{ CLK=0; RST=1;

Write_A_Byte_TO_DS1302(addr);

Write_A_Byte_TO_DS1302(dat);

CLK=0; RST=0;

}

//设置时间

void SET_DS1302(void)

{ uchar i;

Write_DS1302(0x8e,0x00);

//秒分时日月年依次写入

for(i=0;i<7;i++)

{ //秒的起始地址1000 0000(0x80)

//后续依次是分,时,月,周,年,写入地址每次递增2

Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));

}

Write_DS1302(0x8e,0x80);

}

//读取当前日期时间

void GetTime(void)

{ uchar i;

for(i=0;i<7;i++)

{ DateTime[i]=Read_Data(0x81+2*i);

}

}

//半断是否为闰年

uchar isLeapYear(uint y)

{ return((y%4==0&&y%100!=0)||(y%400==0)); }

//--------------------------------------------

//求自2000.1.1开始的任何一天是星期几

//函数没有通过,求出总天数后在求出星期几//因为求总天数可能会月出uint的范围

//--------------------------------------------

void RefreshWeekDay(void)

{ uint i,d,w=5; //已知1999.12.31是周五for(i=2000;i<2000+DateTime[6];i++)

{ d=isLeapYear(i)?366:365;

w=(w+d)%7;

}

d=0;

for(i=1;i

d+=DateTime[3];

//保存星期,0~6表示星期日,星期一,二,、、、六,为了与DS1302的星期格式匹配,返回值需要加1

DateTime[5]=(w+d)%7+1;

}

//年月日时分秒++/--

void DateTime_Adjust(char x)

{ switch(Adjust_Index)

{ case 6: //年00-99

if(x==1&&DateTime[6]<99)DateTime[6]++;

if(x==-1&&DateTime[6]>0)DateTime[6]--;

//获取2月天数

MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;

//如果年份变化后当前月份的天数大于上限则设为上限

if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays [DateTime[4]];

RefreshWeekDay(); //刷新星期

break;

case 4: //月01-12

if(x==1&&DateTime[4]<12)DateTime[4]++;

if(x==-1&&DateTime[4]>1)DateTime[4]--;

//获取2月份天数

MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;

//如果月份变化后当前月份的天数大于上限则设为上限

if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays [DateTime[4]];

RefreshWeekDay(); //刷新星期

break;

case 3: //日00-28/29/30/31;调节之前首先根据年份得出该年中2月的天数

MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;

//根据当前月份决定调节日期的上限

if(x==1&&DateTime[3]

if(x==-1&&DateTime[3]>1)DateTime[3]--;

RefreshWeekDay(); //刷新星期

break;

case 2: //时

if(x==1&&DateTime[2]<23)DateTime[2]++;

if(x==-1&&DateTime[3]>1)DateTime[2]--;

break;

case 1: //分

if(x==1&&DateTime[1]<59)DateTime[1]++;

if(x==-1&&DateTime[1]>1)DateTime[1]--;

break;

case 0: //秒

if(x==1&&DateTime[0]<59)DateTime[0]++;

if(x==-1&&DateTime[0]>1)DateTime[0]--;

}

}

//定时器0每秒刷新LCD显示

void T0_INT(void) interrupt 1

{ TH0=-50000/256;

TL0=-50000%256;

if(++tCount!=2)return;

tCount=0;

if(Adjust_Index==-1)GetTime(); //如果未执行调整操作则正常读

取当前时间

//年后两位

Reverse_Display=Adjust_Index==6; /*等同于

{ if(Adjust_Index==6)Reverse_Display=1;

else Reverse_Display=0; } */

Display_A_Char_8X16(V_Page_Offset,16+H_Offset,DIGITS+DateTime [6]/10*16);

Display_A_Char_8X16(V_Page_Offset,24+H_Offset,DIGITS+DateTime [6]%10*16);

//月

Reverse_Display=Adjust_Index==4;

Display_A_Char_8X16(V_Page_Offset,48+H_Offset,DIGITS+DateTime [4]/10*16);

Display_A_Char_8X16(V_Page_Offset,56+H_Offset,DIGITS+DateTime [4]%10*16);

//日

Reverse_Display=Adjust_Index==3;

Display_A_Char_8X16(V_Page_Offset,80+H_Offset,DIGITS+DateTime [3]/10*16);

Display_A_Char_8X16(V_Page_Offset,88+H_Offset,DIGITS+DateTime [3]%10*16);

//星期

Reverse_Display=Adjust_Index==5;

Display_A_WORD(V_Page_Offset+2,96+H_Offset,WEEDDAY_WORDS +(DateTime[5]-1)*32);

//时

Reverse_Display=Adjust_Index==2;

Display_A_Char_8X16(V_Page_Offset+5,16+H_Offset,DIGITS+DateTi me[2]/10*16);

Display_A_Char_8X16(V_Page_Offset+5,24+H_Offset,DIGITS+DateTi me[2]%10*16);

//分

Reverse_Display=Adjust_Index==1;

Display_A_Char_8X16(V_Page_Offset+5,48+H_Offset,DIGITS+DateTi me[1]/10*16);

Display_A_Char_8X16(V_Page_Offset+5,56+H_Offset,DIGITS+DateTi me[1]%10*16);

//秒

Reverse_Display=Adjust_Index==0;

Display_A_Char_8X16(V_Page_Offset+5,80+H_Offset,DIGITS+DateTi me[0]/10*16);

Display_A_Char_8X16(V_Page_Offset+5,88+H_Offset,DIGITS+DateTi me[0]%10*16);

}

AT89C51单片机简易计算器的设计

AT89C51单片机简易计算器的设计 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除六位数范围内的基本四则运算,并在LCD上显示相应的结果。设计电路采用AT89C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入。显示采用字符LCD静态显示。软件方面使用C语言编程,并用PROTUES仿真。 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数

值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图: 二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

基于51单片机的万年历的设计

单片机课程实训SCM PRACTICAL TRAINING

目录 第一部分课程设计任务书 (1) 一、课程设计题目 (1) 二、课程设计时间 (1) 三、实训提交方式 (1) 四、设计要求 (1) 第二部分课程设计报告 (2) 一、单片机发展概况 (2) 二、MCS-51单片机系统简介 (2) 三、设计思想 (3) 四、硬件电路设计 (3) 1. 总体设计 (3) 2. 晶振电路 (4) 3. 复位电路 (4) 4. DS1302时钟电路 (5) 5. 温度采集系统电路 (5) 6. 按键调整电路 (6) 7. 闹钟提示电路 (6) 五、软件设计框图 (7) 六、程序源代码 (8) 1. 主程序 (8) 2. 温度控制程序 (11) 3. 日历设置程序 (13) 4. 时钟控制程序 (18) 5. 显示设置程序 (20) 七、结束语 (23) 八、课程设计小组分工 (23) 九、参考文献 (23)

第一部分课程设计任务书 一、课程设计题目 用中小规模集成芯片设计制作万年历。 二、课程设计时间 五天 三、实训提交方式 提交实训设计报告电子版与纸质版 四、设计要求 (1)显示年、月、日、时、分、秒和星期,并有相应的农历显示。(2)可通过键盘自动调整时间。 (3)具有闹钟功能。 (4)能够显示环境温度,误差小于±1℃ (5)计时精度:月误差小于20秒。

第二部分课程设计报告 一、单片机发展概况 单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段: 第一阶段(1976-1978):初级单片机微处理阶段。该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址范围 4KB,但是没有串行口。 第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址范围可达 64KB。 第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。 二、MCS-51单片机系统简介 MCS-51系列单片机产品都是以Intel公司最早的典型产品8051为核心构成的。MCS-51单片机由CPU 、RAM 、ROM 、I/O接口、定时器/计数器、中断系统、内部总线等部件组成。8051单片机的基本性能有: ◆8位CPU; ◆布尔代数处理器,具有位寻址能力; ◆128B内部RAM,21个专用寄存器; ◆4KB内部掩膜ROM; ◆2个16位可编程二进制加1定时器/计数器; ◆32个(4×8位)双向可独立寻址的I/O口; ◆1个全双工UART(异步串行通信口); ◆5个中断源,两级中断结构; ◆片内振荡器及时钟电路,晶振频率为1.2MHz~12MHz; ◆外部程序/数据存储器寻址空间均为64KB; ◆111条指令,大部分为单字节指令; ◆单一+5V电源供电,双列直插40引脚DIP封装。

基于51单片机的计算器设计程序代码汇编

DBUF EQU 30H TEMP EQU 40H YJ EQU 50H ;结果存放 YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放 ORG 00H START: MOV R3,#0 ;初始化显示为空MOV GONG,#0 MOV 30H,#10H MOV 31H,#10H MOV 32H,#10H MOV 33H,#10H MOV 34H,#10H MLOOP: CALL DISP ;PAN调显示子程序WAIT: CALL TESTKEY ; 判断有无按键JZ WAIT CALL GETKEY ;读键 INC R3 ;按键个数 CJNE A,#0,NEXT1 ; 判断就是否数字键 LJMP E1 ; 转数字键处理NEXT1: CJNE A,#1,NEXT2 LJMP E1 NEXT2: CJNE A,#2,NEXT3 LJMP E1 NEXT3: CJNE A,#3,NEXT4 LJMP E1 NEXT4: CJNE A,#4,NEXT5 LJMP E1 NEXT5: CJNE A,#5,NEXT6 LJMP E1 NEXT6: CJNE A,#6,NEXT7 LJMP E1 NEXT7: CJNE A,#7,NEXT8 LJMP E1 NEXT8: CJNE A,#8,NEXT9 LJMP E1 NEXT9: CJNE A,#9,NEXT10 LJMP E1 NEXT10: CJNE A,#10,NEXT11 ;判断就是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12 LJMP E2 NEXT12: CJNE A,#12, NEXT13 LJMP E2

基于51单片机的12864万年历

#include // 该程序具有显示日期、月份、日期和时间功能#include #include #define uchar unsigned char #define uint unsigned int #define sint signed int #define disp_off 0x3e //显示关 #define disp_on 0x3f //显示开 #define disp_x 0xb8 //页地址为0页 #define disp_z 0xc0 //行地址为0行 #define disp_y 0x40 //列地址为0列 #define comm 0 //命令标志位 #define dat1 1 //数据标志位 #define data_ora P0 //液晶12864的数据端与单片机的P0相连 sbit di =P2^0; //Data or Instrument Select,H:写数据,L:写指令sbit rw =P2^1; //Write or Read,H:read,L:write sbit e =P2^4; //读写使能 sbit cs1=P2^2; //cs1=H,选择左半屏 sbit cs2=P2^3; //cs2=H,选择右半屏

sbit clk=P1^0; //8563 clk sbit dat=P1^1; //8563 data uchar fen=0x42,miao=0x38,shi=0x17,riqi=0x02,//设置时间用yuefen=0x09,xingqi=0x00,nian=0x07,zhongduan;//设置时间用uchar code tabma[10][16]= //阴码点阵格式、取模方式为列行式、逆向取模(低位在前),//十六进制输出,中文16*16,英文8*16 宋体 { //0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9) {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, /*"0",0*/ {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, /*"1",1*/ {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, /*"2",2*/

51单片机简易计算器程序

#include <reg51.h>#include <intrins.h> #include <ctype.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned int uchar operand1[9], operand2[9]; uchar operator; void delay(uint); uchar keyscan(); void disp(void); void buf(uint value); uint compute(uint va1,uint va2,uchar optor); uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff}; uchar dbuf[8] = {10,10,10,10,10,10,10,10}; void delay(uint z) { uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); } uchar keyscan() { uchar skey; P1 = 0xfe; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xee: skey = '7'; break; case 0xde: skey = '8'; break; case 0xbe: skey = '9'; break; case 0x7e: skey = '/'; break; default: skey = '#'; }

基于51单片机电子万年历设计

基于51单片机电子万年历设计 专业:机电设备维修与管理姓名:杜洪浦指导老师: 摘要电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。 万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用液晶LCD1602。软件方面主要包括日历程序、液晶驱动程序,显示程序等。程序采用汇编语言编写。所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。 关键词时钟电钟,DS1302,液晶LCD1602,单片机 目录 1设计要求与方案论证 (2) 1.1 设计要求 (2) 1.2 系统基本方案选择和论证 (2) 1.2.1单片机芯片的选择方案和论证 (2) 1.2.2 显示模块选择方案和论证 (3) 1.2.3时钟芯片的选择方案和论证: (3) 1.3 电路设计最终方案决定 (3) 2系统的硬件设计与实现 (3) 2.1 电路设计框图 (4) 2.2 系统硬件概述 (4) 2.3 主要单元电路的设计 (4) 2.3.1单片机主控制模块的设计 (4)

AT89C51单片机C实现简易计算器

AT89C51单片机简易计算器的设计 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图:

二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

(二)、键盘接口电路 计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。 矩阵键盘的工作原理: 计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。 图 2 矩阵键盘布局图 矩阵键盘内部电路图如图3所示:

基于AT89C51单片机的电子万年历的设计_课程设计报告

课程设计报告 设计名称:电子万年历设计 专业班级:自动化10101班 完成时间:2013年6月9日 报告成绩:

摘要 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。 关键字AT89C51;电子万年历; DS1302

1 绪论 1.1 课题研究的背景 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89C51单片机作为核心,功耗小,能在3V 的低压工作,电压可选用3~5V电压供电。 此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 1.2课题的研究目的与意义 二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。 由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。 1.3课题解决的主要内容 本课题所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用、易于实现,使系统电路尽量简单。 (4)根据设计的硬件电路,编写控制AT89C51芯片的单片机程序。 (5)通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。 (6)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方便用户操作等因素。 (7)软件设计时必须要有完善的思路,要做到程序简单,调试方便。

基于单片机的电子万年历设计

基于单片机的电子万年历设计 摘要:本文借助电路仿真软件Protues对基于AT89S52单片机的电子万年历的设计方法及仿真进行了全面的阐述。该电子万年历在硬件方面主要采用AT89S52单片机作为主控核心,由DS1302时钟芯片提供时钟、12864LCD液晶显示屏显示。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,在Proteus软件中进行电路设计并仿真。 论文主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。 研究结果表明,由于万年历的应用相当普遍,所以其设计的核心在于硬件成本的节约软件算法的优化,力求做到物美价廉,才能拥有更广阔的市场前景。关键词:单片机;DS1302;DS18B20;LCD12864 The Design Of Electronic Calender Based On MCU Abstract:This paper mainly discuss the design of electronic calender based on AT89S52 with the help of Protues.On the hardware side, the electronic calendar using AT89S52 microcontroller as the main control center, clock provided by the DS1302 clock chip , 12864LCDdot matrix LCD display. In terms of software, including calendar program, time to adjust procedures, display procedures. All programming is complete, the Keil software debugging, make sure there is no problem, in the Proteus software embedded within the simulated MCU. This article focus on liquid crystal screen LCD12864 and clock chip DS1302,temperature sensor DS18B20 which connected and communicated with Microcontroller.Several solutions will also compared with each other.On software side,calender calculation will be discussed as well. The results are as follows:as electronic calender are widely used in our daily life.It should be chip and convenient so as to win more profit.

12864显示电子万年历

12864显示电子万年历 /*************************************************************** 系统名称:电子万年历 创建人:w418781840 日期:2008,7,18 功能描述:LCD12864串行模式显示,DS1302读取时间年月份, 18B20 读取温度 ****************************************************************/ #include #include #include #define uchar unsigned char #define uint unsigned int /*------------LCD12864相关声明-----------------------------*/ #define com 0 #define dat 1 sbit cs =P1^6; sbit sid=P1^4; sbit sck=P1^2; uchar code TAB1[]={"电字钟w418781840"};//第一行初始化. uchar code TAB2[]={"20 年月日"}; //第二行 uchar code TAB3[]={"星期: : "}; //第三行 uchar code TAB4[]={"室温: ℃"}; //第四行 /*----------------------DS1302相关声明-------------------------*/ char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:时. 0x18,0x06,0x06,0x08}; //日:月:星期:年. uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302数字日期转换为中文字符. sbit T_CLK=P2^4; /* 实时时钟的时钟线引脚*/ sbit T_IO=P2^5; /* 实时时钟的数据线*/ sbit T_RST=P2^6; /* 实时时钟的复位线引脚*/ uchar bdata datbyte; sbit datbyte0=datbyte^0; sbit datbyte7=datbyte^7; /*--------------18B20相关声明-------------------------------*/ uchar dis1[16]; sbit DQ=P1^0; /*DS18B20温度检测*/

单片机课程设计--基于51单片机的万年历

单片机课程设计报告 万年历的设计

基于51单片机的万年历 摘要: 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。 本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。 软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用C语言编写。所有程序编写完成后,在KeilC51软件中进行调试,

确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 一、设计要求 基本要求: 1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”; 2,具有日历功能; ③时间可以通过按键调整。 发挥部分: ④具有闹钟功能(可以设定多个)。 二:总体设计 电路设计框图

51单片机简易计算器代码

#include"reg52.h" #define uchar unsigned char #define uint unsigned int sbit busy=P0^7; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } char i,j,temp,num; long a,b,c; //a,第一个数b,第二个数c,得数 uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0}; uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0 x2b-0x30}; //按键显示编码表 sbit lcden=P2^2; sbit lcdwrite=P2^1; sbit lcdrs=P2^0; //lcd的写指令 void write_com(uchar com) { lcdrs=0; lcden=0; P0=com; delay(1); lcden=1; delay(1); lcden=0; } //lcd的写数据 void write_date(uchar da) { lcdrs=1; lcden=0; P0=da; delay(1); lcden=1; delay(1); lcden=0; } //初始化

void init() //初始化 { uchar num; num=-1; lcdwrite=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); delay(500);//延时0.5s write_com(0x01); i=0; j=0; a=0; //第一个参与运算的数 b=0; //第二个参与运算的数 c=0; flag=0; //flag表示是否有符号键按下, fuhao=0; // fuhao表征按下的是哪个符号 } void keyscan() // 键盘扫描程序 { P3=0xfe; if(P3!=0xfe) { delay(10); //延迟20ms if(P3!=0xfe) { temp=P3&0xf0; switch(temp) { case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; } } while(P3!=0xfe); if(num==0||num==1||num==2)//如果按下的是'7','8'或'9 { if(j==1)//确认一次计算完毕,清屏 { write_com(0x01);

12864LCD万年历

12864LCD+DS1302万年历设计proteus仿真 (2011-05-18 23:09:40) 标签: it 原理图 程序代码 //DS1302与12864设计的可调式电子日历与时钟// #include #include #include #define uchar unsigned char #define uint unsigned int extern void LCD_Initialize(); extern void Display_A_Char_8x16(ucharP,ucharL,uchar *M)reentrant; extern void Display_A_WORD(ucharP,ucharL,uchar *M)reentrant;

//在调整日期时间时,用该位决定是否反白显示// extern bit Reverse_Display; sbit SDA =P1^0; //DS1302数据线 sbit CLK =P1^1; //DS1302时钟线 sbit RST =P1^2; //DS1302复位线 sbit K1 =P3^4; //选择 sbit K2 =P3^5; //加 sbit K3 =P3^6; //减 sbit K4 =P3^7; //确定 uchartCount =0; //一年中每月的天数,2月的天数由年份决定 ucharMonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; //所读取的日期时间 ucharDateTime[7]; //当前调整的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6) //5对应星期,星期调节由年月日调整自动完成 char Adjust_Index=-1; //水平与垂直偏移 ucharH_Offset=10,V_Page_Offset=0; //年月日,星期,时分秒汉字点阵(16*16)------ uchar code DATE_TIME_WORDS[]= {/ / 0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00, / / 0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,

基于51单片机的万年历设计

目录 第一章绪论 (3) 第二章设计要求及设计框图 (4) 2.1 设计要求 (4) 2.2 设计框图 (4) 第三章知识要点 (4) 3.1 LMO16L液晶模块 (4) 3.1.1 LM016L引脚说明 (5) 3.1.2 控制指令 (5) 3.1.3 基于Proteus ISIS 7的液晶模块仿真 (6) 3.2 单片机A T89C51 (8) 3.2.1 主要特性 (8) 3.2.2 管脚说明 (9) 3.2.3 振荡器特性 (11) 3.2.4 芯片擦除 (11) 3.3 时钟芯片DS1302 (11) 3.3.1 DS1302的控制字节 (12) 3.3.2 数据输入输出(I/O) (12) 3.3.3 DS1302的寄存器 (12) 3.4 DS18B20数字温度传感器 (13) 3.4.1技术性能描述 (13) 3.4.2 DS18B20主要的数据部件 (14) 3.4.3 DS18B20温度处理过程 (15) 3.4.4 DS18B20的主要特性 (17) 3.4.5 DS18B20的外形和内部结构 (17) 3.4.6 DS18B20工作原理 (18) 3.4.7 DS18B20的应用电路 (21) 3.4.8 DS18B20使用中注意事项 (23) 第四章硬件设计 (24) 4.1 Proteus软件 (24) 4.1.1 Proteus软件介绍 (24) 4.1.2 功能特点 (24) 4.1.3 革命性的特点 (24) 4.1.4 基本操作 (25) 4.1.5 选择要使用的元件 (25) 4.1.6 功能模块 (26) 4.2 基于89C51的万年历与温度显示器的硬件设计 (28) 4.2.1 设计框图 (29) 4.2.2 电路原理图 (29) 4.3 元件清单 (30) 第五章软件设计 (30)

12864显示动态时钟

LCD1286显示模拟指针时钟 作者: 辅导老师: 摘要:现今,高精度的计时工具大多数都使用了石英体振荡器,于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式转动,用LCD12864显示器代替数码管显示时间,即减小了计时误差,又不失传统的指针风格。这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,灵活性好。本系统利用单片机实现数字时钟功能的主要内容,其中AT89C52是核心元件同时采用LCD12864显示模拟指针时钟的“时”,“分”,“秒”。它的计时周期为12小时,显满刻度为“11时59分59秒”,另外具有校时功能。 关键词:模拟指针时钟;12864;AT89C52; LCD1286 display the simulation pointer clock Abstract: today, high precision timing tool most used quartz oscillators, body in electric clock, quartz watch, quartz clocks are used quartz technology, so when the higher accuracy, good stability, easy to use, does not require constant adjustment, digital electric clock time with integrated circuit, decoding instead of mechanical rotation, with LCD12864 display instead of digital pipe display time, which reduced the timing error, and do not break the traditional pointer style. This table is, points, seconds show time function, and can be made, and the points when great flexibility. This system using the single chip microcomputer digital clock function of the main content, which is the core element and the AT89C52 LCD12864 display the simulation of the clock "" pointer," points ", "second". Its timing cycle for 12 hours, show when full scale for "11 59 points 59 seconds, in addition has the reset" function. Keywords: simulation pointer clock; 12864; AT89C52; 一、12864点阵液晶显示器的原理介绍 通常所说的12864LCD显示块是所说的点阵液晶显示模块,就是由128*64个液晶显示点组成的一个128列*64行的阵列,所以也就叫成了12864。每个显示点都对应着有一位二进制数,0表示灭,1表示亮。存储这些点阵信息的RAM 被称为显示数据存储器。如果要显示某个图形或汉字就是将相应的点阵信息写入到对应的存储单元中。图形或汉字的点阵信息是由自己设计,这时候问题的关键是显示点在液晶屏上的位置与其在存储器中的地址之间的关系。显示点在64*64液晶屏上的位置由列号(line,0~63)与行号(line,0~63)确定。512*8 bits RAM 中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。 由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。 如果点亮12864的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数单元中即点亮(20,30)上的液晶点。这是为了使液晶点位置信息与存储地址的对应关系更直

51单片机 实现计算器功能

51单片机多为计算器汇编程序 此程序并不仅仅局限于255以内操作 FIR0 EQU 30H FIR1 EQU 31H FIR2 EQU 32H FIR3 EQU 33H ;第一个操作数 SEC0 EQU 34H SEC1 EQU 35H SEC2 EQU 36H SEC3 EQU 37H ; 第二个操作数 LIN0 EQU 38H LIN1 EQU 39H LIN2 EQU 40H LIN3 EQU 41H ; 数据暂存 RES0 EQU 42H RES1 EQU 43H RES2 EQU 44H RES3 EQU 45H ;结果暂存区 XLINE EQU 46H YLINE EQU 47H ;记录按键按键位置 SYMBLE EQU 48H ;操作符存储 DDE0 EQU 49H DDE1 EQU 50H DDE2 EQU 51H ;用于延时 FLEL4 EQU 52H FLEL5 EQU 53H FLEL6 EQU 54H BEFOR EQU 55H HH BIT 01H ;比较大 EE BIT 02H ;比较相等 FIL BIT 03H ;溢出标记 FLAG BIT 04H ;有无按键标记 ERR BIT 05H ;错误标记 YESY BIT 06H ; 有无操作符按键标记

NUM BIT 07H ;按键个数标记 YESN BIT 08H ;有无数字按键标记 ORG 0000H LJMP MAIN ORG 0003H LJMP INTERUPT MAIN: MOV IE,#01H ;初始化 MOV SP,#6FH LCALL CLRI SETB IT0 SETB EA DISPLAY: ;数码管显示函数 CJNE R3,#00H,TT1 MOV R3,#0AH TT1: CJNE R3,#0AH,STARTD CJNE R2,#00H,TT2 MOV R2,#0AH TT2: CJNE R2,#0AH,STARTD CJNE R1,#00H,STARTD MOV R1,#0AH STARTD: MOV A,R0 LCALL TRANS ;将所要显示的值转化为数码管对应的数据 MOV P2,A MOV P1,#10H LCALL DELAY10ms MOV A,R1 LCALL TRANS MOV P2,A MOV P1,#20H LCALL DELAY10ms MOV A,R2 LCALL TRANS MOV P2,A MOV P1,#40H LCALL DELAY10ms

电子万年历

第一章绪论 1.1设计背景 从改革开放开始,电子工业已成为科技创新的重要领域,我国的电子产业也在新世纪开始高速发展,无论是产业结构,产业规模和技术水平都有了十分明显的进步和提升,而且电子产品在各个领域都有开创性的发展,使我们的生活变得更加智能化,为我国经济的发展做出了杰出的贡献。其中,单片机的大规模使用为我们的生活创造了极大的便利,可以说无时无刻不在影响着我们的生活。何为单片机,单片机全名为单片微控制器,它的结构组成就是将微型计算机的基本功能部件全都集成在一个半导体芯片上。尽管仅仅是一个芯片,但从单片机的构成和功能的角度来看充分具备一个计算机系统的中央处理功能。最重要的优点是,单片机体积小巧,可以任意嵌入到任何符合条件的应用系统中作为中央处理器进行指挥决策,是系统实现完全的智能化。当今世界,单片机已经无时无刻不在我们生活的周边存在,各类电子产品几乎都以单片机作为主控核心,通过单片机的控制使之更加智能快速,使我们的生活更加舒畅和方便。正是随着日常周边科学技术的进步,人们对待生活用品的要求也在逐步提高,时钟亦是如此,从古至今,人们对时间的概念就非常重视,从日晷到摆钟,经历了百年的发展,如今,人们对时钟的要求不仅仅是能够知道时间,还需要能够知道日期,星期,节气,天气情况等等,以便于满足人们对生活的各种需要,由此电子万年历就诞生了,正是因为电子万年历功能的多样性,使它在应用在各种场合,人们对它的需求量也就却来越大,电子万年历的发展空间也越来越广阔,成为了一项重要的产业。 1.2设计的目的及意义 中国从古至今就有重视时间的好传统,农民通过日照和鸡叫开始一天的劳作,商人通过古老的计时工具来确认是否应该开门迎客,学士知道时间后则开始一天的读书学习,这种传统一直绵延至今。当今社会,人们的生活节奏飞快,在工作中讲究快速和效率,需要在最短的时间内完成最合理的工作要求,所以人们通常需要在最短的时间内了解到最丰富的信息,人们不满足于只能看到此时此刻的时间信息,还需要了解过去和未来几天内的时间情况,包括农历,天

基于某51单片机地键盘盘可调万年历

开放性实验报告 题目: 基于80C51的万年历设计_ 院系:

专业班级: 学号: 姓名: 指导老师:________________________ 时间:2014年9月8号 摘要 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能。本系统选用DALLAS 公司生产的日历时钟芯片DS1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。该电路采用AT89C52单片机作为核心,用以5V电压供电。 本系统硬件部分由AT89C52单片机、DS1302时钟芯片、LCD1602液晶显示环境下以C51语言编写,包括时间设置、时间显示、时间修正等功能。在仿真的时候,以Proteus 与Keil uVision4软件为基础,编写了MCS-51单片机对LCD1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。

关键词:时钟芯片DS1302;单片机AT89C52;液晶显示1602;独立键盘等

目录 第1章绪论 (1) 1.1实时万年历的简介 (1) 1.2系统所实现的功能 (3) 第2章开发工具软件简介 (4) 2.1K EIL U V ISION4软件简介 (4) 2.2P ROTEUS软件简介 (4)

2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (5) 第3章LCD1602显示控制技术 (6) 3.11602字符型LCD简介 (6) 3.2LCD1602功能 (7) 3.3 LCD1602的指令说明及时序 (8) 3.4LCD1602的RAM地址映射及标准字库表 (7) 3.5 LCD1602的一般初始化(复位)过程 (8) 第4章系统硬件概况 (13) 4.1系统概况 (13) 4.2 MCS-51单片机最小系统模块 (14) 4.3 DS1302时钟芯片控制与键盘设置时间模块 (15) 4.4 LCD1602显示模块 (16) 第5章软件控制系统概况 (18) 5.1程序流程概况 (18) 5.2 流程图 (18) 5.3 源程序代码 (19) 参考文献 (25)

相关主题
文本预览
相关文档 最新文档