大宏

    1. 分享30套单片机毕业设计给大家 3137/305760 信息发布 2011-10-26
      :) 好耶
    2. 红外 21/8220 嵌入式系统 2011-10-18
      为什么处理好后,显示的是00 FF 数据码 数据码反码   /*-----------------------------------------------  名称:IIC协议 PCF8591ADDA转换  日期:2009.5  修改:无  内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量(不是电位器的电压),用LED亮度渐变(用num自加)指示  结果:成功!LED------------------------------------------------*/#include<reg52.h>#include<intrins.h>//包含NOP空指令函数_nop_(); #define uint unsigned int#define uchar unsigned char #define addwr 0x90#define addrd 0x91 sbit scl=P1^1;sbit sda=P1^2; bit adflag; uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表uchar data Display[2];//定义临时存放数码管数值/*------------------------------------------------                    延时程序------------------------------------------------*/void delay(uint z){ uint x,y; for(x=z;x>0;x--)  for(y=110;y>0;y--);}/*------------------------------------------------                    初始化定时器1------------------------------------------------*/void init_timer1(){ TMOD=0x10; TH1=0xff; TH0=0; EA=1; TR1=1; ET1=1;}/*------------------------------------------------                    启动IIC总线------------------------------------------------*/void start(){ sda=1; _nop_(); scl=1; _nop_(); sda=0; _nop_(); scl=0;}/*------------------------------------------------                    停止IIC总线------------------------------------------------*/void stop(){ sda=0; _nop_(); scl=1; _nop_(); sda=1; _nop_(); scl=0;}/*------------------------------------------------                   应答IIC总线------------------------------------------------*/void ack(){ sda=0; _nop_(); scl=1; _nop_(); scl=0; _nop_(); }/*------------------------------------------------              非应答IIC总线------------------------------------------------*/void NoAck(){ sda=1; _nop_(); scl=1; _nop_(); scl=0; _nop_(); }/*------------------------------------------------              发送一个字节------------------------------------------------*/void send(uchar num){ uchar temp,bitcount; temp=num;  for(bitcount=8;bitcount>0;bitcount--) {  scl=0;  _nop_();  if((temp&0x80)==0x80)   sda=1;  else   sda=0;  temp=temp<<1;  scl=1;  _nop_();   } scl=0; }/*------------------------------------------------               读入一个字节并返回------------------------------------------------*/uchar Read(){ uchar temp=0; uchar num=8; sda=1; while(num) {  scl=0;  _nop_();  scl=1;  _nop_();  if(sda)  {   temp=temp|0x01;  }  else  {   temp=temp&0xfe;  }  if(num-1)  {   temp=temp<<1;  }    num--; } return(temp);}/*------------------------------------------------                    写入DA数模转换值------------------------------------------------*/void DAC(uchar Data){ start(); send(addwr); //写入芯片地址 ack(); send(0x42);  //写入控制位,使能DAC输出 ack(); send(Data);   //写数据 ack(); stop();}/*------------------------------------------------                 读取AD模数转换的值,有返回值------------------------------------------------*/uchar ReadADC(uchar Ch1){ uchar temp; start(); send(addwr); //写入芯片地址 ack(); send(0x00|Ch1); ack();//写入选择的通道,本程序只用单端输入,差分部分需要自行添加                    //Chl的值分别为0、1、2、3,分别代表1-4通道  start(); send(addrd); //读入地址 ack(); temp=Read(); //读数据 scl=0; NoAck(); stop(); return(temp);}/*------------------------------------------------                   主程序------------------------------------------------*/void main(){ uchar num; init_timer1(); while(1) {  DAC(num);  //DA输出,可以用LED模拟电压变化  num++;   //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化    delay(20); //延时用于清晰看出变化  if(adflag==1) //定时采集输入模拟量  {   adflag=0;   Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示     Display[1]=Datatab[((ReadADC(0))%50)/10];     /*   Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加     Display[3]=Datatab[((ReadADC(1))%50)/10];    Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加     Display[5]=Datatab[((ReadADC(2))%50)/10];        Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加     Display[7]=Datatab[((ReadADC(3))%50)/10];*/  }   }}/*------------------------------------------------                   定时器中断程序------------------------------------------------*/void Timer1_isr() interrupt 3{ static unsigned int count,j;  TH1=0xfb;  //重新赋值  TL1=0x00; j++; if(j==200) //本程序,采样时间多少无所谓 {  j=0;  adflag=1; } P0=Display[count]; P2=count; count++; if(count==2) {  count=0; }}
    3. 红外 21/8220 嵌入式系统 2011-10-18
      请教各位高手:用这个程序处理数据,为什么处理后液晶显示为:00、FF、数据码、数据码反码?

最近访客

< 1/1 >

统计信息

已有62人来访过

  • 芯积分:--
  • 好友:--
  • 主题:2
  • 回复:3

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言