标题:
数码管多功能时钟程序资料(附仿真文件电路图使用说明)
[打印本页]
作者:
51mcu
时间:
2017-5-28 09:44
标题:
数码管多功能时钟程序资料(附仿真文件电路图使用说明)
这是一款多功能数码管时钟程序资料,单片机是AT89C51,6位数码管显示、DS1302时钟、DS18B20温度测量。时间,温度可以交替显示。附件中含涛程序,仿真文件,使用说明,电路图等资料下载:
6位数码管显示DS1302时钟DS18B20温度仿真及C语言程序.zip
(1.15 MB, 下载次数: 46)
2017-5-28 09:42 上传
点击文件名下载附件
下载积分: 黑币 -5
下面是仿真效果图:
测温仿真.jpg
(253.35 KB, 下载次数: 75)
下载附件
数码管时钟
2017-5-28 09:40 上传
时钟仿真.jpg
(252.45 KB, 下载次数: 93)
下载附件
数码管时钟
2017-5-28 09:40 上传
程序标注简洁明了。比较适合初学者下载学习。
include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dis_bit1=P2^7;//定义数码管控制口
sbit dis_bit2=P2^6;//定义数码管控制口
sbit dis_bit3=P2^4;//定义数码管控制口
sbit dis_bit4=P2^3;//定义数码管控制口
sbit dis_bit5=P2^1;//定义数码管控制口
sbit dis_bit6=P2^0;//定义数码管控制口
sbit led1_bit=P2^2;//定时LED的控制口
sbit led2_bit=P2^5;//定时LED的控制口
sbit s1_bit=P1^0; //定义S1控制口
sbit s2_bit=P1^1; //定义S2控制口
sbit s3_bit=P1^2; //定义S3控制口
sbit dq_ds18b20=P3^3;//定义控制DS18B20
sbit speak=P3^7; //定义蜂鸣器控制口
sbit clk_ds1302=P3^6;//定义控制DS1302的时钟线
sbit io_ds1302=P3^5;//定义控制DS1302的串行数据
sbit rest_ds1302=P3^4;
#define smg_data P0//定义数码管数据口
void delay_3us();//3US的延时程序
void delay_8us(uint t);//8US延时基准程序
void delay_50us(uint t);//延时50*T微妙函数的声明
void display1(uchar dis_data);//数码管1显示子程序
void display2(uchar dis_data);//数码管2显示子程序
void display3(uchar dis_data);//数码管3显示子程序
void display4(uchar dis_data);//数码管4显示子程序
void display5(uchar dis_data);//数码管5显示子程序
void display6(uchar dis_data);//数码管6显示子程序
void init_t0();//定时器0初始化函数
void dis_led();//LED处理函数
void judge_s1();//S1按键处理函数
void judge_s2();//S2按键处理函数
void judge_s3();//S3按键处理函数
void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//显示子程序
void dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//闪烁显示子程序
void judge_dis();//显示处理函数
void judge_clock();//显示处理函数
void set_ds1302();//设置时间
void get_ds1302();//读取当前时间
void w_1byte_ds1302(uchar t);//向DS1302写一个字节的数据
uchar r_1byte_ds1302();//从DS1302读一个字节的数据
//***********************************************************************
//DS18B20测温函数定义
void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节
uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据
void rest_ds18b20(void);//DS18B20复位程序
void readtemp_ds18b20(void);//读取温度
void dis_temp();//温度显示函数
//共阳数码管断码表
const uchar tabl1[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
// 0 1 2 3 4 5
0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
//6 7 8 9 E T B
0xc6,0xbf,0xff};
// C -
const uchar tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar t0_crycle;
uchar hour_count,minute_count,second_count,msecond_count;
uchar clock_hour,clock_minute;
uchar countdown_second;
uchar countdown_hour,countdown_minute;
uchar clock_en;//闹钟关闭和开启的标志,1开启,0关闭
uchar flag1,second_flag,zancun1,zancun2,zancun3;
uchar zancun4,zancun5,zancun6,zancun7;
uchar clock_flag,countdown_flag;
uchar msecond_minute,msecond_second,msecond_msecond,msecond_flag;//秒表相关参数
uint speak_count;
uchar templ,temph,temp_flag;
uchar t_b,t_s,t_g,t_x,temp_flag2;//从左到右分别存储温度百位,十位,个位,小数位
uchar tab23[3];//={0x40,0x59,0x23,0x28,0x11,0x06,0x09};//上电时默认的时间
//主程序
void main()
{
P3=0x00;
flag1=0;
zancun3=0;
msecond_minute=0;//置秒表相关参数为0
msecond_second=0;
msecond_msecond=0;
speak=1;//关闭蜂鸣器
speak_count=0;
clock_hour=0;
clock_minute=0;
clock_flag=0;
countdown_flag=0;//倒计时标志位为0
clock_en=0;//开机时默认关闭闹钟
init_t0();
TR0=1;//
// set_ds1302();//设置DS1302的初始时间
//接下来开始编写让数码管显示的程序
while(1)
{
get_ds1302();
judge_dis();//显示处理
judge_s1();
judge_s2();
judge_s3();
judge_clock();//闹钟处理程序
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_crycle++;
if(t0_crycle==2)// 0.1秒
{
t0_crycle=0;
msecond_flag=1;
msecond_count++;
if(msecond_count==10)//1秒
{
msecond_count=0;
second_flag=1;
}
}
}
//**************************************************
//显示处理函数
void judge_dis()
{
if(flag1==0)
{
if(second_flag==1)
{
zancun7++;
second_flag=0;
}
if(zancun7<1)
{
if(temp_flag2==1)
{
readtemp_ds18b20();//读取温度
temp_flag2=0;
}
dis_temp();//温度显示函数
}
if(zancun7>=1)
{
temp_flag2=1;
zancun4=hour_count&0xf0;
zancun4>>=4;
zancun5=minute_count&0xf0;
zancun5>>=4;
zancun6=second_count&0xf0;
zancun6>>=4;
dis(zancun4,hour_count&0x0f,zancun5,minute_count&0x0f,zancun6,second_count&0x0f);
dis_led();
if(zancun7==5)zancun7=0;
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1