找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1072|回复: 0
收起左侧

单片机+LTC1297角度仪Proteus仿真与Keil源程序

[复制链接]
ID:1027797 发表于 2022-5-24 16:01 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
1.png

单片机程序代码
#include <AT89X51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

#define AD P2
#define lcd  P2
#define key P1

sbit        a6=P3^0;
sbit        a5=P3^1;
sbit        a4=P3^2;
sbit         A0=P2^0;
sbit         A1=P2^1;
sbit         A2=P2^2;
sbit    A3=P2^3;

sbit        n0=P1^0;
sbit        n1=P1^1;
sbit        n2=P1^2;
sbit         n3=P1^3;
sbit         n4=P1^4;
sbit         n5=P1^5;
sbit    n6=P1^6;
sbit    n7=P1^7;

uchar code Y1[96]={
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0x42,0xE2,0x52,0x4A,0xC6,0x42,0x40,0xC0,0x00,
0x10,0x60,0x02,0x8C,0x20,0x90,0x8E,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0x80,0x00,
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,
0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00
};
uchar code Y2[96]={
0x04,0x03,0x00,0xFF,0x00,0x23,0x10,0x8C,0x43,0x20,0x18,0x47,0x80,0x40,0x3F,0x00,
0x04,0x04,0x7E,0x01,0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,
0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00        
};
uchar code H1[120]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,        
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
0x00,0x00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
uchar code H2[120]={
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,
0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,        
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};


void delay(unsigned int i)
{
unsigned char k=200;
while(i>0)
{
i--;
}
}
void OUTMD(uchar i){        //??
   A0=1; //???        //????
   delay(5);
   A1=1;
   delay(10);
   lcd=i;
   delay(5);
   A1=0;
}

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

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


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

void lcdini(void){        //???
   A3=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() //把模拟电压值转换成12位二进制数并返回
{
  uint ad = 0;   //          电压:3.3V
                 //          数字:1010 0011 1011
        uchar l;       //    1:ad:0000 0000 0000
                 //             DA: 0000 0000 0001
        a5=0;         //       ad: 0000 0000 0001
        a4=0;          //    2: ad: 0000 0000 0010
           _nop_();     //         DA: 0
        _nop_();       //       ad: 0000 0000 0010
        _nop_();       //    3: ad: 0000 0000 0100
        _nop_();       //       DA: 1
        _nop_();       //       ad: 0000 0000 0101
        _nop_();       //    4: ad: 0000 0000 1010
        _nop_();
        a5=1;
        _nop_();
        _nop_();
        a5=0;
        _nop_();
        _nop_();
        for(l=0;l<12;l++)
        {
         ad <<= 1;
         a5=1;
         _nop_();                                                         
         _nop_();
          a5=0;
         _nop_();
         _nop_();
         ad |= a6;
        }
        a4=1;
        return ad;
}

uchar temp()
{
        

}

uchar key()
{
uchar temp;
// while(1)
// {
  P1=0xff; //向P1口输入1表示这个I/O口作为输入端口
  P1=0xf0; //先将行全置0,列全置1
  temp=P1; //实时采取P1端口的数据
  if(temp!=0xf0)
  {
   delay(1000);//消抖
         temp=P1; //实时采取P1端口的数据
   if(temp!=0xf0)  //再判断
   {
     P1=0xfe;//列已判断,将进行逐行扫描,即将某一行置0其余行置1,逐列扫描,对该行进行判断!
         temp=P1;
         switch(temp)
         {
          case(0xee):return 7;break;
          case(0xde):return 8;break;
          case(0xbe):return 9;break;
          case(0x7e):return 10;break;
         }
         P1=0xfd;
         temp=P1;
         switch(temp)
         {
          case(0xed):return 4;break;
          case(0xdd):return 5;break;
          case(0xbd):return 6;break;
          case(0x7d):return 11;break;
         }
         P1=0xfb;
         temp=P1;
         switch(temp)
         {
          case(0xeb):return 1;break;
          case(0xdb):return 2;break;
          case(0xbb):return 3;break;
          case(0x7b):return 12;break;
         }
         P1=0xf7;
         temp=P1;
         switch(temp)
         {
          case(0xe7):return 13;break;
          case(0xd7):return 0;break;
          case(0xb7):return 14;break;
          case(0x77):return 15;break;
         }
   }
         
  }
        else
                 return 16;

}

void main()
{
        uint i=0,jiaodu=0;
        uchar keynum[3],keyc,keyval,keyd,tgc;
//        uchar keynum[]={5,2,1};
        lcdini();
        
while(1)
{
        keyval=key1();        
        if(keyval!=16) //有键按下
        {
         if(keyd==0)
         {         keyd=1;
        
               
         if(keyval==13) //取消键
         {
                 for(i=0;i<3;i++)
                 {
                         keynum[ i]=0;
                 }
                 jiaodu=0;
                 keyc=0;
   }
        if(keyval<10) //数字键盘
         {
                 keynum[keyc]=keyval;
                 keyc++;
                switch(keyc)
                {
          case 0:break;
          case 1:jiaodu=keynum[0];break;
          case 2:jiaodu=keynum[0]*10+keynum[1];break;
          case 3:jiaodu=keynum[0]*100+keynum[1]*10+keynum[2];break;
                }
         }        
   }
        }
   else
                 keyd=0;

}
}

Keil代码与Proteus仿真下载: 实验二.7z (57.73 KB, 下载次数: 14)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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