3221|8

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大家帮我看看这段程序有什么问题? [复制链接]

这是个基于单片机的四人抢答器,程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit sp=P2^3;
uchar num,temp,flag1=0,flag2=0;
int flag=10;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
void delay(uint xms)                        //延时函数
{
        uint a,b;
        for(a=xms;a>0;a--)
                for(b=110;b>0;b--);
}
void beep(uint a)                                        //蜂鸣器函数,xms设置蜂鸣器报警的时间
{
        sp=0;
        delay(a);
        sp=1;
}
void display(uchar a)                                //显示选手编号函数
{
        dula=1;
        P0=table[a];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(10);       
}
void dis10()                                                //十秒倒计时显示函数
{
        int a;
        a=flag%10;
        dula=1;
        P0=table[a];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
}
void clear()                                                //数码管初始化显示0函数
{
        dula=1;
        P0=table[0];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(5);
}
void keyscan()                                                //选手键盘扫描程序,检测是否有选手抢答
{
        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
            delay(10);
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:TR0=0;display(1);flag2=0;beep(500);break;
                                case 0xdd:TR0=0;display(2);flag2=0;beep(500);break;
                                case 0xbd:TR0=0;display(3);flag2=0;beep(500);break;
                                case 0x7d:TR0=0;display(4);flag2=0;beep(500);break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        ET0=0;
                }
        }
}
void main()
{
        while(1)
        {
                TMOD=0x01;                                                //设置定时器0工作方式1
                TH0=(65536-45872)/256;
                TL0=(65536-45872)%256;
                EA=1;
                ET0=1;
                P3=0xfe;                                        //判断主持人是否按下清零键
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        delay(10);
                        temp=P3;
                        temp=temp&0xf0;
                        if(temp!=0xf0)
                        {
                                temp=P3;
                                if(temp==0xee)
                                {
                                        flag1=1;
                                }
                                if(flag1==1)               
                                {
                                        flag1=0;
                                        clear();                //按下清零则显示初始值0
                                        temp=P3;
                                        temp=temp&0xf0;
                                        if(temp!=0xf0)
                                        {
                                                delay(10);
                                                temp=P3;
                                                temp=temp&0xf0;
                                                if(temp!=0xf0)
                                                {
                                                        temp=P3;
                                                        if(temp==0xde)
                                                        {
                                                                flag2=1;
                                                        }
                                                        if(flag2==1)
                                                        {
                                                                flag2=0;
                                                                beep(100);
                                                                TR0=1;
                                                                keyscan();
                                                        }
                                                }
                                        }
                                 }
                        }
                }
        }
}
void T0_10s() interrupt 1                                //定时器0中断服务程序,提供十秒倒计时计数
{
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        num++;
        if(num==20)
        {
                num=0;
                flag--;
                if(flag==0)
                {
                        TR0=0;
                        flag=10;                                        //送十秒显示函数作为十秒倒计时数
                        beep(1000);
                }
        }
        dis10();
}

最新回复

程序太乱了  详情 回复 发表于 2010-3-18 10:09
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看程序,是个累人的活。

顶下吧,呵呵
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
没问题
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
啥现象 也不说---------------
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
void display(uchar a) //显示选手编号函数
{
dula=1;
P0=table[a];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(10);
}
P0是接LED的?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
P0是接的数码管,用来显示选手编号和十秒倒计时的
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
按下清零键后显示了零,但是其余按键没反应
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
好长...............不想把它看明白.........
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

9
 
程序太乱了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表