历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2020年04月25日 | PIC16F877 定时采集电压 LCD1602显示 Proteus仿真图

2020-04-25 来源:eefocus

功能:定时器间隔50us采集一次AD电压,一共采集30次,并通过LCD1602显示。


软件:MPLAB X IDE v5.35,ISIS 7 Professional


注意事项:系统时钟配置为外部时钟8Mhz,由于间隔50us采集一次,所以AD采集一次时间应该小于50us。可通过调整定时器的数值,间隔不同的时间采集AD。


代码如下:


#include "pic.h"

#define RS  RC1  //command or data

#define RW  RC2  //read write io

#define EN  RC3   //enable


__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF & BOREN_ON & LVP_ON & CPD_OFF);


void LCD1602_Init(void); 

void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);  //display 

void Time_Init(void);

void ADC_Init(char k);

int AD_CollectVolt(void);


char AD_Complete_Flag = 0;    

unsigned int arr[30];  

unsigned int ad_volt = 0;  

unsigned long sum = 0;

unsigned char num = 0,j = 0;

unsigned int Data = 0;

unsigned char volt_num[5];


void main(void)  //Fosc = 8Mhz

{

    PEIE = 1;  

    GIE = 1;  

    TRISC = 0X00;  //OUTPUT

    TRISD = 0X00;  //OUTPUT


    Time_Init();  //50us interrupt

    ADC_Init(0);  //Channel 0 RA0

    LCD1602_Init();

    

    while(1)

    {

        AD_CollectVolt();

        volt_num[0] = ad_volt/1000 + 48;

        volt_num[1] = ad_volt/100%10 + 48;

        volt_num[2] = ad_volt/10%10 + 48;

        volt_num[3] = ad_volt%10 + 48;

        volt_num[4] = '';

        LcdShowStr(0, 0, &volt_num);

        LcdShowStr(5, 0, "MV");

    }

}


void interrupt ISR(void)

{

    static unsigned char test = 0;

    if((TMR1IE == 1) && (TMR1IF == 1))  

    {

        TMR1IF = 0;  

        TMR1 = TMR1 + 0xffcd;  

        

        if(GO != 1)  

        {

            Data = ADRESH; 

            Data = Data << 8;  

            Data = Data | ADRESL;   

            arr[num]= Data;

            num ++;

        }

        GO = 1;  

        if(test == 0)  //test 50us time GPIO

        {

            RC4 = 0;

            test = 1;

        }

        else

        {

            RC4 = 1;

            test = 0;

        }


        if(num >= 30)  

        {

            TMR1ON = 0;    

            TMR1IE = 0;

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

            {

                sum = sum + arr[j];

            }

            sum = sum/30;

            ad_volt = sum*5000/1024;

            sum = 0;

            num = 0;

            AD_Complete_Flag = 1;

        }

    }

}


void LCD_WaitReady(void)

{

    unsigned char sta;

    PORTD = 0xff;

    RS = 0;

    RW = 1;

    do

    {

        EN = 1;

        sta = PORTD;

        EN = 0;

    }

    while(sta&0x80);

}


void Write_Command(unsigned char Command)

{

    LCD_WaitReady();

    PORTD = Command;

    RW = 0;

    RS = 0;

    EN = 1;

    EN = 0;    

}


void Write_Data(unsigned char Data)

{

    LCD_WaitReady();

    PORTD = Data;

    RW = 0;

    RS = 1;

    EN = 1;

    EN = 0;    

}


void LcdSetCursor(unsigned char x, unsigned char y)

{

    unsigned char addr;

    if (y == 0)

    { 

        addr = 0x00 + x;

    }

    else

    {

        addr = 0x40 + x; 

    }

    Write_Command(addr | 0x80); 

}


void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)

    {

    LcdSetCursor(x, y); 

    while (*str != '')

    { 

        Write_Data(*str++); 

    }

}


void LCD1602_Init(void)

{

    Write_Command(0x38);

    Write_Command(0x0c);

    Write_Command(0x06);

    Write_Command(0x01);

}


void Time_Init(void)

{

    TMR1CS = 0;  //FOSC/4

    T1CKPS1 = 0;

    T1CKPS0 = 1;  //1:2      

    TMR1 = 0xffcd;  //50us    

    TMR1IF = 0;  

    TMR1IE = 1;  

}

void ADC_Init(char k)

{

    TRISA = 0XFF;  //input

    ADCON1 = 0X80;

    ADCON0 = 0b00000001;  //FOSC/2

    ADCON0 |= (k << 3);       

}

int AD_CollectVolt(void)  

{

    TMR1ON = 1;

    TMR1IE = 1;

    GO = 1;         

    do  

    {

    }

    while(AD_Complete_Flag == 0);  //delay collect volt complete

    AD_Complete_Flag = 0;

}


硬件图:


在RA1中连接外部3V电源,LCD显示2998mv;

注意:如何验证是否真的50us采集一次,在定时器中断函数里通过IO口电平翻转,然后用示波器来观察;

如上图所示,50us翻转一次,说明是50us采集一次AD值。

推荐阅读

史海拾趣

Honeywell公司的发展小趣事

背景:进入20世纪后,霍尼韦尔在恒温器领域的技术不断成熟,同时,另一家名为霍尼韦尔供暖专业公司的企业也在加热器领域取得了显著成就。

发展:1927年,明尼阿波利斯热调节器公司与霍尼韦尔供暖专业公司合并,创立了明尼阿波利斯-霍尼韦尔调节器公司。这次合并不仅增强了公司的技术实力,还拓展了业务范围,使公司成为当时最大的高品质珠宝钟表生产商(尽管这与电子行业的直接关联较小,但反映了公司扩张的雄心)。

关键事件:合并后,公司继续深耕工业自动化领域,并收购了布朗仪器公司,进一步巩固了在全球工业控制器和指示器市场的领导地位。

Connor-Winfield公司的发展小趣事

随着全球经济的一体化,电子行业也逐渐呈现出全球化的趋势。Connor-Winfield敏锐地把握住了这一机遇,开始实施全球化战略。公司积极拓展海外市场,与多家国际知名企业建立了紧密的合作伙伴关系。这些合作不仅为公司带来了更多的商业机会,也使其在全球化竞争中保持了领先地位。

Horizon Electronics Enterprises Group公司的发展小趣事

随着工业互联网和智能制造技术的快速发展,Horizon紧跟时代步伐,积极推进数字化转型和智能制造升级。公司引入先进的自动化生产线和智能管理系统,实现生产过程的智能化和精细化管理。通过数字化转型,Horizon不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

EBG RESISTORS LLC公司的发展小趣事

作为一家有社会责任感的企业,EBG RESISTORS LLC公司积极履行环保责任。他们采用环保材料和生产工艺,减少生产过程中的废弃物排放。同时,公司还积极参与公益活动,回馈社会。这种负责任的态度赢得了客户和社会的广泛赞誉。

Bridgelux公司的发展小趣事

XXXX年,中国电子信息产业集团公司(CEC)和重庆临空开发投资公司牵头收购了Bridgelux。这次收购为Bridgelux带来了强大的资本支持和市场资源,使其得以进一步扩大生产规模,提升研发能力。在CEC和重庆临空的支持下,Bridgelux在全球范围内的市场份额逐步提升,品牌影响力不断增强。

Gang Song Electronics Co Ltd公司的发展小趣事

作为物联网领域的领军企业之一,Telit(包含GainSpan的技术)不仅致力于技术创新和市场拓展,还积极参与行业标准的制定和生态建设的推动。通过与其他企业和组织的合作与交流,Telit推动了物联网技术的标准化和规范化发展。同时,它还积极构建物联网生态系统,与上下游企业建立紧密的合作关系,共同推动物联网产业的繁荣和发展。这些努力不仅提升了Telit在行业内的地位和影响力,也为整个物联网产业的发展做出了重要贡献。

问答坊 | AI 解惑

电子万年历我成功调试过

http://blog.163.com/li_j920/edit/ 还的硬件电路,你们要我会给你们的。…

查看全部问答>

求助IIC总线

在网上看了IIC总线的资料但是还是不懂如何用C语言写个程序出来,看了人家的程序也不懂,请哪些高手帮助我下解释程序的含义,或者进一步讲解下思路。 我看了下资料,不知道这样可以实现IIC总线的启停吗? #include <reg51.h>#include \"intrin ...…

查看全部问答>

EVC的CString是否有问题?

程序莫名奇妙得在其一个成员函数里抛出ASSERT错。同样的运行路径进行第二次,就没问题了。…

查看全部问答>

WCE不支持CStdioFile么?

不知道为什么 编译通过了 但是运行的时候却发生了错误: error:Debug Asesertion Failed Failed! f:\\sp\\vctors\\vc7libsce\\ship\\atlmfc\\src\\mfc\\filecore.cpp line 207   (207看不清楚不知道是297还是207) 相关的MFC函数: ...…

查看全部问答>

求助!ADI平台,USB如何虚拟出一个串口?

现在在做一网卡项目,实现的功能是当网卡插入Windows XP系统时,显示一个USB口和一个串口,其中USB口实现上网,串口用于走AT命令等,现在在Windows端的驱动程序都已有现成的,USB也可以上网了     其中卡侧是TTPcom开发环境   &nb ...…

查看全部问答>

想找个师傅带一下【上海,武汉均可】

要毕业了没有工作经验,想找一个师傅教一下。毕业课题是无线点菜机,辅导我做一下。…

查看全部问答>

ARM的IO脚为什么不像51那样可以直接操作

arm是先要打开指定的IO口才可以读写,感觉不如51的方便arm的IO脚为什么不像51那样可以直接操作?这样有什么好处?…

查看全部问答>

GBT 20234-2006电动汽车传导充电用插头、插座、车辆耦合器和车辆插孔通用要求

GBT 20234-2006电动汽车传导充电用插头、插座、车辆耦合器和车辆插孔通用要求…

查看全部问答>

ADSP21161N的时钟问题

请问用多片ADSP21161N时不可以用外部晶振作为CLKIN的输入吗?看ADSP21161N的数据手册24页这么说的,不知道是不是理解错了。想用FPGA来驱动4片ADSP21161N时钟信号,现在不知道该怎么办了。。。请高人指点,谢谢。…

查看全部问答>