欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)的集成邏輯門(mén)測(cè)試儀的設(shè)計(jì)(電路+程序)
[打印本頁(yè)]
作者:
上善-若水
時(shí)間:
2018-12-21 08:22
標(biāo)題:
51單片機(jī)的集成邏輯門(mén)測(cè)試儀的設(shè)計(jì)(電路+程序)
電路原理圖如下:
1.jpg
(265.72 KB, 下載次數(shù): 68)
下載附件
2018-12-21 08:22 上傳
/*-----------------------------數(shù)字集成電路芯片測(cè)試儀C程序-清單------------------------------*/
//修改時(shí)間:2018
//-------------------------------------------------------------------------------------------
#include<reg52.h>
#include <intrins.h>
#include <stdio.h>
//這是頭文件必須包含
/*==============================宏定義==============================*/
#define LCD_data P0 //數(shù)據(jù)口
#define M 4 //要測(cè)試的芯片好壞的個(gè)數(shù)
#define N 8
#define input1 P1 //用于檢測(cè)的引腳
#define input2 P2
/*======================液晶宏定義、初始化引腳=========================*/
void delay(unsigned int z);
void charfill(unsigned char c); //整屏顯示A代表的ASCII字符子程序
void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s);//在(cx,cy)字符位置寫(xiě)字符串子程序
void putstr(unsigned char code *s); //定位寫(xiě)字符串子程序
void putchars(unsigned char c); //在(CXPOS,CYPOS)字符位置寫(xiě)字符子程序
unsigned char getchars(void); //CXPOS,CYPOS)字符位置讀字符子程序
void charlcdpos(void); //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
void charcursornext(void); //置字符位置為下一個(gè)有效位置子程序
void lcdreset(void); //SMC1602系列液晶顯示控制器初始化子程序
void delay3ms(void); //延時(shí)3MS子程序
void lcdwc(unsigned char c); //送控制字到液晶顯示控制器子程序
void lcdwd(unsigned char d); //送控制字到液晶顯示控制器子程序
unsigned char lcdrd(void); //讀數(shù)據(jù)子程序
void lcdwaitidle(void); //忙檢測(cè)子程序
unsigned char data CXPOS; //列方向地址指針(用于CHARLCDPOS子程序)
unsigned char data CYPOS; //行方向地址指針(用于CHARLCDPOS子程序)
sbit RSPIN = P3^5; //RS對(duì)應(yīng)單片機(jī)引腳
sbit RWPIN = P3^4; //RW對(duì)應(yīng)單片機(jī)引腳
sbit EPIN = P3^3; //E對(duì)應(yīng)單片機(jī)引腳
/*==============================宏定義==============================*/
unsigned char detect(); //自動(dòng)檢測(cè)引腳
/*=============================定義按鍵=============================*/
sbit key1=P3^0; // 選擇檢測(cè)芯片
sbit key2=P3^1; // 確定選擇的芯片
sbit key3=P3^2; // 自動(dòng)檢測(cè)
sbit key4=P3^6; // 繼電器的切換
unsigned char *name[]={"74LS00 Y=/AB","74LS04 Y=/A","74LS20 Y=/ABCD","74LS86 Y=/A⊕B","74LS74","74LS92","ERROR"};
/*==============================按鍵的標(biāo)志位=========================*/
unsigned char flag=0; //要選擇的芯片型號(hào)在已定義字符數(shù)組中的序號(hào)
unsigned char flag1=0;
unsigned char flag2=0; //用來(lái)標(biāo)示某芯片各通道檢測(cè)均完好的標(biāo)志位
unsigned char k=0; //返回自動(dòng)檢測(cè)后芯片序號(hào)在已定義的數(shù)組中的序號(hào)
unsigned char code LS00[4][4]={
0x3f,0x3f,0x1b,0x1b, //74ls00
0x24,0x24,0x24,0x24,
0x36,0x36,0x36,0x36,
0x2d,0x2d,0x2d,0x2d,
};
unsigned char code LS04[2][4]={
0x2a,0x2a,0x2a,0x2a, //74ls04
0x3f,0x3f,0x15,0x15,
};
unsigned char code LS20[16][4]={
0x24,0x24,0x24,0x24, //74ls20
0x25,0x25,0x25,0x25,
0x26,0x26,0x26,0x26,
0x27,0x27,0x27,0x27,
0x2c,0x2c,0x2c,0x2c,
0x2d,0x2d,0x2d,0x2d,
0x2e,0x2e,0x2e,0x2e,
0x2f,0x2f,0x2f,0x2f,
0x34,0x34,0x34,0x34,
0x35,0x35,0x35,0x35,
0x36,0x36,0x36,0x36,
0x37,0x37,0x37,0x37,
0x3c,0x3c,0x3c,0x3c,
0x3d,0x3d,0x3d,0x3d,
0x3e,0x3e,0x3e,0x3e,
0x3f,0x3f,0x1f,0x1f,
};
unsigned char code LS86[4][4]={
0x24,0x24,0x00,0x00, //74ls86
0x36,0x36,0x36,0x36,
0x2d,0x2d,0x2d,0x2d,
0x3f,0x3f,0x1b,0x1b,
};
unsigned char code IC[M][N]={
0x24,0x24,0x24,0x24,0x3f,0x3f,0x1b,0x1b, //7400
0x3f,0x3f,0x15,0x15,0x3f,0x3f,0x15,0x15, //7404
0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,0x1f,0x1f, //7420
0x3f,0x3f,0x1b,0x1b,0x3f,0x3f,0x1b,0x1b, //7486
};
void main()
{
unsigned char i,output1,output2;
lcdreset(); //液晶顯示控制器初始化
putstrxy(0,0,"PLEASE CHOOSE 74LS CHIP"); //顯示歡迎界面
while(1)
{
if(key1==0)
{
delay(100);
if(key1==0)
{
if(flag==4)
{
flag=0;
}
flag++;
switch(flag)
{
case 1:charfill(' '); putstrxy(0,0,"NOW '74LS00'");break;
case 2:charfill(' '); putstrxy(0,0,"NOW '74LS04'");break;
case 3:charfill(' '); putstrxy(0,0,"NOW '74LS20'");break;
case 4:charfill(' '); putstrxy(0,0,"NOW '74LS86'");
}
}
}
if(flag==1&&key2==0)
{
for(i=0;i<4;i++)
{
input1=LS00[i][0];
input2=LS00[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS00[i][2]||output2!=LS00[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS00[i][2]&&output2==LS00[i][3])
{
flag2++;
}
}
if(flag2==4)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(flag==2&&key2==0)
{
for(i=0;i<2;i++)
{
input1=LS04[i][0];
input2=LS04[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS04[i][2]||output2!=LS04[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS04[i][2]&&output2==LS04[i][3])
{
flag2++;
}
}
if(flag2==2)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(flag==3&&key2==0)
{
for(i=0;i<16;i++)
{
input1=LS20[i][0];
input2=LS20[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS20[i][2]||output2!=LS20[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS20[i][2]&&output2==LS20[i][3])
{
flag2++;
}
}
if(flag2==16)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(flag==4&&key2==0)
{
for(i=0;i<4;i++)
{
input1=LS86[i][0];
input2=LS86[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS86[i][2]||output2!=LS86[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS86[i][2]&&output2==LS86[i][3])
{
flag2++;
}
}
if(flag2==4)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(key3==0)
{
k=detect();
charfill(' ');
putstrxy(0,0,"This is:");
putstrxy(0,5,name[k]);
}
}
}
//延時(shí)函數(shù)
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*============================14腳芯片識(shí)別函數(shù)=======================*/
unsigned char detect() //14腳芯片識(shí)別函數(shù)
{
unsigned char i,output1,output2;
//7474的檢測(cè)
P1=0xff; //初始化測(cè)試端口
P2=0xff;
input1=0x3b;
input2=0x39;
delay(5);
input1=0x3f; //上升沿
input2=0x3d;
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==0x1f&&output2==0x2d)
{
return (4);
}
//7400/04/20/86的自動(dòng)檢測(cè)
P1=0xff; //初始化測(cè)試端口
P2=0xff;
for(i=0;i<M;i++)
{
input1=IC[i][0];
input2=IC[i][1];
delay(5);
output1=input1&0x3f; //將芯片邏輯結(jié)果input1通過(guò)&0x3f取出
output2=input2&0x3f;
if(output1==IC[i][2]&&output2==IC[i][3])
{
input1=IC[i][4];
input2=IC[i][5];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==IC[i][6]&&output2==IC[i][7])
{
return i;
}
}
}
key4=0; //檢測(cè)7492時(shí),先用繼電器江電源供電引腳切換
P1=0xff; //初始化測(cè)試端口
P2=0xff;
input1=0x3f; //7492的檢測(cè)
input2=0x3f;
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==0x3f&&output2==0x01)
{
delay(100);key4=1;return (5);
}
delay(100);
key4=1; //測(cè)試結(jié)束,將電源供電引腳切換回原狀態(tài)
return (6);
}
//-------------------------------------------------------------------------------
void charfill(unsigned char c) //整屏顯示A代表的ASCII字符子程序
{ for(CXPOS=CYPOS=0;1;)
{ putchars(c); //定位寫(xiě)字符
charcursornext(); //置字符位置為下一個(gè)有效位置
if((CXPOS==0) && (CYPOS==0)) break;
}
}
//子程序名稱:void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s).
//功能:在(cx,cy)字符位置寫(xiě)字符串.
//-------------------------------------------------------------------------------
void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
{ //在(cx,cy)字符位置寫(xiě)字符串子程序
CXPOS=cx; //置當(dāng)前X位置為cx
CYPOS=cy; //置當(dāng)前Y位置為cy
for(;*s!=0;s++) //為零表示字符串結(jié)束,退出
{ putchars(*s); //寫(xiě)1個(gè)字符
charcursornext(); //字符位置移到下一個(gè)
}
}
//-------------------------------------------------------------------------------
//子程序名稱:void putstr(unsigned char *s).
//功能:在(CXPOS,CYPOS)字符位置寫(xiě)字符串.
//-------------------------------------------------------------------------------
void putstr(unsigned char code *s) //定位寫(xiě)字符串子程序
{ for(;*s!=0;s++) //為零表示字符串結(jié)束,退出
{ putchars(*s); //寫(xiě)1個(gè)字符
charcursornext(); //字符位置移到下一個(gè)
}
}
//-------------------------------------------------------------------------------
//子程序名稱:void putchar(unsigned char c).
//功能:在(CXPOS,CYPOS)字符位置寫(xiě)字符.
//-------------------------------------------------------------------------------
void putchars(unsigned char c) //在(CXPOS,CYPOS)字符位置寫(xiě)字符子程序
{
charlcdpos(); //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
lcdwd(c); //寫(xiě)字符
}
//-------------------------------------------------------------------------------
//子程序名稱:unsigned char getchar(void).
//功能:在(CXPOS,CYPOS)字符位置讀字符.
//-------------------------------------------------------------------------------
unsigned char getchars(void) //在(CXPOS,CYPOS)字符位置讀字符子程序
{
charlcdpos(); //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
return lcdrd(); //讀字符
}
//-------------------------------------------------------------------------------
//以下charlcdpos,charcursornext,lcdreset為HD44780兼容芯片的液晶顯示控制器的
//16字符X2行的SMC1602系列標(biāo)準(zhǔn)字符點(diǎn)陣型液晶顯示模塊的接口程序.
//-------------------------------------------------------------------------------
//子程序名稱:void charlcdpos(void).
//功能:設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址.
//-------------------------------------------------------------------------------
void charlcdpos(void) //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
{
CXPOS&=0X0f; //X位置范圍(0到15)
CYPOS&=0X01; //Y位置范圍(0到1)
if(CYPOS==0) //(第一行)X: 第0----15個(gè)字符
lcdwc(CXPOS|0x80); // DDRAM: 0----0FH
else //(第二行)X: 第0----15個(gè)字符
lcdwc(CXPOS|0xC0); // DDRAM: 40----4FH
}
//-------------------------------------------------------------------------------
//子程序名稱:void charcursornext(void).
//功能:置字符位置為下一個(gè)有效位置.
//-------------------------------------------------------------------------------
void charcursornext(void) //置字符位置為下一個(gè)有效位置子程序
{
CXPOS++; //字符位置加1
if(CXPOS>15) //字符位置CXPOS>15表示要換行
{ CXPOS=0; //置列位置為最左邊
CYPOS++; //行位置加1
CYPOS&=0X1; //字符位置CYPOS的有效范圍為(0到1)
}
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdreset(void).
//功能:液晶顯示控制器初始化.
//-------------------------------------------------------------------------------
void lcdreset(void) //SMC1602系列液晶顯示控制器初始化子程序
{ //1602的顯示模式字為0x38
lcdwc(0x38); //顯示模式設(shè)置第一次
delay3ms(); //延時(shí)3MS
lcdwc(0x38); //顯示模式設(shè)置第二次
delay3ms(); //延時(shí)3MS
lcdwc(0x38); //顯示模式設(shè)置第三次
delay3ms(); //延時(shí)3MS
lcdwc(0x38); //顯示模式設(shè)置第四次
delay3ms(); //延時(shí)3MS
lcdwc(0x08); //顯示關(guān)閉
lcdwc(0x01); //清屏
delay3ms(); //延時(shí)3MS
lcdwc(0x06); //顯示光標(biāo)移動(dòng)設(shè)置
lcdwc(0x0C); //顯示開(kāi)及光標(biāo)設(shè)置
}
void delay3ms(void) //延時(shí)3MS子程序
{ unsigned char i,j,k;
for(i=0;i<3;i++)
for(j=0;j<64;j++)
for(k=0;k<51;k++);
}
//-------------------------------------------------------------------------------
//以下lcdwc,lcdwd,lcdrd為HD44780兼容芯片的MCS51模擬口線方式的基本子程序,
//lcdwaitidle為內(nèi)部子程序.
//-------------------------------------------------------------------------------
//子程序名稱:void lcdwc(unsigned char c).
//功能:送控制字到液晶顯示控制器.
//-------------------------------------------------------------------------------
void lcdwc(unsigned char c) //送控制字到液晶顯示控制器子程序
{
lcdwaitidle(); //HD44780液晶顯示控制器忙檢測(cè)
RSPIN=0; //RS=0 RW=0 E=高電平
RWPIN=0;
P0=c;
EPIN=1;
_nop_();
EPIN=0;
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdwd(unsigned char d).
//功能:送數(shù)據(jù)到液晶顯示控制器.
//-------------------------------------------------------------------------------
void lcdwd(unsigned char d) //送控制字到液晶顯示控制器子程序
{
lcdwaitidle(); //HD44780液晶顯示控制器忙檢測(cè)
RSPIN=1; //RS=1 RW=0 E=高電平
RWPIN=0;
P0=d;
EPIN=1;
_nop_();
EPIN=0;
}
//-------------------------------------------------------------------------------
//子程序名稱:unsigned char lcdrd(void).
//功能:讀數(shù)據(jù)到液晶顯示控制器.
//-------------------------------------------------------------------------------
unsigned char lcdrd(void) //讀數(shù)據(jù)子程序
{ unsigned char d;
lcdwaitidle(); //HD44780液晶顯示控制器忙檢測(cè)
P0=0xff;
RSPIN=1; //RS=1 RW=1 E=高電平
RWPIN=1;
EPIN=1;
_nop_();
d=P0;
EPIN=0;
return d;
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdwaitidle(void).
//功能:忙檢測(cè).
//-------------------------------------------------------------------------------
void lcdwaitidle(void) //忙檢測(cè)子程序
{ unsigned char i;
P0=0xff;
RSPIN=0; //RS=0 RW=1 E=高電平
RWPIN=1;
EPIN=1;
for(i=0;i<20;i++)
if((P0&0x80) == 0) break; //D7=0 表示LCD控制器空閑,則退出檢測(cè)
EPIN=0;
}
復(fù)制代碼
作者:
845209119
時(shí)間:
2018-12-22 01:05
弄個(gè)壓縮包就好了
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1