找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3117|回复: 3
收起左侧

51单片机控制角度仪Proteus仿真+源程序

[复制链接]
ID:353454 发表于 2019-5-7 19:59 | 显示全部楼层 |阅读模式
角度仪仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
#define uint unsigned int
sbit        A0=P3^0;
sbit        E1=P3^1;
sbit        E2=P3^2;
sbit        RW=P3^3;
sbit        CS=P3^;
sbit        CLK=P3^6;
sbit        DOUT=P3^7;
#define LCD_DATA P0
void delay(unsigned int i)
{
unsigned char k=200;
while(i>0)
{
i--;
}
}
void OUTMD(uchar i){        //??
   A0=1; //???        //????
   delay(5);
   E1=1;
   delay(10);
   LCD_DATA=i;
   delay(5);
   E1=0;
}

void OUTSD(unsigned char i){        
   A0=1; //???//??//????
   delay(5);
   E2=1;
   delay(10);
   LCD_DATA=i;
   delay(5);
   E2=0;
}

void OUTMI(uchar i){   //??
   A0=0; //???//????
   delay(5);
   E1=1;
   delay(10);
   LCD_DATA=i;
   delay(5);
   E1=0;
}


void OUTSI(unsigned char i){         
  A0=0; //???//??//????
  delay(5);
  E2=1;
  delay(10);
  LCD_DATA=i;
  delay(5);
  E2=0;
}

//中间还有显示函数

void lcdini(void){        //???
   RW=0;
   OUTMI(0XE2);  OUTSI(0XE2);//??
   OUTMI(0XAE);  OUTSI(0XAE);//POWER SAVE ??????,?????
   OUTMI(0XA4);  OUTSI(0XA4);//????
   OUTMI(0XA9);  OUTSI(0XA9);//1/32???
   OUTMI(0XA1);  OUTSI(0XA1);//?????,????
   OUTMI(0XE0);  OUTSI(0XE0);//??-??-???
   OUTMI(0XEE);  OUTSI(0XEE);//???  ???-??-???
   OUTMI(0X00);  OUTMI(0XC0);
   OUTSI(0X00);  OUTSI(0XC0);
   OUTMI(0XAF);  OUTSI(0XAF);//POWER SAVE ??????,?????
}


void SetPage ( uchar page0,uchar page1)
{
OUTMI(0xB8|page1);
OUTSI(0xB8|page0);
}


void SetAddress ( uchar address0,uchar address1)
{
OUTMI(address1);
OUTSI(address0);
}

void PutCharR(uchar ch)
{
OUTSD(ch);
}


void PutCharL(uchar ch)
{
OUTMD(ch);
}

void clrscr(void)
{
uchar  i;
uchar  page;
for (page=0;page<4;page++)
  {
    SetPage ( page, page);
    SetAddress(0,0);
    for (i=0;i<61;i++)
        {
          PutCharR(0);
          PutCharL(0);
        }
   }
}


void Draw_wordh (uint d_where, uint x_add, bit layer, uchar width,uchar *p)
{                //???????
  uchar x, address;     //address?????????
  bit window=0;  //window??????
  d_where = d_where*2*width;                                    
  for (x=width;x>0;x--){
   if (x_add>=61) {window=1;address=x_add%61;}
   else address=x_add;
   if(layer==0){ //??????????
     SetPage(0,0);
     SetAddress(address,address);
     if(window==1)PutCharR(p[d_where]);
     else PutCharL(p[d_where]);
                 
   }
else{         //????????????
   SetPage(2,2);
   SetAddress(address,address);
   if(window==1)PutCharR(p[d_where]);//??
   else PutCharL(p[d_where]);
   }
    x_add++;
    d_where++;
}}
void Draw_wordh2 (uint d_where, uint x_add, bit layer, uchar width,uchar *p)
{                //???????
  uchar x, address;     //address?????????
  bit window=0;  //window??????
  d_where = d_where*2*width;                                    
  for (x=width;x>0;x--){
   if (x_add>=61) {window=1;address=x_add%61;}
   else address=x_add;
   if(layer==0){ //??????????
     SetPage(1,1);
     SetAddress(address,address);
     if(window==1)PutCharR(p[d_where]);
     else PutCharL(p[d_where]);
                 
   }
else{         //????????????
         SetPage(3,3);
   SetAddress(address,address);
   if(window==1)PutCharR(p[d_where+width]);//??
   else PutCharL(p[d_where+width]);
   }
    x_add++;
    d_where++;
}}
uint readadc()
{
        uint da=0;
  uchar I;
        CLK=0;
        CS=0;
        delay(5);
        CLK=1;
        delay(5);
        CLK=0;
        delay(5);
        for(I=0;I<12;I++)
        {
                da<<=1;
                CLK=1;
          delay(5);
                CLK=0;
          delay(5);
                da|=DOUT;
        }
        CS=1;
        return da;
}
void main()
                {
                        float a;
                        int b,c,e,f,g;
      lcdini();
                        clrscr();
                        //Draw_wordh(0,0,1,96,Y1);
                        //Draw_wordh2(0,0,1,96,Y2);
                while(1)
                {        
                        if(readadc()<661)
                          a=-0.823*readadc()+3595.401;
                        else if(readadc()>661&&readadc()<1352)
                          a=-0.918*readadc()+3636.668;
                        else
                                a=-0.86*readadc()+3526.97;
                        b=a;
                        c=b/1000;
                        e=b%1000/100;
                        f=b%100/10;
                        g=b%10;
                        Draw_wordh(0,0,0,8,&H1[88]);
                        Draw_wordh(0,8,0,8,&H1[96]);
                        Draw_wordh(0,16,0,8,&H1[c*8]);
                        Draw_wordh(0,24,0,8,&H1[e*8]);
                        Draw_wordh(0,32,0,8,&H1[f*8]);
                        Draw_wordh(0,40,0,8,&H1[80]);
                        Draw_wordh(0,48,0,8,&H1[g*8]);
                        Draw_wordh(0,56,0,16,&H1[104]);
                        
                        Draw_wordh2(0,0,0,8,&H2[88]);
                        Draw_wordh2(0,8,0,8,&H2[96]);
                        Draw_wordh2(0,16,0,8,&H2[c*8]);
                        Draw_wordh2(0,24,0,8,&H2[e*8]);
                        Draw_wordh2(0,32,0,8,&H2[f*8]);
                        Draw_wordh2(0,40,0,8,&H2[80]);
                        Draw_wordh2(0,48,0,8,&H2[g*8]);
                        Draw_wordh2(0,56,0,16,&H2[104]);
                }                        
        }

全部资料51hei下载地址:
传感器显示.zip (97.47 KB, 下载次数: 53)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:910270 发表于 2021-4-22 15:47 | 显示全部楼层
传感器用的是什么呀
回复

使用道具 举报

ID:830137 发表于 2022-4-13 16:17 | 显示全部楼层
公式怎么算啊?
回复

使用道具 举报

ID:1027797 发表于 2022-5-30 22:52 | 显示全部楼层
我想问一下你的AD是怎么算的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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