搜索
bottom↓
回复: 2

突击写个8051的秒表程序,各位大神来指点一下

[复制链接]

出0入0汤圆

发表于 2013-5-7 00:44:32 | 显示全部楼层 |阅读模式
本帖最后由 3DA502 于 2013-5-7 00:49 编辑

写这个程序的原因听起来很不像话,我高中同学上了研究生,老师给他布置一道作业,使用89s52和8255,搭建一个4位数码管的秒表。
秒表有一个按键,按一下开始,再按停止,再按清零,再按就又开始了。我好久没有用keil的C51编译器,也懒得安装,随手写个程序没法
编译,所以放出来让大家帮忙看看,顺便给评个分啊亲

电路很简单,8255的管脚驱动LED数码管,按键接到外部中断0,如有哪位爱好学习的同学帮忙画个protues的仿真图就太好了。

/************************************************************************************************
**
************************************************************************************************/
#include <reg52.h>
#include <absacc.h>
/************************************************************************************************
**
************************************************************************************************/
#define PORTA  (*((unsigned char *)0x8000)) /* 0x8000映射到8255的PORTA*/
#define PORTB  (*((unsigned char *)0x8001))
#define PORTC  (*((unsigned char *)0x8002))
#define CONTROL  (*((unsigned char *)0x8003))/* 0x8000映射到8255的控制字 */

/************************************************************************************************
**
************************************************************************************************/
unsigned int Second_Count;
unsigned char Step; /* 秒计数的累加步进值,为0时停止走秒*/

/************************************************************************************************
** 状态机相关变量
************************************************************************************************/
unsigned char StateChange_Flag;
unsigned char State;

/************************************************************************************************
** 显示相关变量
************************************************************************************************/
const unsigned char LED_MODE[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 放LED字模 0~9*/
const unsigned char LED_DIGTAL_SELECT[4] = {1, 2, 4, 8}; /* 放LED位选通 */

unsigned char Display_Buff[4] ; /* 放LED 的10进制字 */
/************************************************************************************************
** 定时器初始化
************************************************************************************************/
void initTimer (void) {
        
    TMOD=0x0;
    TH1=0x83;
    TL1=0x0;
    TR1=1;/* 边沿中断*/
    ET1=1;/* 外部中断允许*/
    EA=1;
}
/************************************************************************************************
** 定时器中断线程 4ms执行一次
************************************************************************************************/
void timer1(void) interrupt3 {
   
    static int FourMS_Count;
    static char Scan_Count;
    char i;
   
     TH1=0x83;
     TL1=0x0; /* Timer reload*/
   
     Scan_Count += 1;
     Scan_Count %= 4;
   
     FourMS_Count += 1;/* every 4ms +1*/
   
    if (FourMS_Count == 1000/4) {
        FourMS_Count = 0;
        Second_Count += Step;
        Display_Buff[0] = Second_Count % 10;
        Display_Buff[1] = (Second_Count % 100)/10;
        Display_Buff[2] = (Second_Count % 1000)/100;
        Display_Buff[3] = Second_Count / 1000;
    }   

    PORTA = 0x00;
    i = Display_Buff[Scan_Count];
    PORTB = GigtalLED[Scan_Count];
    PORTA = SevenSegLED;

}
/************************************************************************************************
** 按键中断
************************************************************************************************/
void int0(void) interrupt 0 {
   
    /* 管脚中断 检测按键 使用硬件消除抖动 */
    State += 1;
    if(State >= 4) {
        State = 1;
    }
    StateChange_Flag = 0;/* 触发状态转换的标志 */
    EX0 = 0;/* Disable the extera interrupt */
   
}
/************************************************************************************************
** 主程序
************************************************************************************************/
void main(void)
{
    IT0=1;
    EX0=1;
    initTimer();
    CONTROL = 0x00;
    StateChange_Flag = 1;

    while(1) {
        
        switch(State) {
            case 0:
                step = 0;
                Second_Count = 0;
                break;
            case 1:
                step = 1;
                break;
            case 2:
                step = 0;
                break;
            case 3:
                step = 0;
                Second_Count = 0;
                break;
            default:
                break;
               
        }
         EX0 = 1;/* 开启中断,响应按键*/
        while(StateChange_Flag);
        
    }

}
/************************************************************************************************
** END
************************************************************************************************/

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-5-7 08:50:58 | 显示全部楼层
本帖最后由 3DA502 于 2013-5-7 14:10 编辑

自从工作以后,我再也不鄙视学电子的但是啥都不会的同学和朋友了,现在非常后悔自己除了技术外别的什么东西都不会

出0入0汤圆

发表于 2013-5-7 19:01:07 | 显示全部楼层
继续学呀~~~~~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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