基于Proteus的多功能单片机仿真开发板内含多个程序模块.docx
- 文档编号:6163667
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:27
- 大小:125.96KB
基于Proteus的多功能单片机仿真开发板内含多个程序模块.docx
《基于Proteus的多功能单片机仿真开发板内含多个程序模块.docx》由会员分享,可在线阅读,更多相关《基于Proteus的多功能单片机仿真开发板内含多个程序模块.docx(27页珍藏版)》请在冰豆网上搜索。
基于Proteus的多功能单片机仿真开发板内含多个程序模块
1.流水灯同数码管报警实验
程序:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
uchartt,num,temp;
sbitdula=P2^6;
sbitwela=P2^7;
sbitBEEP=P2^3;//蜂鸣器控制端口P2.3
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
voidxu(uintz);
voiddelay(unsignedintcnt)//延时
{
while(--cnt);
}
voidbeep()//蜂鸣器响一声函数
{
unsignedchari;
for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短
{
delay(80);//参数决定发声的频率,估算值
BEEP=!
BEEP;//BEEP取反
}
BEEP=1;//喇叭停止工作,间歇的时间,可更改
delay(20000);//延时
}
voidmain()
{TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
dula=1;
P0=table[0];
dula=0;
wela=1;
P0=0xc0;
wela=0;
temp=0xfe;
while
(1)
{
P1=temp;
beep();
xu(100);
temp=_crol_(temp,1);
P1=0xff;
//beep();
xu(100);
//P0=0x8f;
//beef=1;
//wela=1;
//
}
}
voidxu(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidtime()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==10)
{
tt=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
2.矩阵键盘检测
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#include
sbitbeep=P2^3;
sbitdula=P2^6;
sbitwela=P2^7;
unsignedchari=100;
unsignedcharj,k,temp,key;
voiddelay(unsignedchari)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsignedcharnum)
{
P0=table[num];
//P0=0xff;
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
voidmain()
{
dula=0;
wela=0;
while
(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
break;
case0xde:
key=1;
break;
case0xbe:
key=2;
break;
case0x7e:
key=3;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
//P0=table[key];
/*P0=0xff;
dula=1;
while(i--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
dula=0;
wela=0;
P0=0xff;
dula=1;
dula=0;
P0=0xc5;
wela=1;
wela=0;*/
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;
break;
case0xdd:
key=5;
break;
case0xbd:
key=6;
break;
case0x7d:
key=7;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
/*P0=table[key];
dula=1;
//while(100--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
*/P1=0xfc;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
break;
case0xdb:
key=9;
break;
case0xbb:
key=10;
break;
case0x7b:
key=11;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
/*P0=table[key];
dula=1;
//while(100--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
*/P1=0xf8;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
key=12;
break;
case0xd7:
key=13;
break;
case0xb7:
key=14;
break;
case0x77:
key=15;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
/*P0=table[key];
dula=1;
//while(100--);
dula=0;
P0=0xc0;
wela=1;
wela=0;
*/P1=0xf0;
}
}
}
}
3.ADC模数试验
//拧动电位器,会在数码管的前三位显示0-255之间的数值。
这就是把模拟电压转换成数字信号。
//有些拧动电位器后数码管数可能不会动态变化,请用户按下实验板上的S22复位按键可更新数据
//这种显象产生的原因是和AD芯片自身的一些特性有关。
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitadrd=P3^7;//IO口定义
sbitadwr=P3^6;
sbitdiola=P2^5;
sbitdula=P2^6;
sbitwela=P2^7;
unsignedcharj,k,adval;
voiddelay(unsignedchari)//延时程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//数码管编码
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddisplay(ucharbai_c,ucharsh_c,ucharg_c)//显示程序
{
P0=table[bai_c];//显示百位
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
dula=0;
P0=table[sh_c];//显示十位
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[g_c];//显示个位
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
}
voidmain()//主程序
{
uchara,A1,A2,A2t,A3;
while
(1)
{
wela=1;
P0=0;//选通ADCS
adwr=0;//AD写入(随便写个什么都行,主要是为了启动AD转换)
_nop_();
adwr=1;
P0=0xff;//关闭ADCS
delay(10);
wela=0;//关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化
for(a=20;a>0;a--)//需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据
{//这里把显示部分放这里的原因也是为了增加写读之间的时间间隔
display(A1,A2,A3);
}//送去显示各位。
wela=1;//重新打开有AD片选信号锁存器的锁存端
P1=0xff;//读取P1口之前先给其写全1
P0=0;//选通ADCS
adrd=0;//AD读使能
adval=P1;//AD数据读取赋给P1口
adrd=1;
P0=0xff;//关闭ADCS
adwr=0;
P1=adval;//同时把AD的值送八个发光二极显示
A1=adval/100;//分出百,十,和个位
A2t=adval%100;
A2=A2t/10;
A3=A2t%10;
};
}
4.步进电机数码管显示控制试验
/*
1、本程序用于测试4相步进电机常规驱动
2、HJ-3G红色的线接到J6右边第1脚VCC上
3、速度不可以调节的过快,不然就没有力矩转动了
4、HJ-1G红色的线接到J6第一脚上,VCC,共5条线,请不要接反了。
5、S1为换向健,S2为增大健,S3为减少健,可以能过数码管显出大小。
*/
#include
#defineucharunsignedchar
sbitP30=P3^0;
sbitdula=P2^6;
sbitwela=P2^7;
sbitjia_key=P3^6;
sbitjian_key=P3^7;
sbitzf_key=P3^5;
bitflag=0;
ucharnum=0,show_num=2,maichong=4,table_begin=0;
ucharcodetable1[]={0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};
//ucharcodetable1[]={0x09,0x03,0x06,0x0c,0x08,0x04,0x02,0x01};
//ucharcodetable1[]={0x01,0x04,0x02,0x08,0x08,0x02,0x04,0x01};
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(uchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddisplay()
{
dula=0;
P0=table[show_num];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[0];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
voidkey()
{P30=0;
if(jia_key==0)
{
delay(5);
if(jia_key==0)
{
num++;
if(num==4)
num=3;
while(jia_key==0);
}
}
if(jian_key==0)
{
delay(5);
if(jian_key==0)
{
if(num!
=0)
num--;
else
num=0;
while(jian_key==0);
}
}
if(zf_key==0)
{
delay(5);
if(zf_key==0)
{
flag=~flag;
while(zf_key==0);
}
}
}
voiddispose()
{
switch(num)
{
case0:
show_num=2;
maichong=5;
break;
case1:
show_num=4;
maichong=4;
break;
case2:
show_num=6;
maichong=3;
break;
case3:
show_num=8;
maichong=2;
break;
}
if(flag==0)
{
table_begin=0;
}
else
table_begin=4;
}
voidqudong()
{
uchari,j;
for(j=0+table_begin;j<4+table_begin;j++)
{
P1=table1[j];
for(i=0;i { display(); } } } voidmain() { while (1) { key(); dispose(); qudong(); } } 5.红外接收LCD1602显示试验 //LCD1602对比度已调试好,可以直接使用。 //操作方法如下: //1.正确安装液晶1602,请查看使用手册目录下的液晶安装方法。 //2.下载本程序 //该程序使用LCD1602显示 //注意: 数码管锁存源码还没有写好,现在接收信号时数码管会有发光。 还有继电器会响,这是正常的 #include #include #include sbitdula=P2^6; sbitwela=P2^7; sbitJD=P0^6; sbitFM=P2^3; //#defineucharunsignedchar //#defineuintunsignedint //////////////////////////////////////////////// #defineTURE1 #defineFALSE0 //////////////////////////////////////////////// sbitIR=P3^3;//红外接口标志 sbitRS=P3^5;//Pin4 sbitRW=P3^6;//Pin5 sbitE=P3^4;//Pin6 sbitJDC=P0^6;// #defineDataP0//数据端口 voidioin()//IO口继电器、数码管锁存函数 { wela=1; P0=1; JD=0; wela=0; dula=1; P0=0; dula=0; } unsignedinthour,minute,second,count; charcodeTab[16]="0123456789ABCDEF"; chardataTimeNum[]=""; chardataTest1[]=""; //////////////////////////////////////////// unsignedcharirtime;//红外用全局变量 bitirpro_ok,irok; unsignedcharIRcord[4]; unsignedcharirdata[33]; voidShowString(unsignedcharline,char*ptr); ////////////////////////////////////////////// voidDelay(unsignedcharmS); voidIr_work(void); voidIrcordpro(void); //////////////////////////////////////////////////////////////// voidDelay(unsignedcharmS)//delaymS { unsignedcharus,usn; while(mS! =0) { usn=4; while(usn! =0) { us=0xf0; while(us! =0){us--;}; usn--; } mS--; } } ////////////////////////////////////////////////////////////////// //*************************************************************// ////////////////////////////////////////////////////////////////// voidtim0_isr(void)interrupt1using1//定时器0中断服务函数 { irtime++; } /////////////////////////////////////////////////////////////////////// voidex0_isr(void)interrupt0using0//外部中断0服务函数 { staticunsignedchari; staticbitstartflag; if(startflag) { if(irtime<63&&irtime>=33)//引导码TC9012的头码 i=0; irdata[i]=irtime; irtime=0; i++; if(i==33) { irok=1; i=0; } } else {irtime=0;startflag=1;} } //////////////////////////////////////////////////////////////////// voidTIM0init(void)//定时器0初始化 { TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00;//reloadvalue TL0=0x00;//initialvalue ET0=1;//开中断 TR0=1; } /////////////////////////////////////////////////////////////////// voidEX0init(void) { IT0=1;//Configureinterrupt0forfallingedgeon/INT0(P3.2) EX0=1;//EnableEX0Interrupt EA=1; } /****************************************************************/ /******************************************************************/ voidIr_work(void)//红外键值散转程序 { TimeNum[5]=Tab[IRcord
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Proteus 多功能 单片机 仿真 开发 内含 程序 模块