$ is ↑ 命题的"与非" 运算( "与非门" )
% is ↓ 命题的"或非"运算( "或非门" )
Input the source formula:
A*!S+R
Here!
8countTerms
NORMALc: (A*!S*!R)+(!A*!S*R)+(A*!S*R)+(!A*S*R)+(A*S*R)
NORMALd (A+S+R)*(A+!S+R)*(!A+!S+R)
!A+S*!R
Input the source formula:
(!A+B)_R
Here!
8countTerms
NORMALc: (!A*!B*!R)+(A*!B*!R)+(!A*B*!R)+(A*B*!R)+(!A*!B*R)+(!A*B*R)+(A*B*R)
NORMALd (!A+B+!R)
Error!
Input the source formula:
A#B
Here!
4countTerms
NORMALc: (A*!B)+(!A*B)
NORMALd (A+B)*(!A+!B)
Error!
Input the source formula:
A@B
Here!
4countTerms
NORMALc: (!A*!B)+(A*B)
NORMALd (!A+B)*(A+!B)
Error!
#include <string>
#include <stack>
#include <vector>
#include<iostream>
using namespace std
class formulaBase
{
private:
int numVar//The number of the variables in the formula
bool variables[100]//To store the value of the variables
string sourceFormula
string normalCFormula
string normalDFormula
string dualFormula
vector<char>vctofVar
vector<char>vctofPoland
stack<char>stk
bool isVar(char ch)const
void addMin(int minterm)
void addMax(int maxterm)
bool compute(int minterm)
void getInversePoland()
int countTerms(int n)
void assign(int minterm)
stack<bool>boolStk
public:
formulaBase()
formulaBase(const formulaBase&rhs)
~formulaBase()
void getSource()
string generateNormalC()
string generateNormalD()
string getDual()
void printSource()const{cout<<sourceFormula<<endl}
void printDNormal()const{cout<<normalDFormula<<endl}
void printCNormal()const{cout<<normalCFormula<<endl}
void printDual()const{cout<<dualFormula<<endl}
//void printTruthTable()
}
formulaBase::formulaBase()
{
for(int i=0i<100i++)variables[i]=false
numVar=0
}
formulaBase::formulaBase(const formulaBase&rhs)
{
sourceFormula=rhs.sourceFormula
for(int i=0i<100i++)variables[i]=false
numVar=0
}
formulaBase::~formulaBase()
{
while(!stk.empty())stk.pop()
vctofVar.clear()
vctofPoland.clear()
}
int formulaBase::countTerms(int n)
{
if(n==0)
{
cout<<"invalid input!"<<endl
exit(0)
}
switch(n)
{
case 1:return 2
case 2:return 4
default:
{
int tempA=2,tempB=2
for(int i=2i<=ni*=2)tempA*=tempA
i/=2
if(i==n)return tempA
i=n-i
for(int j=2j<=ij*=2)tempB*=tempB
for(j/=2j<ij++)tempB*=2
tempB*=tempA
return tempB
}
}
}
bool formulaBase::isVar(char ch)const
{
if (ch>='A'&&ch<='Z')
return true
return false
}
void formulaBase::getSource()
{
cout<<"Input the source formula:"<<endl
cin>>sourceFormula
/*if(!isValid(sourceFormula))
cout<<"Invalid input !"
"Operate again:"<<endl
cin>>sourceFormula*/
}
void formulaBase::getInversePoland()
{
char temp,temp1
for(int i=0sourceFormula[i]!='\0'i++)
{
temp=sourceFormula[i]
if(isVar(temp))
{
if(!variables[temp])
{
numVar++
vctofVar.push_back(temp)
variables[temp]=true
}
vctofPoland.push_back(temp)
}
else
switch(temp)
{
case'_':case'$': //
case'%':case'#':
case'@':
while(!stk.empty())
{
if(stk.top()==temp)
{
vctofPoland.push_back(temp)
stk.pop()
}
else break
}
stk.push(temp)
break
case '(':case '!':
stk.push(temp)
break
case '+':
while (!stk.empty())
{
if(stk.top()!='(')
{
temp1=stk.top()
vctofPoland.push_back(temp1)
stk.pop()
}
else break
}
stk.push(temp)
break
case '*':
while (!stk.empty())
{
temp1=stk.top()
if(stk.top()=='*'||stk.top()=='!')
{
vctofPoland.push_back(temp1)
stk.pop()
}
else
break
}
stk.push(temp)
break
case ')':
while (!stk.empty())
{
if(stk.top()!='(')
{
temp1=stk.top()
vctofPoland.push_back(temp1)
stk.pop()
}
else break
}
if(stk.empty())exit(0)
stk.pop()//pop the operator '('
break
}
}
while(!stk.empty())
{
temp1=stk.top()
vctofPoland.push_back(temp1)
stk.pop()
}
}
void formulaBase::assign(int minterm)
{
int temp=minterm
vector<char>::const_iterator itr=vctofVar.begin()
for(itr!=vctofVar.end()itr++)
{
variables[*itr]=bool(temp&1)
temp=temp>>1
}
}
bool formulaBase::compute(int minterm)
{
assign(minterm)
char temp
bool valueA,valueB
vector<char>::const_iterator itr=vctofPoland.begin()
while (itr!=vctofPoland.end())
{
temp=*itr
if(isVar(temp))boolStk.push(variables[temp])
else
switch(temp)
{
case '+':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=valueA||valueB
boolStk.push(valueA)
}
break
case '*':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=valueA&&valueB
boolStk.push(valueA)
}
break
case '!':
{
if(boolStk.empty())exit(0)
valueA=!(boolStk.top())
boolStk.pop()
boolStk.push(valueA)
}
break
case'_':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=(!valueA)||valueB
boolStk.push(valueA)
}
break
case'$':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=!(valueA&&valueB)
boolStk.push(valueA)
}
break
case'%':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=!(valueA||valueB)
boolStk.push(valueA)
}
break
case'#':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=(!valueA&&valueB)||(valueA&&!valueB)
boolStk.push(valueA)
}
break
case'@':
{
if(boolStk.size()<2)exit(0)
valueA=boolStk.top()
boolStk.pop()
valueB=boolStk.top()
boolStk.pop()
valueA=(valueA&&valueB)||(!valueA&&!valueB)
boolStk.push(valueA)
}
break
}
itr++
}
if(boolStk.size()!=1)
{
cout<<"Error in computing the value of minterm"<<endl
exit(0)
}
valueA=boolStk.top()
boolStk.pop()
return valueA
}
void formulaBase::addMin(int minterm)
{
int temp=minterm
vector<char>::const_iterator itr=vctofVar.begin()
normalCFormula+='('
while (itr!=vctofVar.end())
{
if(!variables[*itr])
normalCFormula+='!'
normalCFormula+=*itr
normalCFormula+='*'
itr++
}
normalCFormula+="\b)+"
}
void formulaBase::addMax(int maxterm)
{
int temp=maxterm
vector<char>::const_iterator itr=vctofVar.begin()
normalDFormula+='('
while (itr!=vctofVar.end())
{
if( variables[*itr])
normalDFormula+='!'
normalDFormula+=*itr
normalDFormula+='+'
itr++
}
normalDFormula+="\b)*"
}
string formulaBase::generateNormalC()
{
if(vctofPoland.size()==0)//This oeration has not been done yet!
getInversePoland()
cout<<"Here!"<<endl
int n=countTerms(numVar)
cout<<n<<"countTerms"<<endl
normalCFormula=' '
for(int i=0i<ni++)
{
if(compute(i))addMin(i)
}
normalCFormula+="\b "
return normalCFormula
}
string formulaBase::generateNormalD()
{
if(vctofPoland.size()==0)//This operation has not been done yet!!
getInversePoland()
int n=countTerms(numVar)
normalDFormula=' '
for(int i=0i<ni++)
{
if(!compute(i))addMax(i)
}
normalDFormula+="\b "
return normalDFormula
}
string formulaBase::getDual()
{
int i=0
char temp
dualFormula=' '
while ((temp=sourceFormula[i])!='\0')
{
switch(temp)
{
case '!':
{
i++
dualFormula+=sourceFormula[i]
break
}
case '+':dualFormula+='*'break
case '*':dualFormula+='+'break
case'(':case ')':dualFormula+=sourceFormula[i]
break
default:
if (isVar(temp))
{
dualFormula+='!'
dualFormula+=temp
}
else
{
cout<<"Error!"<<endl
exit(0)
}
}
i++
}
return dualFormula
}
/*void formulaBase::printTruthTable()//A const function is unable to call a nonconst function!!!
{
int i=0
int count=countTerms(numVar)
cout<<" TRUTH TABLE \n"
for( i=0i<=numVari++)cout<<"___"
cout<<endl
//for( i=0i<numVari++)cout<<'|'<<vctofVar[i]
//cout<<"|F|" <<endl
for( i=0i<=numVari++)cout<<"___"
cout<<endl
for(i=0i<counti++ )
{
int temp=i
for(int j=0j<numVarj++)
{
if(bool(temp&1))cout<<"|1"
else cout<<"|0"
temp=temp>>1
}
if(this->compute(i))cout<<"|1"
else cout<<"|0"
cout<<'|'<<endl
for( int k=0k<=numVark++)cout<<"___"
cout<<endl
}
}
*/
int main()
{
string str
formulaBase f
f.getSource()
str=f.generateNormalC()
cout<<"NORMALc:"<<str<<endl
str=f.generateNormalD()
cout<<"NORMALd"<<str<<endl
// cout<<"Coming here"<<endl
//f.printTruthTable()
str=f.getDual()
f.printDual()
return 0
}
Proteus用起来十分方便,其对中国学生最大的障碍就是很多朋友不知道自己想要寻找的器件用英文怎么说,从而无法在Proteus中快速找到自己需要的器件。下面,我们就简单先来了解一下Proteus中器件的种类。Proteus中常用的元器件被分成了25大类,为了方便快速地查找到相应器件,在Pick Devices(拾取元器件)对话框中,你应该首先选中相应的大类,然后使用关键词进行搜寻。
Proteus有25大类元器件分别为:
Analog ICs 模拟IC
CMOS 4000 series CMOS 4000系列
Data Converters 数据转换器
Diodes 二极管
Electromechanical机电设备(只有电机模型)
Inductors 电感
Laplace PrimitivesLaplace变换器
Memory ICs 存储器IC
Microprocessor ICs 微处理器IC
Miscellaneous杂类(只有电灯和光敏电阻组成的设备)
Modelling Primitives 模型基元
Operational Amplifiers 运算放大器
Optoelectronics 光电子器件
Resistors 电阻
Simulator Primitives 仿真基元
Switches &Relays 开关和继电器
Transistors 三极管
TTL 74、74ALS、74AS、74F、74HC、74HCT、74LS、74S series 74系列集成电路
除此之外,你还应熟悉常用器件的英文名称,ANY电子为您列举如下:
AND与门
ANTENNA天线
BATTERY 直流电源(电池)
BELL 铃,钟
BRIDEG 1 整流桥(二极管)
BRIDEG 2 整流桥(集成块)
BUFFER 缓冲器
BUZZER 蜂鸣器
CAP 电容
CAPACITOR电容
CAPACITOR POL 有极性电容
CAPVAR 可调电容
CIRCUIT BREAKER 熔断丝
COAX 同轴电缆
CON插口
CRYSTAL 晶振
DB 并行插口
DIODE 二极管
DIODE SCHOTTKY 稳压二极管
DIODE VARACTOR变容二极管
DPY_3-SEG 3段LED
DPY_7-SEG 7段LED
DPY_7-SEG_DP 7段LED(带小数点)
ELECTRO 电解电容
FUSE 熔断器
INDUCTOR 电感
INDUCTOR IRON 带铁芯电感
INDUCTOR3 可调电感
JFET N N沟道场效应管
JFET P P沟道场效应管
LAMP灯泡
LAMP NEDN 起辉器
LED 发光二极管
METER仪表
MICROPHONE 麦克风
MOSFET MOS管
MOTOR AC交流电机
MOTOR SERVO 伺服电机
NAND 与非门
NOR 或非门
NOT 非门
NPN NPN三极管
NPN-PHOTO感光三极管
OPAMP 运放
OR或门
PHOTO 感光二极管
PNP PNP三极管
NPN DAR NPN三极管
PNP DAR PNP三极管
POT 滑线变阻器
PELAY-DPDT双刀双掷继电器
RES1.2 电阻
RES3.4可变电阻
BRIDGE 桥式电阻
RESPACK 电阻排
SCR 晶闸管
PLUG 插头
PLUG AC FEMALE 三相交流插头
SOCKET 插座
SOURCE CURRENT电流源
SOURCE VOLTAGE 电压源
SPEAKER扬声器
SW 开关
SW-DPDY 双刀双掷开关
SW-SPST 单刀单掷开关
SW-PB 按钮
THERMISTOR 电热调节器
TRANS1 变压器
TRANS2 可调变压器
TRIAC三端双向可控硅
TRIODE 三极真空管
VARISTOR 变阻器
ZENER 齐纳二极管
当然了,熟记上面的内容并不能保证你能熟练找到需要的器件,和很多事情一样,在Proteus中查找需要的器件也需要经验积累。
比如,搜寻数码管,通常直接使用7seg进行搜索即可。
原理图常用库文件:
Miscellaneous Devices.ddb
Dallas Microprocessor.ddb
Intel Databooks.ddb
Protel DOS Schematic Libraries.ddb
PCB元件常用库:
Advpcb.ddb
General IC.ddb
Miscellaneous.ddb
分立元件库
部分 分立元件库元件名称及中英对照
AND 与门
ANTENNA 天线
BATTERY 直流电源
BELL 铃,钟
BVC 同轴电缆接插件
BRIDEG 1 整流桥(二极管)
BRIDEG 2 整流桥(集成块)
BUFFER 缓冲器
BUZZER 蜂鸣器
CAP 电容
CAPACITOR 电容
CAPACITOR POL 有极性电容
CAPVAR 可调电容
CIRCUIT BREAKER 熔断丝
COAX 同轴电缆
CON 插口
CRYSTAL 晶体整荡器
DB 并行插口
DIODE 二极管
DIODE SCHOTTKY 稳压二极管
DIODE VARACTOR 变容二极管
DPY_3-SEG 3段LED
DPY_7-SEG 7段LED
DPY_7-SEG_DP 7段LED(带小数点)
ELECTRO 电解电容
FUSE 熔断器
INDUCTOR 电感
INDUCTOR IRON 带铁芯电感
INDUCTOR3 可调电感
JFET N N沟道场效应管
JFET P P沟道场效应管
LAMP 灯泡
LAMP NEDN 起辉器
LED 发光二极管
METER 仪表
MICROPHONE 麦克风
MOSFET MOS管
MOTOR AC 交流电机
MOTOR SERVO 伺服电机
NAND 与非门
NOR 或非门
NOT 非门
NPN NPN三极管
NPN-PHOTO 感光三极管
OPAMP 运放
OR 或门
PHOTO 感光二极管
PNP 三极管
NPN DAR NPN三极管
PNP DAR PNP三极管
POT 滑线变阻器
PELAY-DPDT 双刀双掷继电器
RES1.2 电阻
RES3.4 可变电阻
RESISTOR BRIDGE ? 桥式电阻
RESPACK ? 电阻
SCR 晶闸管
PLUG ? 插头
PLUG AC FEMALE 三相交流插头
SOCKET ? 插座
SOURCE CURRENT 电流源
SOURCE VOLTAGE 电压源
SPEAKER 扬声器
SW ? 开关
SW-DPDY ? 双刀双掷开关
SW-SPST ? 单刀单掷开关
SW-PB 按钮
THERMISTOR 电热调节器
TRANS1 变压器
TRANS2 可调变压器
TRIAC ? 三端双向可控硅
TRIODE ? 三极真空管
VARISTOR 变阻器
ZENER ? 齐纳二极管
DPY_7-SEG_DP 数码管
SW-PB 开关
其他元件库
Protel Dos Schematic 4000 Cmos .Lib
40.系列CMOS管集成块元件库
4013 D 触发器
4027 JK 触发器
Protel Dos Schematic Analog Digital.Lib 模拟数字式集成块元件库
AD系列 DAC系列 HD系列 MC系列
Protel Dos Schematic Comparator.Lib 比较放大器元件库
Protel Dos Shcematic Intel.Lib INTEL公司生产的80系列CPU集成块元件库
Protel Dos Schematic Linear.lib 线性元件库
例555
Protel Dos Schemattic Memory Devices.Lib 内存存储器元件库
Protel Dos Schematic SYnertek.Lib SY系列集成块元件库
Protes Dos Schematic Motorlla.Lib 摩托罗拉公司生产的元件库
Protes Dos Schematic NEC.lib NEC公司生产的集成块元件库
Protes Dos Schematic Operationel Amplifers.lib 运算放大器元件库
Protes Dos Schematic TTL.Lib 晶体管集成块元件库 74系列
Protel Dos Schematic Voltage Regulator.lib 电压调整集成块元件库
Protes Dos Schematic Zilog.Lib 齐格格公司生产的Z80系列CPU集成块元件库
元件属性对话框中英文对照
Lib ref 元件名称
Footprint 器件封装
Designator 元件称号
Part 器件类别或标示值
Schematic Tools 主工具栏
Writing Tools 连线工具栏
Drawing Tools 绘图工具栏
Power Objects 电源工具栏
Digital Objects 数字器件工具栏
Simulation Sources 模拟信号源工具栏
PLD Toolbars 映象工具栏
找到你所需要的电子器件后,将器件拖入编辑页面中。右击菜单里面有一个pdf格式的显示部件资料的标签。点击即可查看所用部件的信息。
当然也可以直接在datasheet里面查看。
这个是 4输入或非门(带选通端) 属于逻辑运算 芯片 不属于单片机 是74系列 型号为7425(74hc25 74ls25等) 一个7425里有2个4输入或非门4输入或非门是指 只有当4个输入A和B为低电平(逻辑0)时输出为高电平(逻辑1)否则为0, 看图中意思应该是 k1-k4是四个中断源,一般情况为低电平,当产生中断时变为高电平,4个都无中断产生时,都为0 int1为1 当任何一个产生中断时变为1,int1由原来的1变为0产生一个下降沿中断给单片机起到中断的作用
你想扩展的用8输入或非门(不知道有没有)就行了 也可以用两个4输入或非门的输出与后给单片机的一个外部中断口 或两个4输入或非门的输出分别给单片机两个外部中断口
其实我认为8个中断的一般是很少用到的 你可以详细说明要求 不一定非要用中断完成的
如果是按键 在程序不大的情况下直接定时器中断扫描反而更方便
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)