最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

基于protuse的单片机模拟的实例

来源:动视网 责编:小OO 时间:2025-10-01 19:19:50
文档

基于protuse的单片机模拟的实例

本人对单片机的一些了解,在这里和大家分享。(1)基于ATC52的同步串口通信1单片机1程序(程序在KileC51上运行通过。)/*********************************************************************文件名:液晶1602显示.c*描述:该程序实现了对液晶1602的控制。*创建人:东流,2009年4月10日*版本号:2.0*****************************************************
推荐度:
导读本人对单片机的一些了解,在这里和大家分享。(1)基于ATC52的同步串口通信1单片机1程序(程序在KileC51上运行通过。)/*********************************************************************文件名:液晶1602显示.c*描述:该程序实现了对液晶1602的控制。*创建人:东流,2009年4月10日*版本号:2.0*****************************************************
本人对单片机的一些了解,在这里和大家分享。

(1)基于ATC52的同步串口通信

1单片机1程序

(程序在Kile C51上运行通过。)

     /********************************************************************

* 文件名  : 液晶1602显示.c

* 描述    :  该程序实现了对液晶1602的控制。

* 创建人  : 东流,2009年4月10日

* 版本号  : 2.0

***********************************************************************/

#include

#define uchar unsigned char

#define uint  unsigned int

//这三个引脚参考资料

sbit E=P3^5;        //1602使能引脚

sbit RW=P3^6;        //1602读写引脚    

sbit RS=P3^7;        //1602数据/命令选择引脚

sbit aaa=P1^0;

sbit bbb=P1^1;

sbit aa=P3^0;

sbit bb=P3^1;

/********************************************************************

* 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay()

{

    int i,j;

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

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

;

}

/********************************************************************

* 名称 : enable(uchar del)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void enable(uchar del)

{

    P2 = del;

    RS = 0;

    RW = 0;

    E = 0;

    delay();

    E = 1;

    delay();

}

/********************************************************************

* 名称 : write(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write(uchar  del)

{

    P2 = del;

    RS = 1;

    RW = 0;

    E = 0;

    delay();

    E = 1;

    delay();

}

/********************************************************************

* 名称 : L1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

***********************************************************************/

void L1602_init(void)

{

    enable(0x01);

    enable(0x38);

    enable(0x0c);

    enable(0x06);

    enable(0xd0);

}

/********************************************************************

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

         L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_char(uchar hang,uchar lie,char sign)

{

    uchar a;

    if(hang == 1) a = 0x80;

    if(hang == 2) a = 0xc0;

    a = a + lie - 1;

    enable(a);

    write(sign);

}

/********************************************************************

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

          L1602_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_string(uchar hang,uchar lie,uchar  *p)

{

    uchar a;

    if(hang == 1) a = 0x80;

    if(hang == 2) a = 0xc0;

    a = a + lie - 1;

    enable(a);

    while(1)

    {

        if(*p !='\\0')

           write(*p);

           else break;

    p++;

    }

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Main()

{

    uchar  k[]="sbuf data:";

    uchar i = 122,j=1,ti=14;

    aaa=1;bbb=1;    aa=1;bb=1;

    SM0=0;SM1=0;

    SM2=0;REN=1;    

    L1602_init();

    

    L1602_char(1,5,SBUF);

    L1602_string(1,1,k);

while(ti>=0)

{    while(1)

    {if(aaa==0)

    {bbb=0;break;} 

    }

    aaa=1;bbb=1;

    i--;

    i--;

    i--;

    i--;

    i--;

    i--;

    RI=0;

    while(1)

    {    

        if(RI!=0)break;    

    }

    

    L1602_char(2,j,SBUF);

    j++;ti--;

        

}

 REN=0;RI=1;

while(5)i=0;

}

2单片机2程序

#include

sbit a=P2^0;

sbit b=P2^1;

sbit C=P3^1;

void main()

{int i=0 ,j=0;

char str[20]=" www.baidu.com";

 a=1;b=1;

 SM0=0;SM1=0;

 SM2=0;//RI=0;

while(j<=14)

{

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

a=0;//SBUF=0;

while(1)

{    if(b==0)break;}

    b=1;a=1;

SBUF=str[j];

    TI=0;

j++;    

}

while(1);

}

(2)基于MSP430的科学计算器

单片机程序:

(程序在IAR430上运行通过。)

#include

#include

#include

#include

#include

unsigned char  dis1[]="WORK START";    //状态显示

unsigned char  dis2[]="ALCOHOL TEST";

char dis,j,a,c,cls[]="                ";

char ak,ch=1,aa[20],bb[20];

char i=0,n=0,m=0,flag=1,pf=1,dnf=0,deng=0,du=0;

double sum=0,sum1=0;

//int c=7;

void delay(unsigned char ms)  

//延时1

{    unsigned char i,j;

while(ms--)

{ for(i=0;i<65;i++)

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

{    

}

}

}

void delay2(unsigned int time )  //延时2

{

unsigned int n;

n=0;

while (n{ n++;}

return;

}

char lcd_bz()  //LCD判忙

{

char result;

P4OUT=0X8E;

//rs=0;

//rw=1;

//ep=1;

P1DIR=0X00;

result=P1IN&0x80;

//ep=0;

P4OUT=0X8A;

return result;

}

lcd_wcmd(unsigned char cmd)  //写指令数据到LCD

{

while(lcd_bz())

//rs=0;

//rw=0;

//ep=1;

P4OUT=0X8c;

P1DIR=0XFf;

P1OUT=cmd;

//ep=1;

P4OUT=0X8C;

//ep=0;

P4OUT=0X88;

}

lcd_pos(unsigned char pos) 

 //设定显示位置

{

lcd_wcmd(pos | 0x80);

}

lcd_wdat(unsigned char dat)  

//写入显示数据到LCD

{

while(lcd_bz());

//rs=1;

//rw=0;

//ep=0;

P4OUT=0X;

P1DIR=0Xff;

P1OUT=dat;

//ep=1;

P4OUT=0X8D;

//ep=0;

P4OUT=0X;

}

lcd_init()  //LCD初始化

{

lcd_wcmd(0x38);

delay(1);

lcd_wcmd(0x0c);

delay(1);

lcd_wcmd(0x06);

delay(1);

lcd_wcmd(0x01);

delay(1);

}

unsigned char key_scan()

{

   

   unsigned char    t,k1,k2,key;

   unsigned int     kt;

 

   P3DIR=0X00;

   P5DIR=0Xff;

  // P3OUT=0XFF;

   P5OUT=0x00;

   

 //  P3DIR=0X00;

  // P3IN|=0XFF;

 //  P3DIR=0X00;

   t=P3IN;

  // P3DIR=0XFF;

  // P6DIR=0XFF;

   if(t!=0xFF)

   {

      delay(10);

    //  P3DIR=0X00;

      t=P3IN;

          

    //      P3DIR=0XFF;

  // P6DIR=0X00;

      if(t!=0xFF)

      {//P3DIR=0XFF;

          //  P3DIR=0X00;

              k1=P3IN;

                 

                 P5OUT=0X00;

                 P3DIR=0XFF;

                 P5DIR=0X00;

              //   P6OUT|=0xFF;

         P3OUT=0x00;

              //   P3DIR=0XFF;

             //    P3OUT=0xff;

        // P3OUT=0x00;

                P5DIR=0X00;

          

              //   P6DIR=0X00;

         //        P6IN|=0XFF;

                  

         k2=P5IN;

                 P2DIR=0XFF;

                 P2OUT=k2;

              P3OUT|=0X00;

        // k2|=0xC0;

         kt=k1;

     kt=kt<<8;

         kt+=k2;

               

                

  

                

         switch(kt)

         {

            

            case 0xFEFE: key='3';break;

            case 0xFDFE: key='2';break;

            case 0xfbfe: key='1';break;

            case 0xf7fe: key='B';break;

            case 0xeffe: key='U';break;//2ndf

    //        case 0xdffe: key=23;break;

    //        case 0xbffe: key=22;break;

            

            case 0xfEFD: key='6';break;

            case 0xFDFD: key='5';break;

            case 0xfbfd: key='4';break;

            case 0xf7fd: key='t';break;

                case 0xeffd: key='r';break;//du/rad

//            case 0xdffd: key=16;break;

//            case 0xbffd: key=15;break;

            

            case 0xfefb: key='9';break;

            case 0xfdfb: key='8';break;

            case 0xfbfb: key='7';break;

            case 0xf7fb: key='s';break;

                case 0xeffb: key='Z';break;//sin

//            case 0xdffb: key=9;break;

//            case 0xbffb: key=8;break;

            

            case 0xfef7: key='c';break;

            case 0xfdf7: key='.';break;

            case 0xfbf7: key='0';break;

            case 0xf7f7: key='k';break;//^y

                case 0xeff7: key='y';break;//cos

//            case 0xdff7: key=2;break;

//            case 0xbff7: key=1;break;

                        

                        case 0xfeef: key='/';break;

            case 0xfdef: key='-';break;

            case 0xfbef: key='P';break;

             case 0xf7ef: key='D';break;// 1/x

                case 0xefef: key='a';break;//tan

//            case 0xdfef: key=2;break;

//            case 0xbfef: key=1;break;

                        

                        case 0xfedf: key='=';break;

            case 0xfddf: key='*';break;

            case 0xfbdf: key='+';break;

            case 0xf7df: key='p';break;//pi/e

                    case 0xefdf: key='l';break;//log

//            case 0xdfdf: key=2;break;

//            case 0xbfdf: key=1;break;

            default: key=32;break;

         }

         return key;  

      }

      else return(32);

   }

   else return(32);

}

void gcvt()

{

    char p[20]="",p1[20]="",k=0;

    char i=0,b=0;

    double z;

    unsigned long y;

if(sum<0)

    {p[k]='-';sum=0-sum;k++;}

        y=(unsigned long)sum;

        z=sum-y;

        if(y)

        {while(y)

        {p1[b]=y%10+0x30;y/=10;b++;}}

        else

        p1[0]=0+0x30;

        b=strlen(p1);

for(i=0;i          p[k]=p1[b-1];

for(i=0;i<20;i++){aa[i]=0;p1[i]=0;}

        k=0;i=0;

        p1[k]='.';k++;

        while((z!=0.0)&&(i!=6))

        {z=z*10;

        y=(int)(z);

        z-=y;

        p1[k]=y+0x30;k++;i++;}

for(i=0;i<20;i++)aa[i]=0;

        strcat(p,p1);

        strcpy(aa,p);

}

void cls_one()

{char cl=0,cc=16;

lcd_pos(0);

  while(cc)    //显示开始工作

{

lcd_wdat(cls[cl]);

cl++;cc--;

}return;}

void cls_two()

{char cl=0,cc=16;

lcd_pos(0x40);

  while(cc)    //显示开始工作

{

lcd_wdat(cls[cl]);

cl++;cc--;

}return;

}

void main()

{

//double dou;

char jj=0, p='-',di=0;

P4DIR=0Xff;

P1DIR=0Xff;

P6DIR=0Xff;

P6OUT=0X00;

P6OUT|=BIT4;

//数据初始化

lcd_init();

delay(3);

lcd_pos(0);

dis=0;

while(dis1[dis]!='\\0')    //显示开始工作

{

lcd_wdat(dis1[dis]);

dis++;

}

delay(3);

dis=0;

lcd_pos(0x43);

while(dis2[dis]!='\\0')    //显示开始测试

{

lcd_wdat(dis2[dis]);

dis++;

}

delay(100);

lcd_init();

delay(3);

lcd_pos(0x40);

lcd_wdat(0x30);

dis=0;

while(1)

{

ak=key_scan();

switch(ak)            //选择键值

      {

                case 32:break;         // 无

        case '0':

        case '1':

        case '2':

        case '3':

        case '4':

        case '5':

        case '6':

        case '7':

        case '8':

        case '9':if(flag)

                    {lcd_init();

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

                    aa[j]=0;flag=0;}

                         if(m==1)i=n;

                a=ak;

                aa[i]=ak;i++;deng=0;m=0;

                lcd_pos(dis);if(dis==15)dis=0x3f;dis++;

                lcd_wdat(a);

                break;

        case '+':

        case '-':

        case '*':

        case '/':

                        if(deng)cls_one();c=ak;

                 strcpy(bb,aa);

                 n=i;

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

                 aa[j]=0;

                  i=0;flag=0;pf=2;m=0;

                 lcd_pos(dis);dis++;

                 lcd_wdat(c);if(dis==15)dis=0x3f;break;

        case '=':

    sum1=atof(aa);

    sum=atof(bb);

    

    switch(c)

    {case '+':

        sum=sum+sum1;

        break;

    case '-':

        sum=sum-sum1;

        break;

    case '*':if(sum==sum1){sum=sum-1;sum=sum*sum1+sum1;}

        else sum=sum*sum1;

        break;

    case '/':

        sum=sum/sum1;

        break;

    case '^':

        sum=pow(sum,sum1);

        break;

        case '@':sum1=1/sum1;

                sum=pow(sum,sum1);

                break;

    default:goto lloop;

    }

        gcvt();

    flag=1;

lloop:

    //lcd_init();

  cls_two();

  delay(1);

    lcd_pos(0x40);

    dis=strlen(aa);

        j=0;

    while(dis)    //显示开始测试

    {

         // aa[j]+=0x30;

        lcd_wdat(aa[j]);

        dis--;j++;

    }

    

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

        bb[j]=0;

    i=0;c=0;pf=1;n=0;dis=0;deng=1;m=0;

        sum=0;sum1=0;break;

        case '.':a='.';

                aa[i]='.';i++;

                lcd_pos(dis);if(dis==15)dis=0x3f;dis++;

                lcd_wdat(a);

                break;

                                

        case 'c':lcd_init();

for(int j=0;j<20;j++)

      {    aa[j]=0;

    bb[j]=0;}

    i=0;flag=1;c=0;du=0;

    pf=1;n=0;dnf=0,deng=0,dis=0;sum=0;sum1=0;m=0;lcd_pos(0x40);

        lcd_wdat(0x30);if(du){P6OUT&=~BIT4;P6OUT|=BIT2;} else {P6OUT&=~BIT2;P6OUT|=BIT4;}

        if(dnf)P6OUT|=BIT0;else P6OUT&=~BIT0;break;

    case 'D':sum1=atof(aa);sum=1/sum1;gcvt();flag=1;goto lloop;

                

        case 't':sum1=atof(aa);sum=atof(aa);sum=sum-1;sum=sum*sum1+sum1;gcvt();flag=1;goto lloop;

      

        case 's':sum1=atof(aa);;sum=atof(aa);sum=sum-1;sum=sum*sum1+sum1;sum*=sum1;

                  gcvt();flag=1;goto lloop;

                  

        case 'B':

        if(i!=0)

    {i--;

    aa[i]='\\0';

       

    cls_one();

        delay(1);di=0;

    

    di=strlen(bb);

        jj=0;

        if(c!=0)

        {

          lcd_pos(0);

    while(di)    //显示开始测试

    {

        lcd_wdat(bb[jj]);

        di--;jj++;

    }

        di=strlen(bb);

        lcd_pos(di);

    lcd_wdat(c);

        

    jj=0;

        di++;delay(1);

        }

        lcd_pos(di);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

        }

    else

    {if(c!=0)

        {c=0;

        cls_one();delay(1);di=0;

    lcd_pos(0);

    di=strlen(bb);

        jj=0;

    while(di)    //显示开始测试

    {

        lcd_wdat(bb[jj]);

        di--;jj++;

    }}

    else

        if(n!=0)

        {n--;

        bb[n]='\\0';

        cls_one();delay(1);di=0;

    lcd_pos(0);

    di=strlen(bb);

        jj=0;

    while(dis)    //显示开始测试

    {

        lcd_wdat(bb[jj]);

        dis--;jj++;

    }m=1;

        }strcpy(aa,bb);}flag=0;if(c!=0)dis=strlen(bb)+i+1;else dis=strlen(aa);break;

        

      case 'P':

    

    if(i==0)

    {if(pf==1){cls_one();}

for(jj=0;jj<20;jj++)

    aa[jj]=0;

    aa[0]='-';

    i++;flag=0;pf=2;

    lcd_pos(dis);

        lcd_wdat(p);

    dis++;

    }

    else{dis=0;

    sum=atof(aa);

    sum=0-sum;

    gcvt();

    cls_one();

        di=strlen(bb);

        jj=0;

        if(c!=0)

        {

          lcd_pos(dis);

    while(di)    //显示开始测试

    {

        lcd_wdat(bb[jj]);

        di--;jj++;

    }

        di=strlen(bb);

        lcd_pos(dis+di);

    lcd_wdat(c);

        

    jj=0;

        dis++;delay(1);

        }

        lcd_pos(dis+di);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

    }flag=0;if(c!=0)dis=strlen(bb)+i+1;else dis=strlen(aa); break; 

        

      case 'U':dnf=1-dnf;if(dnf)P6OUT|=BIT0;else P6OUT&=~BIT0;break;

      

      case 'Z':

        

        sum=atof(aa);

        if(du)sum=sum/180*3.141592653579323846233;

    if(dnf==0)

    sum=sin(sum);

    else {

        sum=atof(aa);;

        sum=asin(sum);

        if(du)sum=sum*180/3.14159265;

        }

if(-0.000001    gcvt();

        jj=0;

        

        cls_two();

        delay(1);

    lcd_pos(0x40);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

    flag=1;i=0;dis=0;break;

        

        case 'y':sum=atof(aa);

        if(du)sum=sum/180*3.14159265;

    if(dnf==0)

    sum=cos(sum);

    else {sum=atof(aa);sum=acos(sum);

        if(du)sum=sum*180/3.14159265;}

if(-0.000001    gcvt();

        jj=0;

        

        cls_two();

        delay(1);

    lcd_pos(0x40);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

    flag=1;i=0;dis=0;break;

        

        case 'a':sum=atof(aa);

        if(du)sum=sum/180*3.14159265;

    if(dnf==0)

    sum=tan(sum);

    else {sum=atof(aa);sum=atan(sum);

        if(du)sum=sum*180/3.14159265;}

if(-0.000001    gcvt();

        jj=0;

        

        cls_two();

        delay(1);

    lcd_pos(0x40);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

    flag=1;i=0;dis=0;break;

        

      case 'p':if(dnf==0)sum=3.14159265;

      else sum=2.718281828;

    gcvt();

    jj=0;

        

        cls_one();

        delay(1);

    lcd_pos(0);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

    flag=1;i=0;deng=1;break;

        

      case 'l':sum=atof(aa);

    if(dnf==0)sum=log10(sum);

    else sum=log(sum);

    gcvt();

    jj=0;

        

        cls_two();

        delay(1);

    lcd_pos(0x40);

        di=strlen(aa);

    while(di)    //显示开始测试

    {

          

        lcd_wdat(aa[jj]);

        di--;jj++;

    }

    flag=1;i=0;deng=1;break;

        

      case 'k':

        if(dnf==0)c='^';

        else c='@';

    strcpy(bb,aa);

    n=i;

for(int j=0;j<50;j++)

    aa[j]=0;

    i=0;flag=0;pf=2;

    m=0;

    lcd_pos(dis);dis++;

    lcd_wdat(c);if(dis==15)dis=0x3f;break;

      case 'r':du=1-du;if(du){P6OUT&=~BIT4;P6OUT|=BIT2;} else {P6OUT&=~BIT2;P6OUT|=BIT4;} break;

    default:break;

}

}

}

文档

基于protuse的单片机模拟的实例

本人对单片机的一些了解,在这里和大家分享。(1)基于ATC52的同步串口通信1单片机1程序(程序在KileC51上运行通过。)/*********************************************************************文件名:液晶1602显示.c*描述:该程序实现了对液晶1602的控制。*创建人:东流,2009年4月10日*版本号:2.0*****************************************************
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top