单片机C语言程序设计实训100例—基于8051+Proteus仿真(6)

2019-04-13 23:07

//主程序 void main() {

LED=1; EA=1; EX0=1; IT0=1; while(1);

}

//INT0中断函数

void EX_INT0() interrupt 0 { LED=~LED; //控制LED亮灭 }

26 INT0及INT1中断计数

/* 名称:INT0及INT1中断计数 说明:每次按下第1个计数键时,第1组计数值累加并显示在右边3只数

码管上, 每次按下第2个计数键时,第

2组计数值累加并显示在左边3只数码管上,后两个按键分别清零。 */

#include #define uchar unsigned char #define uint unsigned int sbit K3=P3^4; //2个清零键 sbit K4=P3^5;

//数码管段码与位码

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar code DSY_Scan_Bits[]={0x20,0x10,0x08,0x04,0x02,0x01}; //2组计数的显示缓冲,前3位一组,后3位一组 uchar data Buffer_Counts[]={0,0,0,0,0,0}; uint Count_A,Count_B=0; //延时

void DelayMS(uint x) {

uchar t;

while(x--) for(t=0;t<120;t++); }

//数据显示 void Show_Counts() {

uchar i;

Buffer_Counts[2]=Count_A/100;

26

Buffer_Counts[1]=Count_A0/10; Buffer_Counts[0]=Count_A; if( Buffer_Counts[2]==0) { Buffer_Counts[2]=0x0a; if( Buffer_Counts[1]==0) Buffer_Counts[1]=0x0a;

}

Buffer_Counts[5]=Count_B/100; Buffer_Counts[4]=Count_B0/10; Buffer_Counts[3]=Count_B; if( Buffer_Counts[5]==0) { Buffer_Counts[5]=0x0a; if( Buffer_Counts[4]==0)

Buffer_Counts[4]=0x0a; }

for(i=0;i<6;i++) { P2=DSY_Scan_Bits[i];

P1=DSY_CODE[Buffer_Counts[i]];

DelayMS(1);

} }

//主程序

void main() { IE=0x85; PX0=1; //中断优先 IT0=1; IT1=1; while(1) { if(K3==0) Count_A=0; if(K4==0) Count_B=0; Show_Counts();

}

}

//INT0中断函数

void EX_INT0() interrupt 0 {

Count_A++;

}

//INT1中断函数

void EX_INT1() interrupt 2

27

{ }

Count_B++;

27 定时器控制单只LED

/* 名称:定时器控制单只LED 说明:LED在定时器的中断例程控制下不断闪烁。 */

#include #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; uchar T_Count=0; //主程序

void main() { TMOD=0x00; //定时器0工作方式0 TH0=(8192-5000)/32; //5ms定时

TL0=(8192-5000)2; IE=0x82; //允许T0中断 TR0=1;

while(1); }

//T0中断函数

void LED_Flash() interrupt 1 { TH0=(8192-5000)/32; //恢复初值 }

TL0=(8192-5000)2;

if(++T_Count==100) //0.5s开关一次LED { }

LED=~LED; T_Count=0;

28 TIMER0控制流水灯

/* 名称:TIMER0控制流水灯 说明:定时器控制P0、P2口的LED滚动显示,本例未使用中断函数。 */

#include #include

28

#define uchar unsigned char #define uint unsigned int //主程序 void main() { }

29 定时器控制4个LED滚动闪烁

/* 名称:定时器控制4个LED滚动闪烁 说明:4只LED在定时器控制下滚动闪烁。 */

#include #define uchar unsigned char #define uint unsigned int sbit B1=P0^0; sbit G1=P0^1; sbit R1=P0^2; sbit Y1=P0^3; uint i,j,k; //主程序 void main() {

29

uchar T_Count=0; P0=0xfe;

P2=0xfe;

TMOD=0x01; TH0=(65536-40000)/256;

//定时器0工作方式1 //40ms定时

TL0=(65536-40000)%6; TR0=1; //启动定时器 while(1) { }

if(TF0==1) { }

TF0=0;

TH0=(65536-40000)/256; TL0=(65536-40000)%6; if(++T_Count==5) { }

P0=_crol_(P0,1); P2=_crol_(P2,1); T_Count=0;

//恢复初值

i=j=k=0; P0=0xff;

TMOD=0x02; TH0=256-200; TL0=256-200; IE=0x82; TR0=1; while(1);

//定时器0工作方式2

//200us定时

//启动定时器

}

//T0中断函数

void LED_Flash_and_Scroll() interrupt 1 { if(++k<35) return; //定时中断若干次后执行闪烁 }

30 T0控制LED实现二进制计数

/* 名称:T0控制LED实现二进制计数 说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在T0引脚的按键每次按下时,会使计数寄存器的值递增,其值通过LED以二进制形式显示 */

#include //主程序

void main() { TMOD=0x05; //定时器0为计数器,工作方式1,最大计数值65535 TH0=0; //初值为0

k=0;

switch(i) {

case 0: case 1: case 2: case 3:

B1=~B1;break; G1=~G1;break; R1=~R1;break; Y1=~Y1;break;

default:i=0; }

if(++j<300) return; //每次闪烁持续一段时间 j=0;

P0=0xff; //关闭显示

i++; //切换到下一个LED

TL0=0;

30


单片机C语言程序设计实训100例—基于8051+Proteus仿真(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:湘教版小学六年级美术下册全册教案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: