13163935507 发表于 2022-12-21 18:54:18

大家好,帮我指点一下比较器程序好吗?

大家好,帮我指点一下比较器程序好吗?也有图片也有原码,帮帮忙看一下。#include "reg51.h"
#include "intrins.h"
//STC15w204s
void key_scan(void);        //ÉùÃ÷¿ª¹ØÉ¨Ãè
unsignedchart1=1;        //¶¨Ê±¿ª
unsignedchart2=1;        //¶¨Ê±¿ª
unsigned int hm1,hm2;        //ºÁÃë
unsigned int m1,m2;                //Ãë
sbitb= P3^2;                                //7½ÅָʾµÆ¿ØÖƽÅ
sbit        a=P3^3;                                        //8½Å¿ØÖƽÅ
        sfrCMPCR1=0xE6;        // ±È½ÏÆ÷¿ØÖƼĴæÆ÷1
        #defineCMPEN0x80           //        CMPCR1.7 :±È½ÏÆ÷Ä£¿éʹÄÜλ
        #defineCMPIF0x40                //CMPCR1.6 : ±È½ÏÆ÷Öжϱê־λ
        #definePIE                 0x20           // CMPCR1.5 :±È½ÏÆ÷ÉÏÉýÑØÖжÏʹÄÜλ
        #definePIS0x08                   //CMPCR1.3 :±È½ÏÆ÷Õý¼«Ñ¡Ôñλ
        #defineNIS0x04               //CMPCR1.2 :±È½ÏÆ÷¸º¼«Ñ¡Ôñλ
        #defineCMPOE 0x02                        //CMPCR1.1 :±È½ÏÆ÷Êä³ö½á¹û¿ØÖÆÎ»
        #defineCMPRES 0x01                        //CMPCR1.0 : ±È½ÏÆ÷±È½Ï½á¹û±ê־λ
sfr CMPCR2 = 0xE7;                                 //±È½ÏÆ÷¿ØÖƼĴæÆ÷2
#define INVCMPO 0x80                         //±È½ÏÆ÷½á¹û·´ÏòÊä³ö¿ØÖÆÎ»
#define DISFLT 0x40                         //±È½ÏÆ÷Êä³öÂ˲¨Ê¹ÄÜ¿ØÖÆÎ»
#define LCDTY 0x3F                                 //±È½ÏÆ÷Êä³öµÄÇø¶¶Ê±¼ä¿ØÖÆ
        P5M1        = 0x30;                                                //P5.4½ÅΪ¸ß×èÊäÈëÉùÃ÷
        P5M0         = 0x00;                                                //P5.5½ÅΪ¸ß×èÊäÈëÉùÃ÷
       
//void cmp_isr() interrupt 21 using 1 //±È½ÏÆ÷ÖжÏÏòÁ¿Èë¿Ú
//{
//        CMPCR1 &= ~CMPIF;          //Çå³ýÍê³É±êÖ¾
//        a = !!(CMPCR1 & CMPRES); //½«±È½ÏÆ÷½á¹ûCMPRESÊä³ö²âÊÔ¿ÚÏÔʾ
//        b = !!(CMPCR1 & CMPRES); //½«±È½ÏÆ÷½á¹ûCMPRESÊä³ö²âÊÔ¿ÚÏÔʾ
//}
void Timer0_Init(void)                //50ºÁÃë12·ÖƵ@11.0592MHz       
{
                TMOD &= 0xF0;                //¶¨Ê±Æ÷ģʽ0
                TL0 = 0x00;                //ÉèÖö¨Ê±Æ÷³õʼ»¯
                TH0 = 0x4C;                //ÉèÖö¨Ê±Æ÷³õʼ»¯
                TF0 = 0;                //Çå³ýTF0±êÖ¾
                TR0 = 1;                //¶¨Ê±Æ÷0¿ªÊ¼¼ÆÊ±¿ª
                ET0=1;                //ʹÄܶ¨Ê±Æ÷ÖжϿª
                EA=1;                //×Ü¿ª¹Ø¿ª
                PT0=1;//¸ßÓÅÏȼ¶       
}
void main()
{
        Timer0_Init();
        CMPCR1 = 0; //³õʼ»¯±È½ÏÆ÷¿ØÖƼĴæÆ÷1
        CMPCR2 = 0;//³õʼ»¯±È½ÏÆ÷¿ØÖƼĴæÆ÷2
        CMPCR1 &= ~PIS; //Ñ¡ÔñÍⲿp5.5Ϊ±È½ÏÆ÷Õý¼«ÊäÈëÔ´
//        CMPCR1 |= NIS; //Ñ¡ÔñÍⲿp5.4Ϊ±È½ÏÆ÷¸º¼«ÊäÈëÔ´
        CMPCR1 &= ~NIS; //Ñ¡ÔñÄÚ²¿BandGapµçѹBGVΪ±È½ÏÆ÷µÄ¸º¼«ÊäÈëÔ´
        CMPCR1 |= CMPEN;//ʹÄÜ±È½ÏÆ÷
        CMPCR1 &= ~CMPIF;          //Çå³ýÍê³É±êÖ¾
        CMPCR2 &= ~DISFLT;        //ʹÄÜ±È½ÏÆ÷Êä³ö¶ËµÄ0.1us ÂËÆÃµç·
        CMPCR1 |= PIE; //±È½ÏÆ÷ÉÏÉýÑØÖжÏʹÄÜλ
        a =~ !!(CMPCR1 & CMPRES); //½«±È½ÏÆ÷½á¹ûCMPRESÊä³ö²âÊÔ¿ÚÏÔʾ
        b =~ !!(CMPCR1 & CMPRES); //½«±È½ÏÆ÷½á¹ûCMPRESÊä³ö²âÊÔ¿ÚÏÔʾ
//        while (!(CMPCR1 & CMPIF)); //²éѯ±È½ÏÍê³É±êÖ¾
                P5M1        = 0x30;                                        //P5.4½ÅΪ¸ß×èÊäÈë
                P5M0         = 0x00;                                        //P5.4½ÅΪ¸ß×èÊäÈë
while (1)
        {
        static signed char zt=0;                 //״̬»ú ¾²Ì¬±äÁ¿
                {
                if((CMPCR1 & 0x01)==1 && m2 <0)        //±È½ÏÆ÷¸ßÓëm2СÓÚ³Ë10Ãë
                {
                        hm1=0;
                        m1=0;
                }
                }
                switch (zt)
        {
                case 0:
                {
                        if((CMPCR1 & 0x01)==1)        //±È½ÏÆ÷Õý±È¸º¸ß
                        {               
                                zt=1;
                        }
                break;
                }
                        case 1:
                        {
                        if((CMPCR1 & 0x01)==1)        //±È½ÏÆ÷Õý±È¸ºÈ·Êµ¸ß
                                {               
                                        zt=2;                                                 //״̬2
                                        b=0;                                                //7½ÅÊä³öµÍµçƽÿÂ̵ÆÃð
                                }
                                else
                                        {
                                                zt=0;               //·ñÔò»Øµ½×´Ì¬0
                                        }
                        }
                {       
                break;
                }
                case 2:
                        if((CMPCR1 & 0x01)==0)        //±È½ÏÆ÷Õý±È¸ºµÍ
                        {
                                zt=3;                                                        //״̬3
                        }       
                {
                break;
                }
                        case 3:
                {
                        if((CMPCR1 & 0x01)==0)        //±È½ÏÆ÷Õý±È¸ºÈ·ÊµµÍ
               
                                {
                                        zt=0;
                                        b=1;           //7½ÅÊä³ö¸ßµçƽÿÂ̵ÆÃð
                                }
                                else
                                        {
                                                zt=2;                //·ñÔò»Øµ½×´Ì¬2
                                        }
                break;
                }
                default:
                {
                        break;
                }
                }

        }
}
//¶¨Ê±Æ÷ÖÐ¶Ï ³õʼ»¯
void Timer0_Rountine(void) interrupt 1
{
        if(t1)
        {if((CMPCR1 & 0x01)==1)        //±È½ÏÆ÷Õý±È¸ºÈ·Êµ¸ß
                        hm1++;                                //ºÁÃë¼Ó¼Ó       
                        if(hm1==20)                //         µÈÓڴΠ       ÅжÏ50ºÁÃë½øÀ´Ò»´ÎµÈÓÚ2Ãë
                        {
                                hm1        =0;                        //ºÁÃëÇåÁã               
                                        m1++;                        //¼Ó¼Ó
                                        if(m1==1)//³Ë2Ãë
                                        {
                                        m1=0;                //ÃëÇåÁã
                                        a=~a;        //8½ÅÊä³öµÍµçƽ       
                                        }
                                }
                        }
        if(t2)
                {
                        hm2++;                      //ÃëÇåÁã
                        if(hm2 == 200)       //µÈÓÚ10Ãë
                        {
                                hm2 = 0;                        //ÃëÇåÁã
                                m2++;                                        //Ãë¼Ó¼Ó
                                if(m2==4320)        //³Ë10Ãë
                                {
                                        m2=0;                                //ÃëÇåÁã
                                        a=0;                                //8½ÅÊä³öµÍµçƽ       
                                }
                        }       
                }               
        }
谢谢!

神农鼎 发表于 2022-12-21 20:05:30

您贴上你设计的比较器具体应用的线路图的PDF,提下具体比较器要实现啥功能,
大家抽空帮你写个正确的比较器程序给您,如有网友花时间学习您的程序后帮您一起提高,也是很美好的事

zhp 发表于 2022-12-21 20:56:11

如果上面的代码就是你原始的代码,里面有两个问题:
1、程序中使能了比较中断,但比较器中断服务程序被注释掉了
   这样如果,发生比较器中断,程序必然会乱掉
2、代码中使用的是状态机对比较器进行去抖动处理
   但每个状态之间没有添加延时,而主循环太快,
   根本达不到去抖动的目的

13163935507 发表于 2022-12-22 12:25:25

zhp 发表于 2022-12-21 20:56
如果上面的代码就是你原始的代码,里面有两个问题:
1、程序中使能了比较中断,但比较器中断服务程序被注释 ...

谢谢谢谢,太感谢了。那就不把比较器中断服务程序注释掉,状态机每次进来有没有50毫秒。因为我不懂。我是抄百度的。我们可以加微信吗,你加我微信好吗?13163935507是我的微信号。

神农鼎 发表于 2022-12-22 12:51:55



在这学基本原理,进步快
在这看32位8051教学视频,送USB转双串口, 6M bps下载速度 - 开源广场及教学视频交流 国芯论坛 (stcaimcu.com)

页: [1]
查看完整版本: 大家好,帮我指点一下比较器程序好吗?