文档库 最新最全的文档下载
当前位置:文档库 › 单片机实训源代码

单片机实训源代码

此次实训内容程序包括:
1、从右至左依次递增动态显示
2、电子时钟+调时+闹钟
1、从右至左依次递增动态显示



2、电子时钟+调时+闹钟程序
#include "reg52.h" //预处理命令
#include "intrins.h"
#define uchar unsigned char //定义
#define uint unsigned int
uchar code DSY_CODE[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80}; //段码
uchar dispbuf[6]={0,0,0,0,0,0}; //待显示的六位缓冲
uchar second=51,minite=59,hour=23; //定义变量,赋初值。按键计时单元。
uchar t_second=12,t_minite=1,t_hour=1; //闹钟计时单元
uint i;
sbit K1=P2^0; //定义K1,K2,K3,K4,K5的地址为P2.0—P2.4
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^4; //设置闹钟时间
sbit K5=P2^5; //启动闹钟
sbit BEEL=P2^7; //定义蜂鸣器,地址为P2^7
void DelayMS(uchar ms); //延时函数
void Display(); //显示函数
void set_time(); //闹钟调试函数
void adjust_time(); //按键调试函数

void set_time() //闹钟调试函数
{

if(K2==0) //判断K2是否等于0时,运行显示函数
{
Display();
if(K2==0) //当K2=0时,按下K2,闹钟的分增加,当加到60时归0,时增1;
{
t_minite++;
if(t_minite==60)
{
t_minite=0;
}
dispbuf[2]=(t_minite%10); //进入缓存区,取分的低位
dispbuf[3]=(t_minite/10); //进入缓存区,取分的高位
while(K2==0) //只要K2==0,运行显示函数
Display(); ;
}
}
if(K3==0) //判断K3是否等于0时,运行显示函数
{
Display();
if(K3==0) //当K3=0时,按下K3,闹钟的分增加,当加到24时归0,继续自增
{
t_hour++;;
if(t_hour==24)
{
t_hour=0;
}
dispbuf[4]=(t_hour%10); //进入缓存区,取时的低位
dispbuf[5]=(t_hour/10); //进入缓存区,取时的高位
while(K3==0) //只要K3==0,运行显示函数
Display();;
}
}
}
void adjust_time() //时间调整函数
{
if(K1==0) //判断K1是否等于0时,运行显示函数
{
Display();;
if(K1==0) //当K1=0时,按下K1,显示的秒增加,当加到60时归0,分增1;
{
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10; //进入缓存区,取秒的低位
dispbuf[1]=second/10; //进入缓存区,取秒的高位
while(K1==0) //只要K1==0,运行显示函数
Display();;
}
}
if(K2==0) //判断K2是否等于0时,运行显示函数
{
Display();;
if(K2==0) //当K2=0时,按下K2分增加,当加到60时归0,时增1;
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[2]=minite%10; //进入缓存区,取分的

低位
dispbuf[3]=minite/10; //进入缓存区,取分的高位
while(K2==0) //只要K2==0,运行显示函数
Display();;
}
}
if(K3==0) //判断K3是否等于0时,运行显示函数
{
Display();;
if(K3==0) //当K3=0时,按下K3,时增加,当加到60时归0;
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[4]=hour%10; //进入缓存区,取时的低位
dispbuf[5]=hour/10; //进入缓存区,取时的高位
while(K3==0) //只要K3==0,运行显示函数
Display();;
}
}
}
void DelayMS(uchar ms) //延时函数
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
void t0(void) interrupt 1 //T0中断服务
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256; //恢复定时器T0的初值
i=i+1; //中断产生秒
if(i==4000)
{
i=0;
second++;
if(second==60) //秒=60,秒清零,分增一
{
second=0;
minite++;
if(minite==60) //分=60,分清零,时增一
{
minite=0;
hour++;
if(hour==24) //时=24,时清零
{
hour=0;
}
}
}
if(K4==1) //如果K4=1,运行调试显示函数
{
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
dispbuf[4]=hour%10;
dispbuf[5]=hour/10;
}
else //否则,运行闹钟调试函数
{
dispbuf[0]=t_second%10;
dispbuf[1]=t_second/10;
dispbuf[2]=t_minite%10;
dispbuf[3]=t_minite/10;
dispbuf[4]=t_hour%10;
dispbuf[5]=t_hour/10;
}
if(t_minite==minite&t_hour==hour&&K5!=0) //如果闹钟调试的分钟=按键调试的分钟且闹钟调试的时钟=按键调试的时钟且K5!=0;蜂鸣器响
BEEL=~BEEL;
else //否则,蜂鸣器不响
BEEL=0;
}
}
void Display() //显示函数
{
uchar i=0,wei=0xfe; //定义数值类型,wei的初值为11111110
for(i=0;i<6;i++) //显示时—分—秒格式
{
P1=0xff; //P1口置1
P0=DSY_CODE[dispbuf[i]]; //发送段码
P1=wei; //发送位码
wei=_crol_(wei,1); //位右移
DelayMS(2); //延时
i++;
P1=0xff; //发送段码
P0=DSY_CODE[dispbuf[i]]; //发送位码
P1=wei;
wei=_crol_(wei,1); //位右移
DelayMS(2); //延时
if(i<5)
{
P1=0xff; //P1口置1
P0=0x40;
P1=wei;
wei=_crol_(wei,1);
DelayMS(2);
}
}
}
void main(void) //主函数
{
TMOD=0x02;

//T0工作方式2
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1; //启用定时器0计时
ET0=1;
EA=1; //总中断
K4=1; //K4,K5置1
K5=1;
while(1) //死循环
{
while(K4==1) //K4=1时,调用调时函数以及显示函数
{
adjust_time();
Display();
}
while(K4==0) //K4=0时,调用闹钟调试函数以及显示函数
{
set_time();
Display();
}
}
}

相关文档
相关文档 最新文档