文档库 最新最全的文档下载
当前位置:文档库 › 51单片机动态数码管程序扫描显示和中断显示

51单片机动态数码管程序扫描显示和中断显示

51单片机动态数码管程序扫描显示和中断显示
51单片机动态数码管程序扫描显示和中断显示

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。

//单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。

//程序在关键的位置添加了注释。

//用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推

//1扫描显示中的按键位移显示2是扫描显示的动态显示数字3是中断显示

//1111111111111111111111111111111111111111111111111111111111111111111

//1111111111111111111111111111111111111111111111111111111111111111111

/****************************************************************************** *

* 实验名: 动态显示数码管实验

* 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4键盘使用P1

* 实验效果: 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

* 注意:

******************************************************************************* /

#include

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char KeyValue;

//用来存放读取到的键值

unsigned char KeyState; //记录按键的状态,0没有,1有

unsigned char DisplayData[8];

//用来存放要显示的8位数的值

void Delay10ms(); //延时10ms

void KeyDown(); //检测按键函数

void DigDisplay(); //动态显示函数

/****************************************************************************** *

* 函数名: main

* 函数功能: 主函数

* 输入: 无

* 输出: 无

******************************************************************************* /

void main(void)

{

KeyState=0;

while(1)

{

KeyDown();

if(KeyState==1)

{

DisplayData[7]=DisplayData[6];

DisplayData[6]=DisplayData[5];

DisplayData[5]=DisplayData[4];

DisplayData[4]=DisplayData[3];

DisplayData[3]=DisplayData[2];

DisplayData[2]=DisplayData[1];

DisplayData[1]=DisplayData[0];

DisplayData[0]=DIG_CODE[KeyValue];

KeyState=0;

}

DigDisplay();

}

}

/****************************************************************************** *

* 函数名: DigDisplay

* 函数功能: 使用数码管显示

* 输入: 无

* 输出: 无

******************************************************************************* /

void DigDisplay()

{

unsigned char i;

unsigned int j;

for(i=0;i<8;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//显示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//显示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位

}

GPIO_DIG=DisplayData[i];//发送段码

j=10; //扫描间隔时间设定

while(j--);

GPIO_DIG=0x00;//消隐

}

}

/****************************************************************************** *

* 函数名: KeyDown

* 函数功能: 检测有按键按下并读取键值

* 输入: 无

* 输出: 无

******************************************************************************* /

void KeyDown(void)

{

unsigned int a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)

{

Delay10ms();

a++;

a=0;

if(GPIO_KEY!=0x0f)

{

KeyState=1;//有按键按下

//测试列

GPIO_KEY=0X0F;

// Delay10ms();

switch(GPIO_KEY)

{

case(0X07): KeyValue=0;break;

case(0X0b): KeyValue=1;break;

case(0X0d): KeyValue=2;break;

case(0X0e): KeyValue=3;break;

// default: KeyValue=17; //检测出错回复17意思是把数码管全灭掉。

}

//测试行

GPIO_KEY=0XF0;

Delay10ms();

switch(GPIO_KEY)

{

case(0X70): KeyValue=KeyValue;break;

case(0Xb0): KeyValue=KeyValue+4;break;

case(0Xd0): KeyValue=KeyValue+8;break;

case(0Xe0): KeyValue=KeyValue+12;break;

// default: KeyValue=17;

}

while((a<500)&&(GPIO_KEY!=0xf0)) //按键松手检测

{

Delay10ms();

a++;

}

a=0;

}

}

}

/****************************************************************************** *

* 函数名: Delay10ms

* 函数功能: 延时函数,延时10ms

* 输入: 无

* 输出: 无

******************************************************************************* /

void Delay10ms(void) //误差0us

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

//2222222222222222222222222222222222222222222222222222222222

//2222222222222222222222222222222222222222222222222222222222

/****************************************************************************** *

* 实验名: 动态显示数码管实验

* 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4

* 实验效果: 数码管显示76543210。

* 注意:

******************************************************************************* /

#include

#define GPIO_DIG P0

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char DisplayData[8];

//用来存放要显示的8位数的值

void DigDisplay(); //动态显示函数

/****************************************************************************** *

* 函数名: main

* 函数功能: 主函数

* 输入: 无

* 输出: 无

******************************************************************************* /

void main(void)

{

unsigned char i;

for(i=0;i<8;i++)

{

DisplayData[i]=DIG_CODE[i];

}

while(1)

{

DigDisplay();

}

}

/******************************************************************************

*

* 函数名: DigDisplay

* 函数功能: 使用数码管显示

* 输入: 无

* 输出: 无

******************************************************************************* /

void DigDisplay()

{

unsigned char i;

unsigned int j;

for(i=0;i<8;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//显示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//显示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位

}

GPIO_DIG=DisplayData[i];//发送段码

j=10; //扫描间隔时间设定

while(j--);

GPIO_DIG=0x00;//消隐

}

}

//333333333333333333333333333333333333333333333333333333333

//333333333333333333333333333333333333333333333333333333333

/****************************************************************************** *

* 实验名: 动态显示数码管实验

* 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4键盘使用P1

* 实验效果: 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

* 注意:

******************************************************************************* /

#include

//#include

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char KeyValue;

//用来存放读取到的键值

unsigned char KeyState; //记录按键的状态,0没有,1有

unsigned char DisplayData[8];

//用来存放要显示的8位数的值

unsigned char Num;//用来存放中断的时候显示的第位数值

void Delay50us(); //延时50us

void KeyDown(); //检测按键函数

void DigDisplay(); //动态显示函数

void TimerConfiguration();//定时器初始化设置

/****************************************************************************** *

* 函数名: main

* 函数功能: 主函数

* 输入: 无

* 输出: 无

******************************************************************************* /

void main(void)

{

TimerConfiguration();

KeyState=0; //初始化按键状态

while(1)

{

KeyDown();

if(KeyState==1)

{

DisplayData[7]=DisplayData[6];

DisplayData[6]=DisplayData[5];

DisplayData[5]=DisplayData[4];

DisplayData[4]=DisplayData[3];

DisplayData[3]=DisplayData[2];

DisplayData[2]=DisplayData[1];

DisplayData[1]=DisplayData[0];

DisplayData[0]=DIG_CODE[KeyValue];

KeyState=0;

}

// DigDisplay();

}

}

/****************************************************************************** *

* 函数名: TimerConfiguration

* 函数功能: 定时器初始化

* 输入: 无

* 输出: 无

******************************************************************************* /

void TimerConfiguration()

{

TMOD=0X02;//选择为定时器0模式,工作方式2,仅用TRX打开启动。

TH0=0X9C; //给定时器赋初值,定时100us

TL0=0X9C;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器

}

/****************************************************************************** *

* 函数名: DigDisplay

* 函数功能: 使用数码管显示

* 输入: 无

* 输出: 无

******************************************************************************* /

void DigDisplay()

{

unsigned char i,j;

// for(i=0;i<8;i++)

// {

GPIO_DIG=0x00;//消隐

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;

case(1):

LSA=1;LSB=0;LSC=0; break;

case(2):

LSA=0;LSB=1;LSC=0; break;

case(3):

LSA=1;LSB=1;LSC=0; break;

case(4):

LSA=0;LSB=0;LSC=1; break;

case(5):

LSA=1;LSB=0;LSC=1; break;

case(6):

LSA=0;LSB=1;LSC=1; break;

case(7):

LSA=1;LSB=1;LSC=1; break;

}

GPIO_DIG=DisplayData[i];

i++;

if(i>7)

i=0;

// j=10; //扫描间隔时间设定

// while(j--)

// Delay50us();

// GPIO_DIG=0x00;//消隐

// }

}

/****************************************************************************** *

* 函数名: KeyDown

* 函数功能: 检测有按键按下并读取键值

* 输入: 无

* 输出: 无

******************************************************************************* /

void KeyDown(void)

{

unsigned int a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)

{

Delay50us();

a++;

a=0;

if(GPIO_KEY!=0x0f)

{

ET0=0;//关定时器中断

KeyState=1;//有按键按下

//测试列

GPIO_KEY=0X0F;

// Delay50us();

switch(GPIO_KEY)

{

case(0X07): KeyValue=0;break;

case(0X0b): KeyValue=1;break;

case(0X0d): KeyValue=2;break;

case(0X0e): KeyValue=3;break;

// default: KeyValue=17; //检测出错回复17意思是把数码管全灭掉。

}

//测试行

GPIO_KEY=0XF0;

Delay50us();

switch(GPIO_KEY)

{

case(0X70): KeyValue=KeyValue;break;

case(0Xb0): KeyValue=KeyValue+4;break;

case(0Xd0): KeyValue=KeyValue+8;break;

case(0Xe0): KeyValue=KeyValue+12;break;

// default: KeyValue=17;

}

ET0=1;//开定时器中断

while((a<5000)&&(GPIO_KEY!=0xf0)) //检测按键松手检测

{

Delay50us();

a++;

}

a=0;

}

}

}

/****************************************************************************** *

* 函数名: Delay50us

* 函数功能: 延时函数,延时50us

* 输入: 无

* 输出: 无

******************************************************************************* /

void Delay50us(void) //延时50us误差0us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=22;a>0;a--);

}

/****************************************************************************** *

* 函数名: Delay50us

* 函数功能: 延时函数,延时50us

* 输入: 无

* 输出: 无

******************************************************************************* /

void Timer() interrupt 1

{

DigDisplay();

}

51单片机数码管时钟程序

本人初学51,编写简单时钟程序。仅供参考学习 #include #define uint unsigned int #define uchar unsigned char Uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1 }; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0xef}; void delay(uint); unsigned long i,num,t=1; void main() { TMOD=0X01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; TR0=1; while(1) { num=i/20;//i为秒位 if(i==1728000)//一天大概是这个秒吧,,,应该是,呵呵。就是世间到24时就归零。 i=0; //也可用下面这个部分来代替上面的。 /*if(i==20) { i=0; num++; if(num==5184000) num=0; }*/ //num=9; P2=7;//P2口为数码管控制端,我的是38译码器控制,就直接对其赋值来控制时,分,秒的显示; P0=table[i%100%10]; delay(t); P2=6; P0=table[i%100/10]; delay(t); P0=table_d[(num%60)%10]; P2=5; delay(t); P0=table[(num%60)/10]; P2=4;

51单片机-数码管

51单片机-数码管 共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。 如图,这里有8个发光二极管,到底哪个亮需要进行片选。段选:8 段数码管 每一段的控制段叫段选位选:就是进行哪个8 段数码管亮的选择TX-1C 使用两 片锁存器74HC573 实现位选和段选这里的D0”7是连在单片机的I/O 口上,当 为高电平时,Q 与D 中的数据一致,遇到负跳变沿时Q 中的数据保持住,D 中 的数据即使变化也不会影响Q。MCUVersion2 使用的是74HC245 和38 译码器 74HC13874HC245 有一个缓冲和驱动的作用,这样可以使led 显示的更加稳定, 数码管显示分动态显示和静态显示,每个数码管的状态都是被不断更新的,利 用的人的视觉暂留,使看上去数值保持在一个固定的位置上,人的视觉是有延 续性的,当一个东西不断变化时,变化的时间小于人眼的视觉暂留时间的话, 人的眼睛会以为这个东西是连续的。静态显示是一幅画面放在那看上去是不动 的而它确实是不动的。动态扫描显示即轮流向各位数码管送出字型码和相应位 选,利用发光管的余晖和视觉暂留作用,使人的感觉好像各位数码管同时都在 显示。静态显示:数码管从左向右依次点亮: #include <reg52.h>void delay(){ int i,j; for(i = 0; i <0xff; i++) for(j = 0; j <0xff; j++) ;} unsigned int code duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};unsigned int code wei[]={ 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};void main(){ while(1){ int i; P2 = 0x39; for(i = 0; i <8; i++){ P2 = duan[ i]; P1 = wei[ i]; delay(); } } } 想让哪个 数码管亮多少就亮多少:tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序 时间:2012-09-10 13:52:26 来源:作者: /* 8位数码管显示时间格式05—50—00 标示05点50分00秒 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于分钟加1操作 S4 用于分钟减1操作 */ #include sbit KEY1=P3^0; //定义端口参数 sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED=P1^2; //定义指示灯参数 code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9 unsigned char StrTab[8]; //定义缓冲区 unsigned char minute=19,hour=23,second; //定义并初始化为12:30:00 void delay(unsigned intt) { while(--cnt); } /******************************************************************/ /* 显示处理函数 */ /******************************************************************/ void Displaypro(void) { StrTab[0]=tab[hour/10]; //显示小时 StrTab[1]=tab[hour%10]; StrTab[2]=0x40; //显示"-" StrTab[3]=tab[minute/10]; //显示分钟 StrTab[4]=tab[minute%10]; StrTab[5]=0x40; //显示"-" StrTab[6]=tab[second/10]; //显示秒 StrTab[7]=tab[second%10]; } main()

基于51单片机的数码管简易计算器

基于51/52单片机的简易计算器制作 11级自动化2班 王栎斐宋为为闫巨东 一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。 二、任务与要求要求计算器能实现加减乘除四种运算 具体如下 1. 加法:四位整数加法计算结果若超过八位则显示计算错误 2. 减法:四位整数减法计算结果若超过八位则显示计算错误 3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误 4. 除法:整数除法 5. 有清除功能 三、课程设计简述 总体设计思路简述 1.按照系统设计的功能的要求 初步确定设计系统由主控模块、显示模块、键扫描接口 电路共三个模块组成。主控芯片使用STC89C52单片机。 2.键盘电路采用4*4矩阵键盘电路。 3.显示模块采用共阳极数码管构成。 四、硬件电路 五、软件编程部份 #include

#define uchar unsigned char #define uint unsigned int //uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //共阴极 // 0 1 2 3 4 5 6 7 8 9 熄灭- //uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7}; //uchar code ero[]={0x79,0x50,0x5c}; uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40}; //共阳极 uchar code loc[]={0x00,0x80,0x40,0x20,0x10}; uchar code ero[]={~0x79,~0x50,~0x5c}; uint n=0,n1=0,n2=0; //赋初值 uchar flag=0; //计算类型选择关键字 void delay(int t); void display(int n); void error(); main() { while(1) { uchar temp; //第一行检测 P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp=temp&0xfe; if(temp!=0xfe) { temp=P3; switch(temp) { case 0xee:n1=0;n2=0;n=0;flag=0;break;

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include // 包含51单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 } } //实例43:用定时器T1查询方式控制单片机发出1KHz音频#include // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值

51单片机常用数码管显示程序

51单片机常用数码管显示程序---之汇编篇 2010-07-21 03:35:46| 分类:单片机| 标签:51单片机数码管汇编程序|字号大中小订阅一)显示数据缓存寄存器70H,71H,72H,73H,74H,75H,76H,77H。 START: MOV 70H,#1 MOV 71H,#2 MOV 72H,#3 MOV 73H,#4 MOV 74H,#5 MOV 75H,#6 MOV 76H,#7 MOV 77H,#8 ACALL DISP AJMP START DISP: MOV R1,#70H MOV R5,#0FEH PLAY: MOV P0,#0FFH MOV A,R5 ANL P2,A

MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A LCALL DL1MS INC R1 MOV A,P2 JNB ACC.7,ENDOUT RL A MOV R5,A MOV P2,#0FFH AJMP PLAY ENDOUT: MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 1MS延时子程序,LED显示用 DL1MS: MOV R6,#14H ; DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET END 二)

START:;ORG 00H MOV 70H,#0C0H;0 MOV 71H,#0F9H;1 MOV 72H,#0A4H;2 MOV 73H,#0B0H;3 MOV 74H,#99H ;4 MOV 75H,#92H ;5 MOV 76H,#82H ;6 MOV 77H,#0F8H;7 ACALL DISP AJMP START DISP: MOV P0,70H CLR P2.7 ACALL DL1MS SETB P2.7 MOV P0,71H CLR P2.6 ACALL DL1MS SETB P2.6 MOV P0,72H CLR P2.5 ACALL DL1MS SETB P2.5 MOV P0,73H CLR P2.4 ACALL DL1MS SETB P2.4 MOV P0,74H CLR P2.3 ACALL DL1MS SETB P2.3 MOV P0,75H CLR P2.2 ACALL DL1MS SETB P2.2 MOV P0,76H CLR P2.1 ACALL DL1MS SETB P2.1 MOV P0,77H CLR P2.0 ACALL DL1MS SETB P2.0 RET

51单片机-八段数码管显示

实验一八段数码管显示 1、实验目的: (1)了解数码管动态显示的原理。 (2)了解74LS164扩展端口的方法。 2、实验要求: 利用实验仪提供的显示电路,动态显示一行数据. 3、实验电路图 LED1LED2LED3LED4LED5LED6 4、实验器材: (1)超想-3000TB综合实验仪 1 台 (2)超想3000仿真器 1 台 (3)计算机 1 台

5、实验连线 无 6、实验说明: (1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。 74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。向显示位选通地址输出高电平就可以点亮相应的显示位。 本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。 (2)七段数码管的字型代码表 显示字形 g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h 2 1 0 1 1 0 1 1 6bh 3 1 0 0 1 1 1 1 4fh 4 1 1 0 0 1 1 0 66h 5 1 1 0 1 1 0 1 6dh 6 1 1 1 1 1 0 1 7dh 7 0 0 0 0 1 1 1 07h 8 1 1 1 1 1 1 1 7fh 9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 0 5eh E 1 1 1 1 0 0 1 79h F 1 1 1 1 71h a b c d e f g dp

51单片机利用中断控制灯频率和顺序

#include //包含51单片机寄存器定义的头文件#include int e=0,f=0,d=1,a=0,b=0,c=0,delay=10,m=1,V=128; G=1; /******************************************* 函数功能:主函数 ******************************************/ void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 ET0=1; //定时器0开 EX1=1; TMOD=0X01; IT0=1; //选择负跳变来触发外中断 IT1=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; while(1) ; //无限循环,防止程序跑飞 }

/************************************************************** 函数功能:外中断T0的中断服务程序 **************************************************************/ Time() interrupt 1 //外中断0的中断编号为0 { if(m%delay==0) { m=1; switch(e) { case 0: P1=G; a++; G=P1<<1; // P1=G; if(a==8) { a=0; G=1; } break; case 1: //反序 P1=V; b++; V=P1>>1; // P1=V; if(b==8) { b=0; V=128; } break; case 2: //中间到两边 P1=pow(2,4+c)+pow(2,3-c); c++; if(c==4) { c=0; }

51单片机(四位数码管的显示)程序[1]

51单片机(四位数码管的显示)程序 基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管 上显示P ”个字符;2)等待按键,如按了任何一个键,则将这 4个字符清除, 改为显示0000”个字符(为数字的0)。 E3最佳答案 下面这个程序是4x4距阵键盘丄ED 数码管显示,一共可以到0-F 显示,你可以稍微 改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你! #i nclude un sig ned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang 数码管 0-F 代码 void key_delay(void) { int t; for(t=0;t<500;t++); } un sig ned char k; //设置全局变量k 为键盘的键值 键盘延时函数 键盘扫描函数 ***************************** */ //延时函数

void keyscan(void) //键盘初始化 //有键按下? //延时 //确认真的有键按下? //使行线 P2.4 为低电平,其余行为高电平 //a 作为缓存 //开始执行行列扫描 { case 0xee:k=15;break; case 0xde:k=11;break; case 0xbe:k=7;break; case 0x7e:k=3;break; default:P2 = 0xfd; //使行线 P2.5 为低电平,其余行为高电平 a = P2; switch (a)//键盘扫描函数 { unsigned char a; P2 = 0xf0; if(P2!=0xf0) { key_delay(); if(P2!=0xf0) { P2 = 0xfe; key_delay(); a = P2; switch (a)

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

基于51单片机的LED数码管动态显示

基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。 1 硬件设计 利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。在器件选择按钮中单击

“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 一片 晶体CRYSTAL 12MHz 一只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF 一只 电阻RES 10K 一只 电阻RES 4.7K 四只 双列电阻网络Rx8 300R(Ω) 一只 四位七段数码管7SEG-MPX4-CA 一只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。 2 软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X(N-1)),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。 LED数码管动态显示的流程如下所示。

51单片机实现数码管99秒倒计时

51单片机实现数码管99秒倒计时,其实很简单,就是使用定时器中断来实现。 目的就是学习怎样用单片机实现倒计时,从而实现一些延时控制类的东西,99秒只是一个例子,你完全可以做出任意倒计时如10秒倒计时程序。 定时器定时时间计算公式:初值X=M(最大计时)-计数值。 初值,换算成十六进制,高位给TH0,低位给TL0,如果用定时器0的话。 M(最大计时)如果是16位的,就是2的16次方,最大定时,65535 微秒,实现1秒定时,可以通过定时10毫秒,然后100次改变一次秒值即可。10*100毫秒=1S 计数值:你要定时多长时间,如果定时1毫秒,就是1000微秒,(单位为微秒),如果定时10毫秒,就是10000(微秒),当然,最大定时被定时器本身位数限制了,最大2的16次方(16位定时计数器),只能定时65.535毫秒。定时1S当然不可能1S定时器中断。 下面为实现99秒倒计时C语言源程序 /*了解定时器,这样的话,就可以做一些基本的实验了,如定时炸弹~~,10秒后打开关闭继电器*/ /*数码管,12M晶振*/ #include #define uchar unsigned char sbit p11=P1^1; //连的是继电器。。 code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar shiwei; uchar gewei; void delay(unsigned int cnt) { while(--cnt); } void main() { TMOD|=0x01; /*定时器0 16位定时器X=65535-10000(10毫秒)=55535=D8F0(十六进制)定时10ms */ TH0=0xd8; TL0=0xf0; IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时

51单片机数码管显示时钟(C语言)

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////以下是主文件main.c 的内容 /****************************************************************************** * * 实验名: 万年历实验 * 使用的IO : * 实验效果:1602显示时钟 * 注意: ******************************************************************************* / #include #include"ds1302.h" //数码管IO #define DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Num=0; unsigned int disp[8]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void LcdDisplay(); void Timer0Configuration(); /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main() {

51单片机中断系统编程

51单片机中断系统编程 51单片机中断系统编程 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆中断是指如下过程(如下图所示):CPU 与外设同时工作,CPU执行主程序,外设做准备工作。当外设准备好时向CPU发中断请求信 号,若条件满足,则CPU终止主程序的执行,转去执行中断服务程序。在中断服务程序中 CPU与外设交换信息,待中断服务程序执行完后,CPU再返回刚才终止的主程序继续执行。 5.3.1 中断系统 MCS-51单片机提供了5个固定的可屏蔽中断源,3个在片内,2个在片外,它们在程序存储 器中各有固定的中断入口地址,由此进入中断服务程序。5个中断源的符号、名称及产生 的条件如下。 ? INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 ? INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 ? T0:定时器/计数器0中断,由T0计数溢出引起。 ? T1:定时器/计数器l中断,由T1计数溢出引起。 ? TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。 中断源有两级中断优先级,可形成中断嵌套。两个特殊功能寄存器用于中断控制和条件设 置。整个中断系统的结构框图如图所示。 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 中断系统结构框图 2 中断系统的控制寄存器 中断系统有两个控制寄存器(IE和IP),它们分别用来设定各个中断源的打开/关闭和中

断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。 (1)中断允许寄存器IE IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。IE 用 来打开或关断各中断源的中断请求,基本格式如下: 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 ? EA:全局中断允许位。EA=0,禁止一切中断;EA=1,打开全局中断控制,此时,由各 个中断控制位确定相应中断的打开或关闭。 ? ×:无效位。 ? ES:串行I/O中断允许位。ES=1,允许串行I/O中断;ES=0,禁止串行I/O中断。 ? ETl;定时器/计数器T1中断允许位。ETl=1,允许T1中断;ETl=0,禁止T1中断。 ? EXl:外部中断l中断允许位。EXl=1,允许外部中断1中断;EXl=0,禁止外部中断1中 断。 ? ET0:定时器/计数器T0中断允许位。ET0=1,允许T0中断;ET0=0,禁止TO中断。 ? EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中 断。 (2)中断优先级寄存器IP IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH。 MCS-51单片机的中断分为两个优先级,IP用来设定各个中断源属于两级中断中的哪一级, 其基本格式如下: 上传的图片

51单片机控制4个数码管显示09999

//使用AT89c51单片机控制四个数码管动态显示0-9999 ,12MHz #include void jiayi();//加1函数 void chufa();//除法函数 void xianshi();//显示函数 void delay();//延时函数 sbit P2_0=P2^0;//个位位码 sbit P2_1=P2^1;//十位位码 sbit P2_2=P2^2;//百位位码 sbit P2_3=P2^3;//千位位码 unsigned char qianwei,baiwei,shiwei,gewei; unsigned int count=0; unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极0-9 void main() { while(1) { jiayi(); chufa(); xianshi(); } } void chufa()//将数字的各个位拆开 { qianwei=count/1000;//千位数 baiwei=count%1000/100; //百位数 shiwei=count%100/10; //十位数 gewei=count%10; //个位数 } void jiayi() { count=count+1; if(count==10000) count=0; } void delay()//延时 { unsigned int i,j; for(i=0;i<10;i++) { for(j=0;j<200;j++); } } void xianshi()//显示当前数值

51单片机中断控制LED

单片机作业 题目要求: 设计这样一个系统:在一个51单片机最小系统板上,P1口低四位接四个四角按键,高四位接四个LED灯。按键中断作为总中断,当接中断的按键按下后,所有灯均可按照对应的按键进行点亮。当没有中断按下时,无论怎么按接在P1口低四位的按键,均不能是按键点亮。 实现步骤: 第一:电路搭建: 电路搭建说明: 1.采用AT89C52单片机,DIP40封装。 2.选用12M,并使晶振尽可能接近单片机,采用22pf的电容接在晶振两边并接地,使晶振更容易起振。 3.标号为D18的LED是中断触发指示灯,一旦中断触发,D18会一直亮着。没有中断触发时会一直灭着。 4.key1,key2,key3,key4分别控制D1,D2,D3,D4,D 5. 5.D5为复位指示灯,当复位按键按下时,D5亮。反之灭。 第二:程序实现: 本程序十分简单,秉着杜绝抄袭,自助设计的理念,本程序完全有本人设计完成。没有采用老师讲解的例程。程序的注释已经将程序称述的很明白,现做简要说明: 本人将按键查询部分都放在中断处理函数中处理。当中断触发按键按下时,D18亮,程序进入中断函数,开始不断查询按键值,并点亮相应led.。这样的程序 对CPU的占有率较高,但由于这样写代码更加简单明了,有由于题目对cpu占有率的并没有明确要求,本着开发周期尽可能短的原则,本程序选择了简单方案。

现将代码复制如下: 将KEIL与PROTEUS联调,调试结果如下: 1.启动程序: ,可以看到图中三角符号变绿。此时:

此时,图中所有led灭,无现象。 1.此时按下任意按键,比如key1,key2两个(为了方便截图,直接将开关用导线短路): 现象如下: 可以看到,并没有认可指示灯亮。 2.按复位按键观察是否正常(为了方便截图,直接将开关用导线短路):

数码管动态显示的51单片机时钟设计

一看就会,适合初学者参考 T0,T1同时开中断,和别人的有点不一样 源程序如下 //数码管设计的可调电子钟 //K1,K2分别调整小时和分钟 #include<> #include<> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99, //共阳段码 0x92,0x82,0xF8,0x80,0x90,0xFF}; uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0}; //显示缓存uchar Scan_BIT; //扫描位,选择要显示的数码管 uchar DSY_IDX; //显示缓存索引 uchar Key_State; //P1端口按键状态 uchar h,m,s,s100; //十分秒,1/100s void DelayMS(uchar x) //延时 { uchar i; while(x--) for(i=0;i<120;i++); } void Increase_Hour() //小时处理函数 { if(++h>23)h=0; DSY_BUFFER[0]=DSY_CODE[h/10]; DSY_BUFFER[1]=DSY_CODE[h%10]; } void Increase_Minute()//分钟处理函数 { if(++m>59) { m=0;Increase_Hour(); } DSY_BUFFER[3]=DSY_CODE[m/10]; DSY_BUFFER[4]=DSY_CODE[m%10]; }

51单片机中断详解

一.中断的概念 1.中断发生 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理 2.中断响应和中断服务 CPU暂时中断当前的工作,转去处理事件B 3.中断返回 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A 这一过程称为中断 二.中断过程示意图 三.MCS51中断系统的结构

MCS51的中断系统有5个中断源(8052有6个),2个优先级,可实现二级中断嵌套 四.中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1.中断允许控制寄存器IE 2.定时器控制寄存器TCON 3.串口控制寄存器SCON 4.中断优先控制寄存器IP 5.定时器工作方式控制寄存器TMOD 6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1) 五.部分寄存器详解

1.中断允许控制寄存器(IE) EX0:外部中断0允许位; ET0:定时/计数器T0中断允许位; EX1:外部中断1允许位; ET1:定时/计数器T1中断允许位; ES :串行口中断允许位; EA :CPU中断允许(总允许)位。 2.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IE0:外部中断0中断请求标志位 IT1:外部中断1触发方式控制位 IE1:外部中断1中断请求标志位

TF0:定时/计数器T0溢出中断请求标志位 TF1:定时/计数器T1溢出中断请求标志位 3.串行口控制寄存器(SCON) RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。 TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。 4.中断优先级控制寄存器(IP) PX0:外部中断0优先级设定位 PT0:定时/计数器T0优先级设定位 PX1:外部中断0优先级设定位 PT1:定时/计数器T1优先级设定位

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=O; P2=Oxff; while(1)// 无限循环等待查询 { while(TFO==O) TFO=O; P2=~P2; THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值

TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值 } // 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include // 包含 51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; // 开总中断 // ET0=1; // 定时器 T0 中断允许 TMOD=0x10; // 使用定时器 T1 的模式 1 TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值 TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值 TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询 {

相关文档
相关文档 最新文档