找回密码
 立即注册

QQ登录

只需一步,快速开始

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

程序烧入后数码管显示乱码,妹子实在没法求大神带我渡劫

[复制链接]
跳转到指定楼层
楼主
  大神你们终于来了,请帮我看下程序(拜托拜托),学着网上做了个温度报警器,可是程序烧进去后如图显示乱码TAT(本来该显示温度等)
确定只是程序的问题!要强的我想靠自己解决这个问题但是在找不到哪里出错,希望大神帮看下程序,谢谢啦


//数码管段选定义      0     1    2    3    4    5     6     7      8       9   
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                       0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};     //断码
//数码管位选定义
uchar code smg_we[]={0x7f,0xbf,0xdf,0xef};

uchar dis_smg[8]  = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};   

sbit CS=P3^2;        //CS定义为P3口的第2位脚,连接ADC0832CS脚  PCB
sbit SCL=P3^3;        //SCL定义为P3口的第3位脚,连接ADC0832SCL脚
sbit DO=P3^4;        //DO定义为P3口的第4位脚,连接ADC0832DO脚


/***********************数码显示函数*****************************/
void display()
{
    uchar i;
    P1 = 0xff;             //消隐                           
    P2 = smg_we[i];              //位选
    P1 = dis_smg[i];         //段选      
    i ++;
    if(i >= 4)            //4位数码管显示
        i = 0;      
}


/*************定时器0初始化程序***************/
void time_init()      
{
    EA   = 1;           //开总中断
    TMOD = 0X01;      //定时器0、定时器1工作方式1
    ET0  = 1;          //开定时器0中断
    TR0  = 1;          //允许定时器0定时
}

/****************按键处理数码管显示函数***************/
void key_with()
{
    if(key_can == 4)      //紧急报警键  手动报警
    {
        if(menu_1 == 0)
            shoudong = 1;
    }
    if(key_can == 1)     //设置键
    {
        menu_1 ++;
        if(menu_1 >= 3)
        {
            menu_1 = 0;
        }
    }
    if(menu_1 == 0)
    {
        if((key_can == 2) || (key_can == 3))
            shoudong = 0;          //取消手动报警
    }
    if(menu_1 == 1)            //设置高温报警
    {
        if(key_can == 2)
        {
            s_temp ++ ;        //高温报警值加1
            if(s_temp > 99)
                s_temp = 99;
        }
        if(key_can == 3)
        {
            s_temp -- ;        //高温报警值减1
            if(s_temp <= 10)
                s_temp = 10 ;
        }
        dis_smg[0] = smg_du[s_temp % 10];               //取个位显示
        dis_smg[1] = smg_du[s_temp / 10 % 10];  //取十位显示
        dis_smg[2] = 0xbf;
        dis_smg[3] = smg_du[10];    //显示A
        write_eeprom();               //保存数据
    }   
    if(menu_1 == 2)            //设置烟物报警
    {
        if(key_can == 2)
        {
            s_dengji ++ ;      //烟物报警值加1
            if(s_dengji >= 9)
                s_dengji = 9;
        }
        if(key_can == 3)
        {
            s_dengji --;      //烟物报警值减1
            if(s_dengji <= 1)
                s_dengji = 1;
        }
        dis_smg[0] = smg_du[s_dengji % 10];               //取个位显示
        dis_smg[1] = 0xbf ;  
        dis_smg[2] = 0xbf;
        dis_smg[3] = smg_du[11];    //显示B
        write_eeprom();               //保存数据
    }   
}  

/***************主函数*****************/
void main()
{
    beep = 0;                    //开机蜂鸣器叫一声
    delay_1ms(200);
    P0 = P1 = P2 = P3 = 0xff;   //初始化IO口为高电平
    temperature = read_temp();  //读取温度值
    init_eeprom();  //开始初始化保存的数据
    delay_1ms(650);               
    temperature = read_temp();  //读取温度值
    time_init();                //初始化定时器
    while(1)
    {
        key();                    //独立按键程序
        if(key_can < 10)
        {
            key_with();            //按键按下要执行的程序
        }
        if(flag_300ms == 1)
        {        
            flag_300ms = 0;
            clock_h_l();
            temperature = read_temp();  //读取温度值
            dengji = ad0832read(1,0);   
            dengji = dengji * 10 / 250;
            if(menu_1 == 0)
            {
                if(temperature >= 99)
                    temperature = 99;
                dis_smg[3]=smg_du[dengji];        //显示烟物报警等级
                dis_smg[2]= 0xbf;                // -        
                dis_smg[1]=smg_du[temperature/10%10];    //十位
                dis_smg[0]=smg_du[temperature%10];        //个位    ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示
            }
        }
        delay_1ms(1);
    }
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{   
    static uchar value;
    TH0 = 0xf8;
    TL0 = 0x30;     // 2ms
    value ++;     
    display();      //数码管显示函数
    if(value % 150 == 0)
    {
        flag_300ms = 1;       //300ms
        value = 0;
    }
}

QQ图片20160510074750.jpg (100.23 KB, 下载次数: 73)

显示乱码如图

显示乱码如图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:97438 发表于 2016-5-10 17:26 | 只看该作者
程序没有问题,查一下你的段选和位选的码就行了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:7485 发表于 2016-5-10 18:15 | 只看该作者
数码管的连接正确吗?

先写一段程序,让每个数码管从0~9慢慢的显示。数秒钟换一个,看看显示的都是什么就清楚了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:118284 发表于 2016-5-18 13:48 来自手机 | 只看该作者
是否段码顺序连错,像硬件。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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