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

2019-04-13 23:07

}

{ }

j=_crol_(j,1);

P3=j;

P0=DSY_CODE[Digits_of_6DSY[i]]; if(i==1) Dot=1; //加小数点 DelayMS(2);

}

//T0中断函数

void Timer0() interrupt 1 { uchar i; TH0=(65536-50000)/256; }

35 定时器控制数码管动态显示

/* 名称:定时器控制数码管动态显示

说明:8个数码管上分两组动态显示年月日与时分秒,本例的 位显示延时用定时器实现。 */

#include #include

#define uchar unsigned char #define uint unsigned int

//段码,最后一位是“-”的段码

uchar code

DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //待显示的数据:09-12-25与23-59-58(分两组显示)

36

//恢复初值

TL0=(65536-50000)%6;

if(++Count!=2) return; Count=0;

Digits_of_6DSY[0]++; //0.1s位累加 for(i=0;i<=5;i++) //进位处理 { }

if(Digits_of_6DSY[i]==10) {

Digits_of_6DSY[i]=0;

if(i!=5) Digits_of_6DSY[i+1]++; //如果0~4位则分别向高一位进位

//若某低位没有进位,怎循环提前结束

}

else break;

uchar code Table_of_Digits[][8]={{0,9,10,1,2,10,2,5},{2,3,10,5,9,10,5,8}}; uchar i,j=0; uint t=0; //主程序

void main() { P3=0x80; TMOD=0x00;

//位码初值 //计数器T0方式0

TH0=(8192-4000)/32; //4ms定时 TL0=(8192-4000)2; IE=0x82;

TR0=1; while(1);

//启动T0

}

//T0中断函数控制数码管刷新显示 void DSY_Show() interrupt 1 { TH0=(8192-4000)/32; }

36 8X8LED点阵显示数字

/* 名称:8X8LED点阵显示数字 说明:8X8LED点阵屏循环显示数字0~9,刷新过程由定时器中断完成。 */

#include #include #define uchar unsigned char #define uint unsigned int

uchar code Table_of_Digits[]= {

//恢复初值

TL0=(8192-4000)2; P0=0xff; //输出位码和段码

P0=DSY_CODE[Table_of_Digits[i][j]]; P3=_crol_(P3,1); j=(j+1)%8; //数组第i行的下一字节索引 if(++t!=350) return;//保持刷新一段时间 t=0;

i=(i+1)%2;

//数组行i=0时显示年月日,i=1时显示时分秒

0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //0 //1 //2 //3

37

0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,

//4 //5 //6 //7 //8 //9

0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 };

uchar i=0,t=0,Num_Index; //主程序 void main() {

P3=0x80; Num_Index=0;

//从0开始显示 //T0方式0 //2ms定时

TMOD=0x00; TH0=(8192-2000)/32; TL0=(8192-2000)2; IE=0x82; TR0=1; while(1);

//启动T0

}

//T0中断函数

void LED_Screen_Display() interrupt 1 { }

TH0=(8192-2000)/32;

//恢复初值

TL0=(8192-2000)2; P0=0xff; //输出位码和段码

P0=~Table_of_Digits[Num_Index*8+i]; P3=_crol_(P3,1); if(++i==8) i=0; //每屏一个数字由8个字节构成 if(++t==250) { }

//每个数字刷新显示一段时间

t=0;

if(++Num_Index==10) Num_Index=0; //显示下一个数字

37 按键控制8X8LED点阵屏显示图形

/* 名称:按键控制8X8LED点阵屏显示图形

说明:每次按下K1时,会使8X8LED点阵屏循环显示不同图形。

本例同时使用外部中断和定时中断。 */

38

#include #include #define uchar unsigned char #define uint unsigned int //待显示图形编码

uchar code M[][8]= { {0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00}, //图1 {0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00}, //图2

{0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00}

//图3

};

uchar i,j; //主程序 void main() { P0=0xff; P1=0xff; TMOD=0x01; //T0方式1 TH0=(65536-2000)/256; //2ms定时

TL0=(65536-2000)%6; IT0=1; //下降沿触发 IE=0x83; //允许定时器0、外部0中断 i=0xff;

//i的初值设为0xff,加1后将从0开始

while(1);

}

//T0中断控制点阵屏显示

void Show_Dot_Matrix() interrupt 1 { TH0=(65536-2000)/256; //恢复初值 TL0=(65536-2000)%6; P0=0xff; //输出位码和段码 P0=~M[i][j];

P1=_crol_(P1,1);

j=(j+1)%8; }

//INT0中断(定时器由键盘中断启动) void Key_Down() interrupt 0 { P0=0xff; P1=0x80; j=0;

i=(i+1)%3;

//i在0,1,2中取值,因为只要3个图形

TR0=1;

}

39

38 用定时器设计的门铃

/* 名称:用定时器设计的门铃 说明:按下按键时蜂鸣器发出叮咚的门铃声。 */

#include

#define uchar unsigned char #define uint unsigned int sbit Key=P1^7; sbit DoorBell=P3^0; uint p=0; //主程序 void main() {

DoorBell=0; TMOD=0x00; TH0=(8192-700)/32; TL0=(8192-700)2; IE=0x82; while(1) {

if(Key==0) {

TR0=1;

//按下按键启动定时器

//T0方式0 //700us定时

while(Key==0); } } }

//T0中断控制点阵屏显示

void Timer0() interrupt 1 { DoorBell=~DoorBell; p++; if(p<400) //若需要拖长声音,可以调整400和800

{ }

TH0=(8192-700)/32; //700us定时 TL0=(8192-700)2;

else if(p<800) { TH0=(8192-1000)/32; //1ms定时 } else {

40

TL0=(8192-1000)2;


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

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

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

马上注册会员

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