2428|5

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大神帮助 这程序跳不出了,求指教 [复制链接]






//测出的电压经0804转换后在12864上显示



#include



#define uchar unsigned char

#define uint unsigned int

#define port P1 //DB0~DB7数据口

sbit e=P2^0;//使能

sbit rw=P2^1;//读写

sbit rs=P2^2;//数据/命令

sbit cs2=P2^3;//片选

sbit cs1=P2^4;

sbit busy=P1^7;//检测忙









#define date  P0

sbit cs=P2^5;    //片选信号,控制芯片的启动,低电平有效

sbit rd=P2^6;   //读数据控制,低电平有效

sbit rw1=P2^7;  //AD转换启动控制,上升沿有效

sbit intr=P3^3; //AD转换结束输出低电平





uchar code hz[][16]={

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},

//"0",0



{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},

//"1",1



{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},

//"2",2



{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},

//"3",3



{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},

//"4",4



{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},

//"5",5



{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},

//"6",6



{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},

//"7",7



{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},

//"8",8



{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00} //"9",9



};





//延时

void delay(uint n)

{

  uint i;

  for(;n>0;n--)

    for(i=200;i>0;i--);

}



void check()

{  

      rs=0;rw=1;

          port=0x00;

          e=1;

          while(busy);

          e=0;



}

//写指令

void wreg(uchar c)

{

    check();

rs=0;  //指令

rw=0;  //写 e=0;

port=c;

e=1;

e=0; //写入指令

}

//写数据

void wdata(uchar dat)

{

    check();

rs=1;    //数据

rw=0;

port=dat;

e=1;

e=0;

}

//选屏幕 0--全屏,1--左屏,2--右屏;

void select(uint n)

{

    switch(n)

{

    case 0:cs1=0;cs2=0;break;   //低电平选中

    case 1:cs1=0;cs2=1;break;   //cs1左屏

    case 2:cs1=1;cs2=0;break;   //cs2右屏

       

}  

}

//页

void setpage(uchar page)

{

   //page=page&0x07;

   page=page|0xb8;

   check();

   wreg(page);

}

//列

void setcolumn(uchar column)

{

  // column=column&0x3f;

   column=column|0x40;

   wreg(column);

}

//清屏 0--全屏,1--左屏,2--右屏;

void clear(uint n)

{

   uchar i,j;

   select(n);

   //wreg(0x3f);

   for(i=0;i<8;i++)

   {

      setpage(i);

     setcolumn(0);

   for(j=0;j<64;j++)

     wdata(0x00);  //置0清空

   }

}



void show16(uchar page,uchar column,uchar screen,uchar*s)

{

  uchar i,j;

  select(screen);

  j=0;

  setpage(page);

  setcolumn(column);

  for(i=0;i<16;i++)

    {

        wdata(s[j++]);



        }

   setpage(page+1);

   setcolumn(column);

   for(i=0;i<16;i++)

   {

     wdata(s[j++]);

         

   }

}

void show8(uchar page,uchar column,uchar screen,uchar *str)

{

  uchar i,j;

select(screen);j=0;



setpage(page);

setcolumn(column);

for(i=0;i<8;i++)

{            wdata(str[j++]);     

}

setpage(page+1);

setcolumn(column);

  for(i=0;i<8;i++)

  {       wdata(str[j++]);     

  }

}















//  ad   转换



void start_ad( )

{

   date=0xff;

    cs=0;

    rw1=0;

        rd=1;

    delay(3);

        cs=1;

    rw1=1;

        rd=1;



}

uint ad_read( )

{

  uint temp;

  cs=0;

  rd=0;



  delay(3);

  temp=date;

  rd=1;

  cs=1;

  return(temp);



}

void ad_init( )

{

  cs=1;rw1=1;rd=1;

}

main( )

{



  uint  a1,a2,a3,a4;

  uint ad_data;

  ad_init( );

  start_ad( ) ;

  while(intr==1);

  ad_data=ad_read();



  ad_data=ad_data*196;



a1=ad_data/10000; //第四位数码管(最高位)

a2=ad_data%10000/1000;//第三位数码管?

a3=ad_data%1000/100;//第二位数码管?

a4=ad_data%100/10;//第一位数码管(最低位)













   clear(0);





   show8(0,8,1,hz[a1]);

   show8(0,16,1,hz[a2]);

   show8(0,24,1,hz[a3]);

   show8(0,32,1,hz[a4]);

   show8(0,8,2,hz[5]);

   show8(0,16,2,hz[6]);

   show8(0,24,2,hz[7]);

   show8(0,32,2,hz[8]);



   delay(5000);

   while(1);

}

此帖出自51单片机论坛

最新回复

代码确实有些长。我没看,不懂是不是这样,楼主你看下会不会,从ADC中得到的数据没有处理。一般从ADC中读出来的值是在0~255(如果是8位AD的话)之间的某个数据,这个数据还要处理一下才是实际电压。 一般转换公式是  实际电压 = 采样值 * 分辨率。(分辨率 = 参考电压 / 2的N方) N为ADC的位数,如果ADC为八位,则N=8; 不懂楼主的是不是这个原因  详情 回复 发表于 2015-5-5 13:34
点赞 关注
 

回复
举报

3836

帖子

19

TA的资源

纯净的硅(中级)

沙发
 
代码有些长,建议楼主看看这个建议:https://bbs.eeworld.com.cn/thread-285667-1-1.html
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
fish001 发表于 2015-4-28 11:27
代码有些长,建议楼主看看这个建议:https://bbs.eeworld.com.cn/thread-285667-1-1.html

是的哦,有道理,初学者长见识了。谢谢。
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 
思想是,5V内的电压经过adc0804转换后在12864 上显示。我的错事在我调节变阻器时,显示器上数据不动,也不对,求大神指导一下。。
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

5
 
大神能帮忙解决一下啊!!求教
此帖出自51单片机论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

6
 
代码确实有些长。我没看,不懂是不是这样,楼主你看下会不会,从ADC中得到的数据没有处理。一般从ADC中读出来的值是在0~255(如果是8位AD的话)之间的某个数据,这个数据还要处理一下才是实际电压。

一般转换公式是  实际电压 = 采样值 * 分辨率。(分辨率 = 参考电压 / 2的N方) N为ADC的位数,如果ADC为八位,则N=8;

不懂楼主的是不是这个原因
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
ADI &文晔 探索季第一站,邀您在活动帖跟帖,ADI资深工程师将与您一道寻求解决之道! ...
春晚,最出圈当属穿着棉马甲跳秧歌的机器人”秧Bot”。
转手绢、飞手绢、变换队形,精准度和稳定性甚至超越人类,这背后少不了电机控制技术。

查看 »

 
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
快速回复 返回顶部 返回列表