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

2019-04-13 23:07

}

TR0=1; while(1) { }

P1=TH0; P2=TL0;

//启动定时器

31 TIMER0与TIMER1控制条形LED

/* 名称:TIMER0与TIMER1控制条形LED 说明:定时器T0定时控制上一组条形LED,滚动速度较快

定时器T1定时控制下一组条形LED,滚动速度较慢

*/

#include #include

#define uchar unsigned char #define uint unsigned int uchar tc0=0,tc1=0; //主程序 void main() {

P0=0xfe; P2=0xfe; TMOD=0x11; //定时器0、定时器1均工作于方式1 TH0=(65536-15000)/256; //定时器0:15ms

TL0=(65536-15000)%6; TH1=(65536-50000)/256;

//定时器1:50ms

TL1=(65536-50000)%6; IE=0x8a; TR0=1; //启动定时器 TR1=1;

while(1); }

//T0中断函数

void Time0() interrupt 1 {

TH0=(65536-15000)/256; //恢复定时器0初值

TL0=(65536-15000)%6; if(++tc0==10) //150ms转换状态 { }

31

tc0=0;

P0=_crol_(P0,1);

}

//T1中断函数

void Time1() interrupt 3 { TH0=(65536-50000)/256; }

//恢复定时器1初值

TL0=(65536-50000)%6; if(++tc1==10) //500ms转换状态 { }

tc1=0;

P2=_crol_(P2,1);

32 10s的秒表

/* 名称:10s的秒表 说明:首次按键计时开始,再次按键暂停,第三次按键清零。 */

#include #define uchar unsigned char #define uint unsigned int sbit K1=P3^7;

uchar

i,Second_Counts,Key_Flag_Idx; bit Key_State; uchar

DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时

void DelayMS(uint ms) {

uchar t;

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

}

//处理按键事件

void Key_Event_Handle() {

if(Key_State==0) {

Key_Flag_Idx=(Key_Flag_Idx+1)%3; switch(Key_Flag_Idx) {

case 1: case 2:

EA=1;ET0=1;TR0=1;break; EA=0;ET0=0;TR0=0;break;

32

case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;

}

} }

//主程序 void main() { P0=0x3f; //显示00

P2=0x3f; i=0;

Second_Counts=0; Key_Flag_Idx=0;

//按键次数(取值0,1,2,3) Key_State=1;

//按键状态

TMOD=0x01;

//定时器0方式1 TH0=(65536-50000)/256; //定时器0:15ms

TL0=(65536-50000)%6; while(1) { if(Key_State!=K1) { DelayMS(10); Key_State=K1;

Key_Event_Handle();

}

} }

//T0中断函数

void DSY_Refresh() interrupt 1 { TH0=(65536-50000)/256;

//恢复定时器0初值

TL0=(65536-50000)%6; if(++i==2) //50ms*2=0.1s转换状态 { i=0;

Second_Counts++;

P0=DSY_CODE[Second_Counts/10]; P2=DSY_CODE[Second_Counts];

if(Second_Counts==100) Second_Counts=0;

//满100(10s)后显示00

}

}

33 用计数器中断实现100以内的按键计数

/* 名称:用计数器中断实现100以内的按键计数

说明:本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此

33

P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。 计数器的清零用外部中断0控制。

*/

#include #define uchar unsigned char #define uint unsigned int //段码 uchar

code

DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar Count=0; //主程序 void main() {

P0=0x00;

//计数器T0方式2 //计数值为1 //允许T0中断 //允许INT0中断 //允许CPU中断

P2=0x00;

TMOD=0x06; TH0=TL0=256-1; ET0=1; EX0=1; EA=1; IP=0x02; IT0=1; TR0=1; while(1) {

P0=DSY_CODE[Count/10]; P2=DSY_CODE[Count];

//设置优先级,T0高于INT0 //INT0中断触发方式为下降沿触发 //启动T0

}

}

//T0计数器中断函数

void Key_Counter() interrupt 1 { Count=(Count+1)0; //因为只有两位数码管,计数控制在100以内(00~99) }

//INT0中断函数

void Clear_Counter() interrupt 0 {

34

}

Count=0;

34 100 000s以内的计时程序

/* 名称:100 000s以内的计时程序 说明:在6只数码管上完成0~99 999.9s。 */

#include #include #define uchar unsigned char #define uint unsigned int //段码 uchar

code

DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //6只数码管上显示的数字

uchar Digits_of_6DSY[]={0,0,0,0,0,0}; uchar Count; sbit Dot=P0^7; //延时

void DelayMS(uint ms)

{ uchar t; while(ms--) for(t=0;t<120;t++); }

//主程序 void main() {

uchar i,j; P0=0x00;

P3=0xff; Count=0;

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

//计数器T0方式1 //50ms定时

TL0=(65536-50000)%6; IE=0x82; TR0=1; //启动T0 while(1) {

j=0x7f;

//显示Digits_of_6DSY[5]~Digits_of_6DSY[0]的内容 //前面高位,后面低位,循环中i!=-1亦可写成i!=0xff for(i=5;i!=-1;i--)

35


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

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

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

马上注册会员

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