c8051f410单片机代码求高手优化

2019-03-24 18:14发布

仿真时,经常出现target fail to respond的错误,多试几次可能又可以运行。lcd显示时存在很多杂点噪声,仿真时按键也不是很灵敏。
#include "C8051F410.h"
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

sbit RS=P1^3;
sbit RW=P1^4;
sbit EN=P1^5;
sbit PSB=P1^6;
sbit RET=P0^7;
sbit P04=P0^4;
sbit P03=P0^3;
sbit P02=P0^2;

sfr16 IDA0=0x96;
sfr16 ADC0 =0xbd;

int q=0;
unsigned char m=0,n=0,l=0,k=0,i=0,j=0,sum=0;
unsigned char z0=0,z1=0,z2=0,z3=0,z4=10,p=0;
unsigned long acc;
float mv;
uchar code key1[]={"步进="};
uchar code key2[]={"增益="};
uchar code key3[]={"电压="};
uchar code key4[]={"mV"};
uchar code key5[]={"dB"};
uchar code key[]= {"0123456789+-"};

void PCA_Init()
{
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
}

void Timer_Init()
{
        CKCON     = 0x10;
    TMR2CN    = 0x04;
    TMR2RLL   = 0xFF;
    TMR2RLH   = 0xFF;
    TMR2H     = 0xC0;
    TMR3CN    = 0x04;
        TMR3RLL   = 0xb1;
    TMR3RLH   = 0xc1;
    TMR3L     = 0x31;
    TMR3H     = 0x21;
}

void ADC_Init()
{
    ADC0MX    = 0x0F;
        ADC0CF    = 0x38;
    ADC0CN    = 0x81;
}

void DAC_Init()
{
    IDA0CN    = 0xA1;
}

void Voltage_Reference_Init()
{
    REF0CN    = 0x0A;
}

void Port_IO_Init()
{
    P0MDIN    = 0xFC;
    P1MDIN    = 0x7F;
    P2MDOUT   = 0xFF;
    P0SKIP    = 0x1F;
    P1SKIP    = 0x80;
    P2SKIP    = 0xFF;
    XBR1      = 0x40;
}

void Oscillator_Init()
{
    OSCICN    = 0x83;
}

void Interrupts_Init()
{
    EIE1      = 0x08;
    IE        = 0x80;
}
void delay_50us(uint t)
{
uchar i=2;
while(t--)
while(i--);
}

void delay_50ms(uint t)
{
uint i,j,k;
for (i=t;i>0;i--)
for (j=57;j>0;j--)
for(k=100;k>0;k--);
}

void write12864com(uchar com)
{
RS=0;
RW=0;
delay_50us(1);
P2=com;
EN=1;
delay_50us(1);
EN=0;
delay_50us(1);
}
void write12864dat(uchar dat)
{
RS=1;
RW=0;
delay_50us(1);
P2=dat;
EN=1;
delay_50us(1);
EN=0;
delay_50us(1);
}

void initinal12864(void)
{ PSB=1;
RET=1;
delay_50ms(2);
write12864com(0x30);
delay_50us(2);
write12864com(0x30);
delay_50us(2);
write12864com(0x0c);
delay_50us(1);
write12864com(0x01);
delay_50us(20);
write12864com(0x06);
delay_50us(2);
}

void Init_Device(void)
{
    PCA_Init();
    Timer_Init();
    ADC_Init();
    DAC_Init();
    Voltage_Reference_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
        initinal12864();
}


void  keyscan(void)
{
   uchar  scan1;
    P04=1;
    P03=0;
    P02=0;
   scan1=P0;
   if((scan1&0x10)!=0x10)            //判键是否按下
   {
     delay_50us(50);                   //延时0.25ms
     scan1=P0;
     if((scan1&0x10)!=0x10)          //二次判键是否按下
     {
         P04=0;
         P03=1;
         P02=1;
                    if(P02==0)  //查表得键值
           {
              q=q+1;
           }
                    if(P03==0)  //查表得键值
           {
              q=q-1;
           }
                             while((P0&0x0C)!=0x0C); //检查P00和P01口
        }        

     }
   }   


void adc(void)
{
uchar i=1000;
sum++;
if(sum==100){
sum=0;                    //延时2ms
mv=mv*2500/4096;
acc=mv;
acc=acc+q;
m=acc/1000;  
acc=acc%1000;       
n=acc/100;         
acc=acc%100;             
l=acc/10;
acc=acc%10;               
k=acc;   

while(i--){
write12864com(0x83);
write12864dat(key[m]);
write12864dat(key[n]);
write12864com(0x84);
write12864dat(key[l]);
write12864dat(key[k]);
}
}
}


void bujin()
{
uchar i=1000;
z3++;
if(z3==100)
{
z3=0;
p=q;
if(q<0)
{
z4=11;
p=256+q;
p=256-p;                //P为有符号数,与无符号数的负数运算较复杂,故间接求值
}
if(q==0)
{
z4=0;
}
if(q>0)
{
z4=10;
}
z0=p/100;          
p=p%100;     
z1=p/10;
p=p%10;               
z2=p;   
while(i--){
write12864com(0x8B);
write12864dat(key[z4]);
write12864dat(key[z0]);
write12864com(0x8C);
write12864dat(key[z1]);
write12864dat(key[z2]);
}
}
}

void main()
{
Init_Device();
IDA0=0xa440;         //基准电压=1.5         ,a370
EA =1;
write12864com(0x80);
write12864dat(key3[0]);
write12864dat(key3[1]);
write12864dat(key3[2]);
write12864dat(key3[3]);
write12864dat(key3[4]);
write12864com(0x85);
write12864dat(key4[0]);
write12864dat(key4[1]);//第一行

write12864com(0x88);
write12864dat(key1[0]);
write12864dat(key1[1]);
write12864dat(key1[2]);
write12864dat(key1[3]);
write12864dat(key1[4]);
write12864com(0x8D);
write12864dat(key5[0]);
write12864dat(key5[1]);
while(1)
{
adc();
bujin();
keyscan();

}
}

void ADC_ISR(void)interrupt 10
{
AD0INT =0;
mv=ADC0;
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
Y在此刻
1楼-- · 2019-03-24 23:27
主要功能是利用f410单片机自带的AD、DA转换芯片,进行DA转换后输出的电流,经过4.7k的电阻转换成电压,再利用AD转换进行采集。同时实现采集值在lcd上的显示,显示值可由按键增加或减少。希望高手能指出为什么会仿真有那错误提示,还有为什么显示有那么多杂点,按键不灵敏,在此谢过!

一周热门 更多>