标题: 想用51数码管和定时器做一个时钟,但是显示一堆乱码,求大神指教 [打印本页]
作者: ahandsomeboy 时间: 2018-7-20 21:37
标题: 想用51数码管和定时器做一个时钟,但是显示一堆乱码,求大神指教
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//显示0~9和横杠的值
//10000000横杠,0x80。
void delay(u16 i)
{
while(i--);
}
void Timer0Init()//定时一秒,完成后进行中断
{
TMOD|=0X01;//0000 0001方式一
TH0=0X15; //给定时器赋初值,定时1s
TL0=0XA0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
u16 a=0,b=0,c=10,d=0,e=0,f=10,g=0,h=0;//使用八个数进行时钟数字确定
u16 l=0;
/*void xy()//消隐函数
{
delay(100);P0=0x00;
}*/
void display()
{
u8 j;
for(j=0;j<8;j++)
{
switch(j) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=smgduan[a] ;delay(1000);P0=0x00; break;//miao
case(1):
LSA=1;LSB=0;LSC=0; P0=smgduan[b];delay(100);P0=0x00;break;//
case(2):
LSA=0;LSB=1;LSC=0;P0=smgduan[c];delay(100);P0=0x00; break;//分割
case(3):
LSA=1;LSB=1;LSC=0; P0=smgduan[d];delay(100);P0=0x00;break;//分
case(4):
LSA=0;LSB=0;LSC=1; P0=smgduan[e];delay(100);P0=0x00;break;//
case(5):
LSA=1;LSB=0;LSC=1; P0=smgduan[f];delay(100);P0=0x00;break;//分割
case(6):
LSA=0;LSB=1;LSC=1; P0=smgduan[g];delay(100);P0=0x00;break;//shi
case(7):
LSA=1;LSB=1;LSC=1; P0=smgduan[h];delay(100);P0=0x00;break;//
}
}
}
void main()
{
Timer0Init(); //定时器0初始化
while (1);
}
void Timer0() interrupt 1//interrupt后面无括号
{//
static u16 i;
TH0=0X15;
TL0=0XA0;
i++;
if(i<10)
{//
a=i;
display();
}//
if(i>=10&&i<60)
{//
a=i%10;
b=i/10;
display();
}//
if(i>=60&&i<600)
{//
d=i/60;
b=(i-60*d)/10;
a=i-60*d-10*b;
display();
}//
if(i>=600&&i<3600)
{//
e=i/600;
d=(i-600*e)/60;
b=(i-600*e-60*d)/10;
a=i-600*e-60*d-10*b;
display();
}//
if(i>=3600&&i<39600)
{//
if(i>=36000)
{//
h=1;
l=36000;
} //
g=(i-l)/3600;
e=(i-l-3600*g)/600;
d=(i-l-3600*g-600*e)/60;
b=(i-l-3600*g-600*e-60*d)/10;
a=i-l-3600*g-600*e-60*d-10*b;
display();
}//点亮小时,十二小时制。
if(i==39600)
{i=0;display();}
}//
作者: wulin 时间: 2018-7-21 07:45
给你一个示例参考
//8位数码管时钟+闹钟
//K1键调整时间选择,K2键+,长按连+,K3键-,长按连-,K4键闹钟设置
//定时器初始化程序根据晶振频率选择
//用计数法代替软件延时,消除按键干扰其它程序
//数码管采用分时动态显示,2ms显示1位
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define key_S 300 //宏定义短按时间(约20ms)
#define key_L 6000 //宏定义长按时间(约2/3s)
#define key_M 3000 //宏定义长按间隔时间(约1/3s)
sbit K1 = P3^0; //时钟调整选择/退出
sbit K2 = P3^1; //++,长按连+
sbit K3 = P3^2; //--,长按连-
sbit K4 = P3^3; //闹钟调整选择/退出
sbit Buzzer=P2^5; //蜂鸣器
sbit led138c=P2^4; //38译码器位选
sbit led138b=P2^3; //38译码器位选
sbit led138a=P2^2; //38译码器位选
uchar code table[]={ //0~F数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint Cnt2ms; //定义2ms秒变量
uchar hour=0,min=0,sec=0; //定义时、分、秒变量
uchar hour_1=0,min_1=0; //定义闹钟时、分变量
uchar Choice=0,Choice_1=0; //调整走时的选择变量、设置闹钟的选择变量
bit Buzzer_sign; //蜂鸣器闹钟标志
bit Twinkle,second=1; //闪烁标志、秒标志
bit flag=0; //2ms数码管动态显示标志
/***************************************
定时器T0/T1初始化程序 @12MHz
***************************************/
/*
void Timer_Init()
{
TMOD = 0x21; //设置T0模式1,T1模式2
TL0 = 0x30; //设置定时初值2ms
TH0 = 0xF8; //设置定时初值2ms
TL1 = 0x06; //设置定时初值250微秒
TH1 = 0x06; //设置定时重载值250微秒
TR0 = 1; //定时器0开始计时
// TR1 = 1; //定时器1开始计时
EA=1; //开总中断
ET0=1; //开定时器1中断
ET1=1; //开定时器1中断
}*/
/***************************************
定时器T0/T1初始化程序 @11.0592MHz
***************************************/
void Timer_Init()
{
TMOD = 0x21; //设置T0模式1,T1模式2
TL0 = 0xCD; //设置定时初值2ms
TH0 = 0xF8; //设置定时初值2ms
TL1 = 0x1A; //设置定时初值250微秒
TH1 = 0x1A; //设置定时重载值250微秒
TR0 = 1; //定时器0开始计时
// TR1 = 1; //定时器1开始计时
EA=1; //开总中断
ET0=1; //开定时器1中断
ET1=1; //开定时器1中断
}
/*************************
按键扫描程序
*************************/
void key_scan()
{
static bit key1_sign,key4_sign; //按键自锁标志变量
static uint count1,count2,count3=0,count4=0;//消抖计数变量
if(!K1) //检测按键1按下
{
count1++; //消抖计数1自+1
if((count1>=key_S)&&(key1_sign==0))//检测消抖计数与按键1自锁标志
{
key1_sign=1; //按键1自锁标志置1
Choice++; //调整选择变量自+1
if(Choice>=4) //调整时间选择0正常走时,1调时,2调分,3调秒
{
Choice=0; //调整时间选择清0
Cnt2ms=0; //时间变量Cnt2ms清0
}
}
}
else
{
key1_sign=0; //按键1自锁标志清0
count1=0; //消抖计数count1清0
}
if(!K2)
{
count2++;
if(count2>=key_L) //长按快调
{
if(Choice==1) //选择变量1调时
{
hour++;
if(hour>=24)
hour=0;
}
if(Choice==2) //选择变量2调分
{
min++;
if(min>=60)
min=0;
}
if(Choice==3) //选择变量3调秒
{
sec++;
if(sec>=60)
sec=0;
}
if(Choice_1==1) //选择变量1调时
{
hour_1++;
if(hour_1>=24)
hour_1=0;
}
if(Choice_1==2) //选择变量2调分
{
min_1++;
if(min_1>=60)
min_1=0;
}
count2=key_M;
}
}
else //按键抬起
{
if(count2>key_S && count2<key_L)//短按
{
if(Choice==1) //选择变量1调时
{
hour++;
if(hour>=24)
hour=0;
}
if(Choice==2) //选择变量2调分
{
min++;
if(min>=60)
min=0;
}
if(Choice==3) //选择变量3调秒
{
sec++;
if(sec>=60)
sec=0;
}
if(Choice_1==1) //选择变量1调时
{
hour_1++;
if(hour_1>=24)
hour_1=0;
}
if(Choice_1==2) //选择变量2调分
{
min_1++;
if(min_1>=60)
min_1=0;
}
}
count2=0; //count2清0
}
if(!K3)
{
count3++;
if(count3>=key_L) //长按
{
if(Choice==1) //选择变量
{
hour--;
if(hour>=24)
hour=23;
}
if(Choice==2) //选择变量
{
min--;
if(min>=60)
min=59;
}
if(Choice==3) //选择变量
{
sec--;
if(sec>=60)
sec=59;
}
if(Choice_1==1) //选择变量
{
hour_1--;
if(hour_1>=24)
hour_1=23;
}
if(Choice_1==2) //选择变量
{
min_1--;
if(min_1>=60)
min_1=59;
}
count3=key_M;
}
}
else //按键抬起
{
if(count3>key_S && count3<key_L)//短按
{
if(Choice==1) //选择变量
{
hour--;
if(hour>=24)
hour=23;
}
if(Choice==2) //选择变量
{
min--;
if(min>=60)
min=59;
}
if(Choice==3) //选择变量
{
sec--;
if(sec>=60)
sec=59;
}
if(Choice_1==1) //选择变量
{
hour_1--;
if(hour_1>=24)
hour_1=23;
}
if(Choice_1==2) //选择变量
{
min_1--;
if(min_1>=60)
min_1=59;
}
}
count3=0; //count3清0
}
if(!K4) //检测按键1按下
{
count4++; //消抖计数1自+1
if((count4>=key_S)&&(key4_sign==0))//检测消抖计数与按键1自锁标志
{
key4_sign=1; //按键1自锁标志置1
Choice_1++; //调整选择变量自+1
if(Choice_1>=4) //调整闹钟时间选择0闹钟关闭,1调时,2调分,3开启闹钟
{
Choice_1=0; //调整时间选择清0
}
}
}
else
{
key4_sign=0; //按键1自锁标志清0
count4=0; //消抖计数count1清0
}
}
/********************************
数码管显示程序
********************************/
void display()
{
static uchar num=0; //分时显示变量
if(flag==1)
{
flag=0;
if((Choice_1>0)&&(Choice_1<3))//闹钟设置显示部分
{
switch(num)
{
case 0:
P0=0x00; //消隐
led138a=0;led138b=0;led138c=0;//时十位位码
P0=table[hour_1/10]; //时十位段码
num++;
break;
case 1:
P0=0x00; //消隐
led138a=1;led138b=0;led138c=0;//时个位位码
if((Twinkle==1)&&(Choice_1==1))//时点闪烁
P0=table[hour_1%10]|0x80;
else
P0=table[hour_1%10];//时个位段码+点
num++;
break;
case 2:
P0=0x00; //消隐
led138a=0;led138b=1;led138c=0;//-
P0=0x40; //-
num++;
break;
case 3:
P0=0x00; //消隐
led138a=1;led138b=1;led138c=0;//分十位位码
P0=table[min_1/10]; //分十位段码
num++;
break;
case 4:
P0=0x00; //消隐
led138a=0;led138b=0;led138c=1;//分个位位码
if((Twinkle==1)&&(Choice_1==2))//分点闪烁
P0=table[min_1%10]|0x80;
else
P0=table[min_1%10];//分个位段码+点
num++;
break;
case 5:
P0=0x00; //消隐
led138a=1;led138b=0;led138c=1;//-
P0=0x40; //-
num++;
break;
case 6:
P0=0x00; //消隐
led138a=0;led138b=1;led138c=1;//秒十位位码
P0=0x40; //秒十位段码
num++;
break;
case 7:
P0=0x00; //消隐
led138a=1;led138b=1;led138c=1;//秒个位位码
P0=0x40;//秒个位段码
num=0;
break;
}
}
else //正常走时显示部分
{
switch(num)
{
case 0:
P0=0x00; //消隐
led138a=0;led138b=0;led138c=0;//时十位位码
P0=table[hour/10]; //时十位段码
num++;
break;
case 1:
P0=0x00; //消隐
led138a=1;led138b=0;led138c=0;//时个位位码
if((Twinkle==1)&&(Choice==1))//时点闪烁
P0=table[hour%10]|0x80;
else
P0=table[hour%10];//时个位段码+点
num++;
break;
case 2:
P0=0x00; //消隐
led138a=0;led138b=1;led138c=0;//-
P0=0x40; //-
num++;
break;
case 3:
P0=0x00; //消隐
led138a=1;led138b=1;led138c=0;//分十位位码
P0=table[min/10]; //分十位段码
num++;
break;
case 4:
P0=0x00; //消隐
led138a=0;led138b=0;led138c=1;//分个位位码
if((Twinkle==1)&&(Choice==2))//分点闪烁
P0=table[min%10]|0x80;
else
P0=table[min%10];//分个位段码+点
num++;
break;
case 5:
P0=0x00; //消隐
led138a=1;led138b=0;led138c=1;//-
P0=0x40; //-
num++;
break;
case 6:
P0=0x00; //消隐
led138a=0;led138b=1;led138c=1;//秒十位位码
P0=table[sec/10]; //秒十位段码
num++;
break;
case 7:
P0=0x00; //消隐
led138a=1;led138b=1;led138c=1;//秒个位位码
if(Choice_1==3)
P0=table[sec%10]|0x80;//闹钟启动后秒个位+点
else if((Twinkle==1)&&(Choice==3))//秒点闪烁+点
P0=table[sec%10]|0x80;
else
P0=table[sec%10];//秒个位段码
num=0;
break;
}
}
}
}
/********************************
闹钟程序
********************************/
void Buzzer_nz()
{
if((Choice_1==3)&&(hour_1==hour)&&(min_1==min)&&(sec<30))
Buzzer_sign=1;
else Buzzer_sign=0;
if((second==1)&&(Buzzer_sign==1)) //计时周期1s
{
TR1 = 1; //定时器1开,蜂鸣器响一下
second=0; //定时周期1s变量清0
}
}
/********************************
主程序
********************************/
void main(void)
{
Timer_Init(); //初始化定时器
while(1)
{
key_scan(); //按键扫描
display(); //显示
Buzzer_nz(); //闹钟
}
}
/*-----------------------------
定时器0中断服务程序 2毫秒
------------------------------*/
void timer0() interrupt 1
{
TL0 = 0xCD; //设置定时初值2ms
TH0 = 0xF8; //设置定时初值2ms
Cnt2ms++; //时间变量Cnt2ms自+1
flag=1;
if((Cnt2ms>125 && Cnt2ms<250)||(Cnt2ms>375 && Cnt2ms<500))//闪烁频率2Hz
Twinkle=1; //闪烁标志
else Twinkle=0;
if(Cnt2ms>=500) //在此可以调整精度
{
Cnt2ms=0; //变量Cnt2ms清0
second=1;
if(Choice!=3) //调整选择变量为3停止走秒
sec++; //秒自+1
if(sec>=60) //如果秒>=60
{
sec=0; //秒清0
min++; //分自+1
if(min>=60) //分>=60
{
min=0; //分清0
hour++; //小时自+1
if(hour>=24) //小时>=24
hour=0; //小时清0
}
}
}
}
/*-----------------------------
定时器1中断服务程序 250微秒
(无源蜂鸣器驱动程序)
------------------------------*/
void timer1() interrupt 3
{
static uint count3=0; //中断计数变量
count3++; //中断计数变量count3自+1
Buzzer=~Buzzer; //蜂鸣器端口取反
if(count3>=500) //0.1秒时间到500
{
count3=0; //计数清0
Buzzer=1; //蜂鸣器端口清0
TR1 = 0; //定时器1关闭
}
}
作者: ahandsomeboy 时间: 2018-7-23 08:54
大佬能不能指点一下我的程序哪里错了。我是初学者,还达不到您发的程序的水平,表示看不大懂
作者: ahandsomeboy 时间: 2018-7-23 08:56
大佬求指教,我的程序哪里有问题啊
作者: wc86110 时间: 2018-7-23 15:32
还得看电路图呢,有时不一定是程序问题
作者: 般若丶泽伊 时间: 2018-7-23 16:44
厉害了
作者: hy1611192142 时间: 2018-7-23 19:36
DS1302时钟 与1602
#include"ds1302.h"
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};
/*******************************************************************************
* 函 数 名 : Ds1302Write
* 函数功能 : 向DS1302命令(地址+数据)
* 输 入 : addr,dat
* 输 出 : 无
*******************************************************************************/
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();
for (n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//传送数据结束
_nop_();
}
/*******************************************************************************
* 函 数 名 : Ds1302Read
* 函数功能 : 读取一个地址的数据
* 输 入 : addr
* 输 出 : dat
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
/*******************************************************************************
* 函 数 名 : Ds1302Init
* 函数功能 : 初始化DS1302.
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打开写保护功能
}
/*******************************************************************************
* 函 数 名 : Ds1302ReadTime
* 函数功能 : 读取时钟信息
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
作者: zl2168 时间: 2018-7-23 21:17
本帖最后由 zl2168 于 2018-7-23 22:10 编辑
实例94 模拟电子钟(由80C51定时器产生秒时基)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zhangting7954 时间: 2018-7-23 21:50
路过,学习
作者: ahandsomeboy 时间: 2018-7-23 22:20
懂了。我今天倒腾了一天终于弄出来了
作者: ahandsomeboy 时间: 2018-7-23 22:21
谢谢大佬。
作者: ahandsomeboy 时间: 2018-7-23 22:21
哈哈,志同道合,我今天该出程序来了。不会可以留言问我
作者: guangshi_wq 时间: 2018-7-24 09:57
楼主,你的程序简直是一堆乱码.在这里误人子弟,强烈谴责,再不要拿这样的东西请教别人.做好的东西也不拿出来让人学习,太自私了.你不公布,我公布;代码如下:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSD=P2^0;
sbit LSC=P2^1;
sbit LSB=P2^2;
sbit LSA=P2^3;
//u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//显示0~9和横杠的值//10000000横杠,0x80?
u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0xff};//最后两位是横和关锻
void delay(u16 i)
{
while(i--);
}
void delayms(u16 x) //改三处 //延时函数
{
u8 i;
while(x--)
{
for(i=50;i>0;i--); //改一处;
}
}
void Timer0Init()//定时一秒,完成后进行中断
{
TMOD|=0X01;//0000 0001方式一
TH0=0X15; //给定时器赋初值,定时1s
TL0=0XA0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
u8 a=0,b=11,c=11,d=11,e=11,f=0;
u16 l=0;
u16 i;
void display()
{
P0=smgduan[a];
LSA=1;delayms(3);LSA=0; delayms(0); //第一位数码关断时间
P0=smgduan[b];
LSB=1;delayms(3);LSB=0;delayms(0); //第二位数码关断时间
P0=smgduan[c];
LSC=1;delayms(3);LSC=0; delayms(0); //第一位数码关断时间
P0=smgduan[d];
LSD=1;delayms(3);LSD=0;delayms(0); //第二位数码关断时间
P0=smgduan[e];
LSE=1;delayms(3);LSE=0; delayms(0); //第一位数码关断时间
if(f!=0)
{
P0=0x7f;
LSC=1;delayms(3);LSC=0; delayms(0);//小数点;
}
delayms(3);
}
void main()
{
Timer0Init(); //定时器0初始化
while (1)display();
}
void Timer0() interrupt 1//interrupt后面无括号
{//
TH0=0X15;
TL0=0XA0;
i++;
if(i<10)
{//
a=i;
display();
}//
if(i>=10&&i<60)
{//
a=i%10;
b=i/10;
display();
}//
if(i>=60&&i<600)
{//
f=1;
c=i/60;
b=(i-60*c)/10;
a=i-60*c-10*b;
display();
}//
if(i>=600&&i<3600)
{//
f=1;
d=i/600;
c=(i-600*d)/60;
b=(i-600*d-60*c)/10;
a=i-600*d-60*c-10*b;
display();
}//
if(i>=3600&&i<39600)
{//
if(i>=36000)
{//
f=1;
l=36000;
} //
e=(i-l)/3600;
d=(i-l-3600*e)/600;
c=(i-l-3600*e-600*d)/60;
b=(i-l-3600*e-600*d-60*c)/10;
a=i-l-3600*e-600*d-60*c-10*b;
display();
}//点亮小时,十二小时制。
if(i==39600)
{i=0;display();}
}//
-
zhong.PNG
(23.66 KB, 下载次数: 48)
作者: ahandsomeboy 时间: 2018-7-24 15:42
多谢指教,我是新手,所以程序写的不是很好,抱歉,您的代码是不是有点小错误?额,还有代码不公布是因为他没要,不是自私,请注意用词,谢谢
我的代码公布如下:
#include "reg52.h"
typedef unsigned long u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//显示0~9和横杠的值
//01000000横杠,0x40。
void delay(u16 i)
{
while(i--);
}
void Timer0Init()//定时50ms秒,完成后进行中断
{
TMOD|=0X01;//0000 0001方式一
TH0=0x3C;//50ms
TL0=0xB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
u16 a=0,b=0,c=10,d=0,e=0,f=10,g=0,h=0;//使用八个数进行时钟数字确定
u16 l=0;
void display()
{
u8 j;
for(j=0;j<8;j++)
{
switch(j) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=smgduan[a] ;delay(100);P0=0x00; break;//miao
case(1):
LSA=1;LSB=0;LSC=0; P0=smgduan;delay(100);P0=0x00;break;//
case(2):
LSA=0;LSB=1;LSC=0;P0=smgduan[c];delay(100);P0=0x00; break;//分割
case(3):
LSA=1;LSB=1;LSC=0; P0=smgduan[d];delay(100);P0=0x00;break;//分
case(4):
LSA=0;LSB=0;LSC=1; P0=smgduan[e];delay(100);P0=0x00;break;//
case(5):
LSA=1;LSB=0;LSC=1; P0=smgduan[f];delay(100);P0=0x00;break;//分割
case(6):
LSA=0;LSB=1;LSC=1; P0=smgduan[g];delay(100);P0=0x00;break;//shi
case(7):
LSA=1;LSB=1;LSC=1; P0=smgduan[h];delay(100);P0=0x00;break;//
}
}
}
void main()
{
//display();显示00-00-00
Timer0Init(); //定时器0初始化
while (1);
}
void Timer0() interrupt 1//interrupt后面无括号
{//
static u16 i;
TH0=0x3C;//50ms
TL0=0xB0;
i++;
if(i<200)
{
a=i/20;
display();
}
else if(i>=200&&i<1200)
{
a=(i/20)%10;
b=i/200;
display();
}
else if (i>=1200&&i<12000)
{
d=i/1200;
b=(i-1200*d)/200;
a=(i-1200*d-200*b)/20;
display();
}
else if(i>=12000&&i<72000)
{
e=i/12000;
d=(i-12000*e)/1200;
b=(i-12000*e-1200*d)/200;
a=(i-12000*e-1200*d-200*b)/20;
display();
}
else if (i>=72000&&i<720000)
{
g=i/72000;
e=(i-72000*g)/12000;
d=(i-72000*g-12000*e)/1200;
b=(i-72000*g-12000*e-1200*d)/200;
a=(i-72000*g-12000*e-1200*d-200*b)/20;
display();
}
else if(i>=720000&&i<1728000)
{
h=i/720000;
g=(i-720000*h)/72000;
e=(i-720000*h-72000*g)/12000;
d=(i-720000*h-72000*g-12000*e)/1200;
b=(i-720000*h-72000*g-12000*e-1200*d)/200;
a=(i-720000*h-72000*g-12000*e-1200*d-200*b)/20;
display();
}
else
{
i=0;
a=b=d=e=g=0;
}
}//
作者: ahandsomeboy 时间: 2018-7-24 15:43
好的谢谢,我已经写出来了
作者: jdddd 时间: 2018-7-24 20:53
看一下数码管是共阴的还是共阳的,然后看看程序。
作者: fei123 时间: 2018-7-24 21:20
haode,谢谢,我已经写出来了
作者: guangshi_wq 时间: 2018-7-28 17:09
不好意思哈,当时改你的程序的时候,改来改去,头都大了.心情不好,对不起了,向你道歉.后来最自己重新弄了一个,时间仓促有点BUG,留着别人研究一下.让别人也改改吧.
作者: lyt110 时间: 2018-7-28 18:22
路过,学习,仰望一下
作者: ahandsomeboy 时间: 2018-7-30 15:20
恩恩,没关系,您能帮我我已经很感激了,我的代码质量确实有待提高,多谢建议!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |