大家好,帮我指点一下比较器程序好吗?
大家好,帮我指点一下比较器程序好吗?也有图片也有原码,帮帮忙看一下。#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½ÅÊä³öµÍµçƽ
}
}
}
}
谢谢! 您贴上你设计的比较器具体应用的线路图的PDF,提下具体比较器要实现啥功能,
大家抽空帮你写个正确的比较器程序给您,如有网友花时间学习您的程序后帮您一起提高,也是很美好的事 如果上面的代码就是你原始的代码,里面有两个问题:
1、程序中使能了比较中断,但比较器中断服务程序被注释掉了
这样如果,发生比较器中断,程序必然会乱掉
2、代码中使用的是状态机对比较器进行去抖动处理
但每个状态之间没有添加延时,而主循环太快,
根本达不到去抖动的目的 zhp 发表于 2022-12-21 20:56
如果上面的代码就是你原始的代码,里面有两个问题:
1、程序中使能了比较中断,但比较器中断服务程序被注释 ...
谢谢谢谢,太感谢了。那就不把比较器中断服务程序注释掉,状态机每次进来有没有50毫秒。因为我不懂。我是抄百度的。我们可以加微信吗,你加我微信好吗?13163935507是我的微信号。
在这学基本原理,进步快
在这看32位8051教学视频,送USB转双串口, 6M bps下载速度 - 开源广场及教学视频交流 国芯论坛 (stcaimcu.com)
页:
[1]