找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5880|回复: 0
打印 上一主题 下一主题
收起左侧

单片机数码管显示倒计时程序+电路等资料

[复制链接]
跳转到指定楼层
楼主

一、实验目的
1、掌握数码管显示原理
2、理解中断系统的工作原理
3、学会数码管显示和中断系统结合使用
二、实验步骤
1、连接线路:
USB转串口与电脑连接
电源模块与电脑连接
将单片机的IO(P0)口与开发板的P7连接
P1口与流水灯(开发板插针p1)用一根导线连接
2、使用keil uvison4软件编写、编译程序
①新建工程:
点击“Project”菜单选择“New uVision Project”选项后填写新建立的工程名(流水灯)后保存到某个文件夹下,在弹出的对话框里选择MCU型号(此处我们选STC公司的STC89C52),右边Description列表框中显示MCU的基本说明,单击“OK”按钮。
②设置工程:
右击窗口左侧“Target 1”,在弹出的快捷菜单中点击“Options  for ‘Target  1’”命令,在弹出的对话框中点击“Output”选项卡,在“Create HEX  File”选项前的方框内打勾 (输出HEX文件),单击“Ok”结束。选中‘Target’选项,修改Xtal(MHZ) 为11.0592。
③新建源程序文件:
选“File”下拉菜单中的“New”命令,打开程序编辑窗口输入编辑源程序(流水灯.c),然后单击工具栏的“保存”按钮保存文件(汇编源程序:文件名.asm; C源程序:文件名.c)。
④为工程添加源文件:
单击“Target 1”前面的+号,展开里面的内容“Source Group 1”;右击“Source  Group  1”,在弹出的快捷菜单中选择“Add Files to Group ‘Source Group 1’”命令;选择刚才的文件,文件类型选择“C Source file(*.c)”,单击“Add”按钮后点击“Close”按钮。
⑤下载、调试:
编译成功后,用串口助手将.HEX文件下载到单片机内部ROM中运行,在运行过程中若发现错误要重新修改程序,并编译后再下载运行。
3、程序下载   
①打开串口下载软件,“MCU Type”下拉菜单下选择MCU的类型,此处选择“STC89C5X、RD+”系列的“STC89C52RC”;
②点击“打开程序文件”按钮,找到MCU运行的“HEX”文件所在的文件夹,打开该“HEX”文件;
③在COM下拉菜单中找到安装的串口标号,各个USB口的串口标号不同,具体标号需要查询;其它选项选择默认(但是第一次下载失败,因为波特率太高了,把最高波特率改为4800后就操作成功了);
④点击“Down/下载”按钮,关掉开发板电源,然后稍等片刻打开电源(冷启动),等待下载完成即可。
三、拓展任务
·拓展功能:左边第一个数码管进行九秒倒计时,结束后数码管灭,一个LED灯亮。
程序代码实现:
#include<reg51.h>
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
sbit LATCH2=P2^7;//                 位锁存
unsigned char code dofly_DuanMa[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
// 显示段码值01234567
unsigned char code dofly_WeiMa[]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe};
//分别对应相应的数码管点亮,即位码

char  i=20;
unsigned char j=0;

void main ()
{
        TMOD=0x01;                        //定时器T0为方式1
        TH0=0x4c;                        //设置定时器初值
        TL0=0x00;
         DataPort=dofly_WeiMa[j]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;
       DataPort=dofly_DuanMa[j]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;

        EA=1;                                        //总中断开
        ET0=1;                                        //开T0中断
        TR0=1;                                        //启动T0
        while(1);                                //循环等待
        {
                ;
        }
}
void timer0() interrupt 1                        //T0中断程序
{
        TH0=0x4c;                                //重新赋初值
        TL0=0x00;
        i--;                                        //循环次数减1
        if(i<=0)
        {

DataPort=dofly_WeiMa[j+1]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;
       DataPort=dofly_DuanMa[j+1]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
j++;
           if(10==j){
               P1=0xfe;
}


                i=20;                                //重置循环次数
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表