十天学会单片机C语言-课后习题答案_第1页
十天学会单片机C语言-课后习题答案_第2页
十天学会单片机C语言-课后习题答案_第3页
十天学会单片机C语言-课后习题答案_第4页
十天学会单片机C语言-课后习题答案_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

所有课作业+答案,特别整理,供单片机爱好与学习者使用

讲次内容细节

第一讲学单片机预备知识、

如何点亮一个发光管单片机能做什么,基本电子知识,如何用TX-1C单片机学习板学习单

片机,C51知识简介,如何申请免费芯片样品。点亮一个发光管,

第二讲流水灯设计、蜂鸣器发声、继电器控制简单延时程序、子程序调用、带参数子程

序设计、流水灯同时蜂鸣器响、如何驱动蜂鸣器,及如何驱动继电器,集电极开路的概念及

应用。

第三讲数码管显示的原理、数码管的静态显示共阳、共阴数码管显示原理、定时器工作

方式介绍、重点讲述工作方式2.中断概念及中断函数写法、外部中断试验、定时器中断应

第四讲数码管的动态显示原理及应用实现动态扫描概念、定时器、中断加深

用单片机的定时器及中断设计一个60秒定时器

第五讲独立键盘、矩阵键盘

的检测原理及实现键盘用来做什么、如何键盘检测、消抖、键盘编码、带返回值函数写

法及应用

第六讲AD、DA的工作原理

及实现、运放电路模拟电压与数字电压的关系、为什么要使用AD及DA、ADC0804的操

作方法、DAC0832的操作方法

第七讲串口通讯原理及操作流程串口通讯工作方式、10位数据通讯、波特率概念、如

何根据波特率计算定时器初值、串口打印在调试程序中的应用。

第八讲1602液晶、12864液晶显示原理及实现最简单液晶工作原理、如何开始对一个没

有任何概念的芯片开始单片机的操作

第九讲IIC总线AT24co2芯片工作原理IIC总线工作原理、

目前非常通用的一种通信机制

第十讲利用51单片机的定时器设计一个时钟综合运用51单片机知识设计一个可以随

意调节时间、带整点闹铃的时钟。(其中用到定时器、中断、按键、蜂鸣器、数码管或串口

通信)

第十一讲用DS12c887时钟芯片设计一个高精度时钟DS12c887内部带有锂电池,系

统掉电情况下可自行精确走10年,并带有闹钟功能、年、月、日、时、分、秒等.(本节由

学生自己设计电路)

第十二讲使用Protell99绘制电路图全过程Protel199软件使用、元件库、封装库设

计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工

第十三讲Altiumdesigner6.5绘制电路图全过程最顶级电路板设计软件Altium

Designer使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、

送去加工

lessonl

对照TX-1C单片机学习板原理图写程序

用位操作和总线操作两种方法完成以下题目

1.熟练建立KEIL工程

2.点亮第一个发光管.

3.点亮最后一个发光管

4.点亮1、3、5、7

5.点亮二、四、五、六

6.尝试让第一个发光管闪烁

7.尝试设计出流水灯程序

lesson2

第一个发光管以间隔200ms闪烁

8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮

时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。

8个发光管来回流动,每个管亮100ms,流动时让蜂鸣器发出“滴滴”

声。

用8个发光管演示出8位二进制数累加过程。

8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全

部熄灭再以300ms间隔全部闪烁5次。重复此过程。

间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到

8个管亮,然后重复整个过程。

间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两

个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部

闪烁3次;关闭发光管,程序停止。

lesson3

1、利用定时/计数器TO从Pl.0输出周期为1s的方波,让发光二极

管以1HZ闪烁,设晶振频率为12MHz-

2、利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,

使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次

亮一遍为一个周期),循环。

3、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器

1控制同个频率持续的时间,间隔300nls依次输出1,10,50,100,

200,400,800,

lk(hz)的方波。

4、用定时器以间隔500Ms在6位数码管上依次显示0、1、2、3....C、

D、E、F,重复。

lesson4

1.利用动态扫描方法在六位数码管上显示出稳定的654321.

2.用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到

1%秒,即后两位显示1%秒,一直循环下去。

3.利用动态扫描和定时器1在数码管上显示出从765432开始以1/10

秒的速度往下递减直至765398并保持显示此数,与此同时利用定时

器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止

时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)

流水灯全部关闭、数码管上显示出“HELLO"。到此保持住。

lesson5

数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,

当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时

器设计表)。

在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,

按下第二个时计时开始,按下第三个是计数值清零从头开始。

按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个

显示1,第二个显示4...

lesson7

1.由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以

200ms频率发声,发3时以100ms频率发声,发4时关闲蜂鸣器。

1.以2400bps从计算机发送任一字节数据,当单片机收到该数据后,

在此数据前加上一序号然后连同此数据一起发送至计算机,当序号超

过255时归零.

2.以16进制发送一个0-65536之间的任一数,当单片机收到后在数

码管上动态显示出来,波特率自定。

3.用AD以1HZ的频率采集模拟信号,然后转换成数字量,再将其以

1200bps发送到计算机,在计算机上显示。

4.按下矩阵键盘第一行时以1200bps发送,1,2,3,4,第二行时以

2400bps发送5,6,7,8,第三行以4800bps发送,9,10,11,12,

第四行以9600pbs发送,13,14,15,16.

Lessonl作业

1用位操作点亮第一个发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

I*********************************************************I

#include<reg52.h>//52单片机头文件

sbitledl=PlA0;〃单片机管脚位声明

voidmain0〃主函数

ledl=O;〃将单片机PL0口清零

while(l);〃程序停止在这里,在后面会讲到为什么这样写。

)

2/用总线操作点亮第一个发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

I*********************************************************I

#include<reg52.h>〃52单片机头文件

voidmain()〃主函数

(

Pl=0xfe;〃将单片机Pl口的8个口由高到低分别赋值为11111110

while(l);〃程序停止在这里,在后面会讲到为什么这样写。

3//用位操作点亮最后一个发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>//52单片机头文件

sbitled8=PlA7;〃单片机管脚位声明

voidmain()//主函数

(

led8=0;〃将单片机Pl.7口清零

while(l);〃程序停止在这里,在后面会讲到为什么这样写。

)

4//用总线操作点亮最后一个发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>〃52单片机头文件

voidmain()//主函数

(

Pl=0x7f;〃将单片机Pl口的8个口由高到低分别赋值为01111111

while(l);〃程序停止在这里,在后面会讲到为什么这样写.

)

5//用位操作点亮1,3,5,7发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>〃52单片机头文件

sbitledl=PlAO;〃单片机管脚位声明

sbitled3=PlA2;〃单片机管脚位声明

sbitled5=PlA4;〃单片机管脚位声明

sbitled7=PlA6;〃单片机管脚位声明

voidmain0//主函数

(

ledl=0;〃将单片机PL0口清零

led3=0;〃将单片机Pl.2口清零

led5=0;〃将单片机PL4口清零

led7=0;//将单片机Pl.6口清零

whiled);〃程序停止在这里,在后面会讲到为什么这样写.

)

6//用总线操作点亮1,3,5,7发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>〃52单片机头文件

voidmain0//主函数

Pl=0xaa;〃将单片机Pl口的8个口由高到低分别赋值为10101010

while(l);〃程序停止在这里,在后面会讲到为什么这样写。

//用位操作点亮2,4,5,6发光管.

//适用TX-1C单片机实验板

//晶振为11.0592M

!*********************************************************I

#include<reg52.h>//52单片机头文件

sbitled2=PlAl;//单片机管脚位声明

sbitled4=PlA3;//单片机管脚位声明

sbitled5=PlA4;//单片机管脚位声明

sbitled6=PlA5;//单片机管脚位声明

voidmain0//主函数

(

led2=0;〃将单片机Pl.1口清零

led4=0;"将单片机PL3口清零

led5=0;//将单片机Pl.4口清零

led6=0;//将单片机Pl.5口清零

while(l);〃程序停止在这里,在后面会讲到为什么这样写。

)

8//用总线操作点亮2,4,5,6发光管.

〃适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>〃52单片机头文件

voidmain0//主函数

(

Pl=0xc5;〃将单片机Pl口的8个口由高到低分别赋值为11000101

while(l);〃程序停止在这里,在后面会讲到为什么这样写。

)

9〃尝试让第一个发光管闪烁.(程序看不懂没关系,后面章节会有详细讲解)

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>〃52单片机头文件

sbitledl=PlA0;〃单片机管脚位声明

voidmain()//主函数

unsignedinti;〃定义一个int型变量

while(1)

i=50000;〃变量赋初值为50000

ledl=0;//点亮灯

while(i一);//延时

i=50000;

ledl=l;〃熄灭灯

whiled—);

9//尝试写出流水灯程序(程序看不懂没关系,后面章节会有详细讲解)

//适用TXTC单片机实验板

//晶振为11.0592M

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

#include<reg52.h>//52单片机头文件

voidmain0〃主函数

(

unsignedinti;〃定义一个int型变量

while(1)

i=50000;//变量赋初值为50000

Pl=0xfe;〃点亮第一个灯

whi1e(i-);〃延时

i=50000;〃变量赋初值为50000

Pl=0xfd;〃点亮第二个灯

whi1e(i-);//延时

i=50000;//变量赋初值为50000

Pl=0xfb;〃点亮第三个灯

whiled—);//延时

i=50000;//变量赋初值为50000

Pl=0xf7;〃点亮第四个灯

whi1e(i-);//延时

i=50000;//变量赋初值为50000

Pl=0xef;//点亮第五个灯

while(i一);〃延时

i=50000;〃变量赋初值为50000

Pl=0xdf;〃点亮第六个灯

whi1e(i-);//延时

i=50000;//变量赋初值为50000

Pl=0xbf;//点亮第七个灯

whiled―);//延时

i=50000;〃变量赋初值为50000

Pl=0x7f;//点亮第八个灯

whi1e(i-);//延时

)

Lesson2

1//第一个发光管以间隔200ms闪烁

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>//52单片机头文件

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitledl=PlA0;〃单片机管脚位声明

voiddelay(uintz)〃延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

{//delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

voidmain()//主函数

while(l)//大循环

(

ledl=0;〃点亮小灯

delay(200);〃延时200毫秒

ledl=l;//熄灭小灯

delay(200);〃延时200毫秒

)

)

2//8个发光管由上至下间隔1s流动

//,其中每个管亮500ms,灭500ms,亮时蜂鸣器响

〃,灭时关闭蜂鸣器,一直重复下去。

//适用TX-1C单片机实验板

//晶振为11.0592M

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>//包含有左右循环移位子函数的库

#defineuintunsignedint//宏定义

#defineucharunsignedchar〃宏定义

sbitbeep=P2A3;

voiddelay(uintz)〃延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

{//delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain0〃主函数

(

uchara;

a=0xfe;

while(1)〃大循环

(

Pl=a;〃点亮小灯

beep=0;〃开启蜂鸣器

delay(500);〃延时500毫秒

Pl=0xff;〃熄灭小灯

beep=l;〃关闭蜂鸣器

delay(500);〃延时500毫秒

a=_crol.(a,1);//将a变量循环左移一位

)

3/*

8个发光管来回流动,

每个管亮100ms,流动时让蜂鸣器发出"滴滴"声.

I*********************************************************/

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitbeep=P2A3;

voiddelay(uintz)〃延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

{“delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain0〃主函数

(

uchara,i;

while(l)〃大循环

(

a=0xfe;〃赋初值

for(i=0;i<8;i++)〃左移

Pl=a;〃点亮小灯

beep=0;〃开启蜂鸣器

delay(50);〃延时50毫秒

beep=l;〃关闭蜂鸣器

delay(50);//再延时50毫秒

a=_crol_(a,1);//将a变量循环左移一位

a=0x7f;

for(i=0;i<8;i++)〃右移

Pl=a;〃点亮小灯

beep=0;〃开启蜂鸣器

delay(50);〃延时50毫秒

beep=l;〃关闭蜂鸣器

delay(50);//再延时50毫秒

a=_cror_(a,1);〃将a变量循环右移一位

)

)

4/*

用8个发光管演示出8位二进制数累加过程。

*/

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

voiddelay(uintz)〃延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

{//delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain0〃主函数

(

uchara;

while(l)〃大循环

(

a++;

Pl=a;

delay(200);

)

)

5/*

8个发光管间隔200ms由上至下,

再由下至上,再重复一次,

然后全部熄灭再以300ms间隔

全部闪烁5次。重复此过程

*/

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

voiddelay(uintz)〃延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

{//delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

voidmain0//主函数

uchara,i,j;

while(l)//大循环

(

for(j=0;j<2;j++)

(

a=0xfe;〃赋初值

for(i=0;i<8;i++)〃左移

(

Pl=a;〃点亮小灯

delay(200);〃延时200毫秒

a=-crol-(a,1);〃将a变量循环左移一位

)

a=0x7f;

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

(

Pl=a;〃点亮小灯

delay(200);〃延时200毫秒

a=.cror.(a,1);〃将a变量循环右移一位

)

)

Pl=0xff;〃全部熄灭

for(j=0;j<10;j++)

(

delay(300);〃延时

P1="P1;//全部取反10次,既闪烁5次

)

)

)

6/*

间隔300ms第一次一个管亮流动一次,

第二次两个管亮流动,依次到8个管亮,

然后重复整个过程。

*/

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

voiddelay(uintz)〃延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

//delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmain()//主函数

(

uchara,i,j;

while⑴〃大循环

(

a=0xfe;〃赋初值

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

(

for(i=0;i<8-j;i++)〃左移

(

Pl=a;〃点亮小灯

delay(200);〃延时200毫秒

a=-crol-(a,1);〃将a变量循环左移一位

)

a=-crol-(a,j);〃补齐,方便下面的左移一位

Pl=0xff;〃全部关闭

a=a«l;//左移一位让多一个灯点亮

)

7/*

间隔300ms先奇数亮再偶数亮,

循环三次;一个灯上下循环三次;

两个分别从两边往中间流动三次;

再从中间往两边流动三次;8个全部闪烁3次;

关闭发光管,程序停止.

*/

I*********************************************************/

#include<reg52.h>//52单片机头文件

#include<intrins.h>//包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

voiddelay(uintz)//延时函数,z的取值为这个函数的延时ms数,如delay(200);大约

延时200ms.

{“delay(500);大约延时500ms.

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

voidmainO〃主函数

uchara,i,j;

for(j=0;j<3;j++)//寄偶交替

(

Pl=0x55;"点亮小灯

delay(300);〃延时300毫秒

Pl=0xaa;

delay(300);〃延时300毫秒

}

for(j=0;j<3;j++)〃流水灯

a=0xfe;

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

(

Pl=a;〃点亮小灯

delay(300);〃延时300毫秒

a=_crol_(a,1);

)

Pl=0xff;

for(j=0;j<3;j++)〃从两边往中间流

(

Pl=0x7e;//点亮小灯

delay(300);//延时300毫秒

Pl=0xbd;

delay(300);〃延时300毫秒

Pl=0xdb;〃点亮小灯

delay(300);〃延时300毫秒

Pl=0xe7;

delay(300);〃延时300毫秒

)

Pl=0xff;

for(j=0;j<3;j++)//从中间往两边流

(

Pl=0xe7;//点亮小灯

delay(300);〃延时300毫秒

Pl=0xdb;

delay(300);〃延时300毫秒

Pl=0xbd;//点亮小灯

delay(300);//延时300毫秒

Pl=0x7e;

delay(300);〃延时300毫秒

)

Pl=0xff;

for(j=0;j<6;j++)〃全部闪烁

P1="P1;//点亮小灯

delay(300);〃延时300毫秒

)

Pl=0xff;

while(l);

)

Lesson3

i/*

利用定时/计数器TO从Pl.0输出周期为1s的方波,

让发光二极管以1HZ闪烁,

设晶振频率为12MHz。?

*/

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar//宏定义

sbitP1_O=P1AO;

uchar11;

voidmain0〃主函数

(

TMOD=0x01;〃设置定时器0为工作方式1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;//开总中断

ETO=1;〃开定时器0中断

TRO=1;〃启动定时器0

while(l);〃等待中断产生

voidtimerO0interrupt1

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

if(tt==20)

(

11=0;

P1-O=_P1_O;

2/*

利用定时/计数器T1产生定时时钟,

由P1口控制8个发光二极管,

使8个指示灯依次一个一个闪动,

闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。

设晶振频率为12MHz.

*/

y*********************************************************

#include<reg52.h>//52单片机头文件

#include<intrins.h>//包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitPl_0=PlA0;

uchar11,a;

voidmain()〃主函数

(

TMOD=0x01;//设置定时器0为工作方式1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;〃开总中断

ET0=l;//开定时器0中断

TR0=l;//启动定时器0

a=0xfe;

while(l);〃等待中断产生

voidtimerO0interrupt1

I

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

if(tt==2)

(

11=0;

Pl=a;

a=_crol_(a,1);

)

)

3/*

同时用两个定时器控制蜂鸣器发声,

定时器0控制频率,定时器1控制同个

频率持续的时间,间隔2s依次输出

1,10,50,100,200,400,800,

Ik(hz)的方波?

设晶振频率为12MHz.

*/

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitbeep=P2A3;

uchar11;

uintfre,flag;

voidmain0〃主函数

(

fre=50000;

beep=0;

TMOD=Oxll;〃设置定时器0,定时器1为工作方式1

TH0=(65536-fre)/256;

TL0=(65536-fre)%256;

THl=(65536-50000)/256;

TLl=(65536-50000)%256;

EA=1;〃开总中断

ET0=l;//开定时器。中断

ET1=1;

TR1=1;

TR0=l;//启动定时器0

while⑴;〃等待中断产生

voidtimerO()interrupt1〃定时器0中断

(

TR0=0;〃进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失

TH0=(65536-fre)/256;

TL0=(65536-fre)%256;

tt++;

if(flag<40)//以下几个if分别用来选取不同的频率

if(tt==10)

(

11=0;

fre=50000;

beep=beep;

)

if(flag>=40&&flag<80)

tt=O;

fre=50000;

beep=beep;

)

if(flag>=80&&flag<120)

(

tt=O;

fre=10000;

beep=beep;

)

if(flag>=120&&flag<160)

(

11=0;

fre=5000;

beep=beep;

)

if(flag>=160&&flag<200)

(

11=0;

fre=2500;

beep=beep;

)

if(flag>=200&&flag<240)

(

11=0;

fre=1250;

beep=beep;

)

if(flag>=240&&flag<280)

(

tt=O;

fre=625;

beep=beep;

)

if(flag>=2804&flag<320)

(

tt=O;

fre=312;

beep=beep;

)

if(flag>=320&&flag<360)

tt=O;

fre=156;

beep=beep;

)

TRO=1;

)

voidtimerl0interrupt3//定时器1中断用来产生2秒时间定时

(

THl=(65536-50000)/256;

TLl=(65536-50000)%256;

flag++;

if(flag==360)

(

flag=0;

fre=50000;

)

)

4/*

用定时器以间隔500Ms在6位数码管上依次显示

0、1、2、3…,C、D、E、F,重复。

设时钟频率为12M

*/

I*********************************************************/

#include<reg52.h>//52单片机头文件

#include<intrins.h>//包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitdula=P2A6;//数码管段选锁存端

sbitwela=P2A7;/〃/数码管位选锁存端

ucharnum,tt;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71);

voidmain0

(

num=0;

tt=O;

TMOD=Ox()l;〃设置定时器0为工作方式1

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;〃开总中断

ET0=l;//开定时器0中断

TR0=l;//启动定时器0

dula=l;

P0=0x3f;〃给段开始送显示0。

dula=0;〃关闭段选锁存端,防止开始时出现乱码。

wela=l;//11101010

P0=0xc0;//打开六个数码管位选

wela=0;

while(1)

(

if(tt==10)//每进入10次中断即为500ms,执行一次显示变化。

11=0;

num++;

if(num==16)

num=0;

dula=l;

P0=table[num];

dula=0;

voidexterO()interrupt1//定时器0中断

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

)

Lesson4

利用动态扫描方法在六位数码管上显示出稳定的654321.

时钟频率为11.0592M

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>//包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitdula=P2A6;//数码管段选锁存端

sbitwela=P2A7;〃//数码管位选锁存端

ucharcodetable[]={〃数码管显示编码

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);〃函数声明

voiddelay(uint);

voidmain0

(

while(1)

(

display(6,5,4,3,2,1);〃始终显示

)

)

voiddisplay(ucharone,uchartwo,ucharthree,ucharfour,ucharfive,ucharsix)

(

dula=l;

P0=table[one];〃送段数据

dula=0;

P0=0xff;//送位数据前关闭所有显示,防止打开位选锁存后段选数据通过

位选锁存器

wela=l;

P0=0xfe;

wela=0;

delay(1);

dula=l;

P0=table[two];

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0;

delay(1);

dula=l;

P0=table[three];

dula=0;

P0=0xff;

wela=l;

P0=0xfb;

wela=0;

delay(1);

dula=l;

P0=table[four];

dula=O;

PO=Oxff;

wela=l;

P0=0xf7;

wela=O;

delay(1);

dula=l;

PO=table[five];

dula=O;

PO=Oxff;

wela=l;

PO=Oxef;

wela=O;

delay(1);

dula=l;

PO=table[six];

dula=O;

PO=Oxff;

wela=l;

PO=Oxdf;

wela=O;

delay(1);

)

voiddelay(uintz)//延时子函数

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y--);

)

2/*

用动态扫描方法和定时器1在数码管的前三位显示出秒表,

精确到1%秒,即最后一位显示1%秒,一直循环下去

设时钟频率为12M

*/

^*********************************************************

#include<reg52.h>//52单片机头文件

#include<intrins.h>〃包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar//宏定义

sbitdula=P2A6;//数码管段选锁存端

sbitwela=P2A7;//〃数码管位选锁存端

ucharge,shi,bai;

uinttt;

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

voiddisplay(uchar,uchar,uchar);〃函数声明

voiddelay(uint);

voidmain0

(

TMOD=OxlO;〃设置定时器1为工作方式1

THl=(65536-10000)/256;

TLl=(65536-10000)%256;

EA=1;//开总中断

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

TR1=1;//启动定时器1

while(l)

(

display(bai,shi,ge);

)

voidexterO()interrupt3//定时器1中断

(

THl=(65536-10000)/256;

TLl=(65536-10000)%256;

tt++;

if(tt==1000)

11=0;

bai=tt/100;

shi=tt%100/10;

ge=tt%10;

)

voiddisplay(ucharone,uchartwo,ucharthree)

(

dula=l;

P0=table[one];//送段数据

dula=0;

P0=0xff;〃送位数据前关闭所有显示,防止打开位选锁存后段选数据通过

位选锁存器

wela=l;

PO=Oxfe;

wela=O;

delay(1);

dula=l;

PO=table[two];

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0;

delay(1);

dula=l;

PO=table[three];

dula=0;

P0=0xff;

wela=l;

P0=0xfb;

wela=0;

delay(1);

)

voiddelay(uintz)〃延时子函数

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

)

3/*

利用动态扫描和定时器1在数码管上显示

出从765432开始以1/10秒的速度往下递减

直至765398并保持显示此数,与此同时利

用定时器0以500MS速度进行流水灯从上至

下移动,当数码管上数减到停止时,实验

板上流水灯也停止然后全部开始闪烁,3秒

后(用T0定时)流水灯全部关闭、数码管上

显示出"HELLO"。到此保持住。

设晶振频率为12MHz.

*/

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

#include<reg52.h>//52单片机头文件

#include<intrins.h>//包含有左右循环移位子函数的库

#defineuintunsignedint〃宏定义

#defineucharunsignedchar〃宏定义

sbitdula=P2A6;

sbitwela=P2A7;

ucharcodetable[]={//显示数据编码

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0);

uchartemp,10,tl,bai,shi,ge,flag,flagl;

uintshu;

voidinit0;〃函数声明

voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge);

voiddelay(uintz)〃延时子函数

(

uintx,y;

for(x=z;x>0;x-)

for(y=110;y>0;y-);

}

voidmain()〃主函数

(

init();

while(1)

(

if(flagl!=l)//如果flagi不再等于1则显示数据

display(7,6,5,bai,shi,ge);

else

display(16,17,18,18,19,20);〃否则显示hello

)

)

voidinit0〃初始化函数

(

shu=432;

temp=0xfe;

Pl=temp;

TMOD=0xll;

TH0=(65536-50000)/256;〃定时器初始化

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TLl=(65536-50000)%256;

EA=1;

ET0=l;

ET1=1;

TRO=1;

TR1=1;

voidtimerO()interrupt1〃定时器0中断

(

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0++;

if(flag!=l)//flag不等于1时进行流水灯

(

if(t0==10)

(

tO=l;

temp=_crol.(temp,1);

Pl=temp;

)

)

else〃否则进行灯闪烁

(

if(t0%4==0)//小灯每200毫秒变化一次

P1=-P1;

if(t0==60)

(

TRO=O;〃3秒后关闭定时器0,关闭灯,并置flag=l

Pl=Oxff;

flagl=l;

)

)

voidtimerl()interrupt3〃定时器1中断函数

(

THl=(65536-50000)/256;

TLl=(65536-50000)%256;

tl++;

if(tl==2)

(

tl=0;

shu—;

bai=shu/100;

shi=shu%l00/10;

ge=shu%10;

if(shu==398)〃当到398时把原来TO中的数清除,重新加裁初值让小灯

闪烁

TRO=O;

THO=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=l;

flag=l;

t0=0;

Pl=0xff;

TR1=O;

)

)

voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge)〃显示子函

(

dula=l;

P0=table[aa];

dula=0;

P0=0xff;

wela=l;

P0=0xfe;

wela=0;

delay(1);

dula=l;

P0=table[bb];

dula=0;

P0=0xff;

wela=l;

P0=0xfd;

wela=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论