好文档 - 专业文书写作范文服务资料分享网站

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

天下 分享 时间: 加入收藏 我要投稿 点赞

单片机实训报告

static uchar count = 0;

static uchar flag = 0; //记录鸣叫的次数 count = 0;

TR0 = 0; //关闭Timer0 TH0 = 0x3c;

TL0 = 0XB0; //延时 50 ms TR0 = 1 ; //启动Timer0 count ++;

if( count == 20 ) //鸣叫 1 秒 {

bell = ~ bell; count = 0; flag ++; }

if( flag == 6 ) {

flag = 0;

TR0 = 0; //关闭Timer0 } }

/******************************************************************** 中断服务程序 整点报时 一分钟

********************************************************************/ uchar HexNum_Convert(uchar HexNum)//将16进制数转换成十进制数 {

uchar Numtemp;

Numtemp=(HexNum>>4)*10+(HexNum&0X0F); return Numtemp; }

/******************************************************************** * 函数名称:main() * 功 能: * 入口参数: * 出口参数:

********************************************************************/ void main( void ) {

uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定义时间变量 秒 分 时 日 月 年

uchar alarm_time[2] = { 10, 06}; //闹钟设置 alarm_time[0]: 分钟 alarm_time[1] :小时

uchar temperature[2]; //定义温度变量 temperature[0] 低8位 temperature[1] 高8位

- 9 -

单片机实训报告

Lcd_Initial(); //LCD初始化

Clock_Fresh( clock_time ); //时间刷新

Clock_Initial( clock_time ); //时钟初试化

/***********************中断初始化***************************/ EA = 1; //开总中断

ET0 = 1; //Timer0 开中断 ET2 = 1; //Timer2 开中断

TMOD = 0x01 ; //Timer0 工作方式 1 RCAP2H = 0x3c;

RCAP2L = 0xb0; //Timer2 延时 50 ms while( 1 ) {

switch( Key_Scan() ) //按键扫描 {

case up_array: {

Key_Idle(); //检测按键松开 }

break; case down_array: {

Key_Idle(); //检测按键松开 }

break; case clear_array: {

Key_Idle(); //检测按键松开 } break; case function_array:{

Key_Function( clock_time, alarm_time );

} case null: {

Clock_Fresh( clock_time ); //时间刷新 Lcd_Clock( clock_time ); //时间显示

Sensor_Fresh( temperature ); //温度更新 Lcd_Temperture( temperature ); //温度显示

Calendar_Convert( 0 , clock_time ); Week_Convert( 0, clock_time );

- 10 -

单片机实训报告

//整点报时

if( ( * clock_time == 0x59 ) && ( * ( clock_time + 1 ) == 0x59 ) ) {

bell = 0;

TR2 = 1; //启动Timer2 }//闹钟报警

if( * alarm_time == HexNum_Convert(* ( clock_time + 1 ) ))//分钟相吻if( * ( alarm_time + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小时相吻合

{

bell = 0;

TR2 = 1; //启动Timer2 } } break; } } }

2. 温度控制程序

#ifndef _SENSOR #define _SENSOR

#define uchar unsigned char #define uint unsigned int

/***************DS18B20管脚配置*******/ sbit dq = P2 ^ 1;

/********************************************************************DS18B20软件延时专用

********************************************************************/ void Sensor_Delay(uchar count)//延时函数 {

while(count--); }

/********************************************************************从DS18B20读一个字节

********************************************************************/ uchar Sensor_Read_Byte(void) {

uchar i = 0; uchar temp = 0; for(i=8;i>0;i--) {

dq = 0; // 给脉冲信号 temp >>= 1;

dq = 1; // 给脉冲信号

- 11 -

单片机实训报告

if(dq)

temp |= 0x80; Sensor_Delay(20); }

return (temp); }

/********************************************************************向DS18B20写一个字节

********************************************************************/ void Sensor_Write_Byte(uchar temp) {

uchar i = 0;

for(i=8;i>0;i--) {

dq = 0;

dq = temp&0x01; Sensor_Delay(20); dq = 1; temp>>=1; } }

/******************************************************************** DS18B20初始化

********************************************************************/ uchar Sensor_Initial(void) {

uchar i = 0;

dq = 1; // DQ复位 Sensor_Delay(1); // 稍做延时

dq = 0; // 单片机将DQ拉低 Sensor_Delay(100); // 精确延时,大于480us

dq = 1; // 拉高总线 Sensor_Delay(6); // 稍做延时后 i = dq; // 若x=0则初始化成功,若x=1则初始化失败 Sensor_Delay(130); return (~i); }

/******************************************************************** 读取并显示温度

********************************************************************/ void Sensor_Fresh(uchar * temperature )

- 12 -

单片机实训报告

{

Sensor_Initial();

Sensor_Write_Byte( 0xCC ); // 跳过读序号列号的操作 Sensor_Write_Byte( 0x44 ); // 启动温度转换 Sensor_Initial();

Sensor_Write_Byte( 0xCC ); // 跳过读序号列号的操作 Sensor_Write_Byte( 0xBE ); // 读取温度寄存器 temperature [0] = Sensor_Read_Byte(); //低位 temperature [1] = Sensor_Read_Byte(); //高位 }#endif

3. 日历设置程序

#ifndef _SUN_MOON #define _SUN_MOON

/*************************************************************************/

#define uchar unsigned char #define uint unsigned int #include < shezhi.h > #include < lcd.h >

/******************************************************************** * 功能: 读取数据表中农历的大月或小月 ,如果大月返回1, 小月返回0

********************************************************************/ bit get_moon_day( uchar month_p,uint calendar_address ) {

uchar temp,temp1;

temp1=(month_p+3)/8;

temp=0x80>>((month_p+3)%8);

temp=year_code[calendar_address+temp1]&temp; if(temp==0){return(0);}else{return(1);} }

/******************************************************************** * 功能: 输入BCD的阳历数据, 输出BCD阴历数据( 1901 - 2099 ) c_flag:阳历的世纪标志 clock_time: 时钟地址 * 说明: c_flag = 0 :21世纪 c_flag = 1 :19世纪

********************************************************************/ void Calendar_Convert( uchar c_flag, uchar * clock_time ) {

bit flag_month, flag_year;

uchar year, month, day, month_point; //定义 年 月 天 uchar temp1, temp2, temp3;

uint calendar_address; //定义农历地址 uint day_number;

- 13 -

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

单片机实训报告staticucharcount=0;staticucharflag=0;//记录鸣叫的次数count=0;TR0=0;//关闭Timer0TH0=0x3c;TL0=0XB0;//延时50msTR0=1;
推荐度:
点击下载文档文档为doc格式
08wxw495wc3ibqw7s1xb7s7tu43p3900tsi
领取福利

微信扫码领取福利

微信扫码分享