实验1 单片机IO口应用及数码管显示
1. 单片机驱动蜂鸣器的实验;
a) 说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.5
b) 基本要求:控制蜂鸣器每2秒响0.5秒。
#include <reg51.h>
#define unit unsigned int
void delay(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
void main()
{
){
P1=0x00;
delay); //0.5秒
P1=0xff;
delay);//2秒
}
}
2. 单片机驱动继电器输出实验;
a) 说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.4
b) 基本要求:控制继电器每5秒吸合0.5秒。
#include <reg51.h>
#define unit unsigned int
void delay(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
sbit JiDian;
void main()
{
){
JiDian=0x00;
delay); //0.5秒
JiDian=0xff;
delay);//2秒
}
}
3.延时实现p2口LED流水灯效果(用循环移位指令)
#include <reg51.h>
#define unit unsigned int
unit table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};
void delay(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
void main()
{
int i;
P2=0x00;
){
;i++){
P2=table[i];
delay);//2秒
}
}
}
4.p2口八个灯作二进制加法。理解二进值的计算
#include<reg51.h>
#define unit unsigned int
void delay(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
void main(){
){
P2=0xff;
while(P2!=0x00){
P2++;
delay);//2秒
}
}
}
5.直接用IO口做位选信号,控制8位数码管上显示1,2,3,4…F,循环显示
说明:P0是位选,P2是段选
#include <reg51.H>
#define unit unsigned int
unit code NumTable[]={0x06,~0x24,~0x30,~0x19,~0x12,~0x02,0x87,0xff,~0x10};
void delay(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
void DisplayNumByOrder(unit DelayNum){
int i;
;i++){
P0=NumTable[i];
delay(DelayNum);//2秒
}
}
void main(){
//P0是段选,P2是位选
P2=0x00;
){
DisplayNumByOrder);
}
}
6.用译码器138做片选信号,控制4位数码管上做加1显示。从0000开始.
说明:JP15与JP16 用8个短路冒连接,JP10 (P0)与J12 用8PIN排线连接
#include <reg51.h>
#include <math.h>
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
做位选信号,控制4位数码管上做加1显示。从0000开始.
void delay_1ms(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
/**
在数码管上显示对应的值
**/
void display(unsignedchar k)
{
P0=NumTable[k];
delay_1ms);
}
sbit high;
sbit mid;
sbit low;
/**
位,并分解计数值
**/
void DisplayNumByOrder(unit Count,unit delay_1msNum){
low);
low);
low);
low);
low);
low);
low);
low);
}
//一个是位选,一个是段选
void main(){
;
){
count++;
DisplayNumByOrder);
;
}
}
7.利用动态扫描方法在八位数码管上显示出稳定的87654321.
#include <reg51.h>
#define unit unsigned int
unit table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};
unit code NumTable[]={0x06,~0x24,~0x30,~0x19,~0x12,~0x02,0x87,0xff,~0x10};
void delay(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
void DisplayNumByOrder(unit DelayNum){
int i;
;i++){
P0=NumTable[i];
P2=table[i];
delay(DelayNum);//5ms
}
}
//一个是位选,一个是段选
void main(){
//P0是位选,P2是段选
//P2=0x00;
){
DisplayNumByOrder);
}
}
8. 数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
#include <reg51.h>
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
sbit high;
sbit mid;
sbit low;
sbit IsCountKey;//是否计数的按键
的时候暂停
//监测
void delay_1ms(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
/**
在数码管上显示对应的值
**/
void display(unsignedchar Num)
{
P0=NumTable[Num];
delay_1ms);
P0; //送完段选信号后,进行消影的处理
}
/**
位,并分解计数值
**/
void DisplayNumByOrder(unit Count){
low);
low);
low);
low);
low);
low);
low);
low);
}
//是否计数
void IsCount(unit count){
if(PRESSED==IsCountKey){ //当按键按下
delay_1ms); //去抖动
if(PRESSED==IsCountKey){//当按键按下
while(PRESSED==IsCountKey){//当按键一直按下
DisplayNumByOrder(count);//显示原数值
}
}
}
}
//扫描键盘
void main(){
;
){
IsCount(count);
count++;
DisplayNumByOrder(count);
;
}
}
9. 在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
#include <reg51.h>
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
sbit high;
sbit mid;
sbit low;
sbit Key1;//开始
sbit Key2;//暂停
sbit Key3;//清零
;//按下
的时候暂停
//监测
void delay_1ms(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
/**
在数码管上显示对应的值
**/
void display(unsignedchar Num)
{
P0=NumTable[Num];
delay_1ms);
P0; //送完段选信号后,进行消影的处理
}
/**
位,并分解计数值
**/
void DisplayNumByOrder(unit Count){
low);
low);
low);
low);
low);
low);
low);
low);
}
//是否清零
void IsClear(unit * count){
if(PRESSED==Key3){ //当按键按下
delay_1ms); //去抖动
if(PRESSED==Key3){ //当按键按下
;
}
}
}
//是否暂停
void IsSuspend(unit * count){
if(PRESSED==Key2){ //当按键按下
delay_1ms); //去抖动
if(PRESSED==Key2){ //当按键按下
while(SUSPEND){
IsClear(count); //监测是否需要清零
if(PRESSED==Key1)return;//跳出暂停
DisplayNumByOrder(*count);//显示原数值
}
}
}
}
//扫描键盘
void main(){
;
){
IsSuspend(&count);
IsClear(&count);
count++;
DisplayNumByOrder(count);
;
}
}
10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
#include <reg51.h>
#include <stdio.h>
#define unit unsigned int
#define uchar unsigned char
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
sbit high;
sbit mid;
sbit low;
sbit Key1;//开始
sbit Key2;//暂停
sbit Key3;//清零
;//按下
的时候暂停
//延时
void delay_1ms(unit x){
unit i=x;
unit j;
;--i){
;--j);
}
}
/**
在数码管上显示对应的值
**/
void display(unsignedchar Num)
{
P0=NumTable[Num];
delay_1ms);
P0; //送完段选信号后,进行消影的处理
}
/**
位,并分解计数值
**/
void DisplayNumByOrder(unit Count){
low);
low);
low);
low);
low);
low);
low);
low);
}
//是否清零
void IsClear(unit * count){
if(PRESSED==Key3){ //当按键按下
delay_1ms); //去抖动
if(PRESSED==Key3){ //当按键按下
;
}
}
}
//是否暂停
void IsSuspend(unit * count){
if(PRESSED==Key2){ //当按键按下
delay_1ms); //去抖动
if(PRESSED==Key2){ //当按键按下
while(SUSPEND){
IsClear(count); //监测是否需要清零
if(PRESSED==Key1)return;//跳出暂停
DisplayNumByOrder(*count);//显示原数值
}
}
}
}
uchar scanKey(){
uchar tmp, key;
P3 =0xf0;
tmp = P3;
tmp = tmp &0xf0;
if(tmp !=0xf0){//确定列
switch(tmp){
;break;
;break;
;break;
;break;
}
}
//确定行
P3 =0x0f;
tmp = P3;
tmp = tmp &0x0f;
if(tmp !=0x0f){
switch(tmp){
case0x0d:key = key;break;
+ key;break;
+ key;break;
}
}
return key;
}
//扫描键盘
void main(){
// int count=0;
){
unit key= scanKey();
DisplayNumByOrder(key*key);
}
}
实验1 单片机IO口应用及数码管显示的更多相关文章
- STM32系列单片机IO口模式设置
STM32单片机的每组IO口都有4个32位配置寄存器用于配置GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR和GPIOx_PUPDR,2个32位数据寄存器用于配置输入和 ...
- 单片机IO口驱动能力
以STM32的IO口为例,最大的输出电流和灌入电流在芯片手册上都有说明.单个IO口一般都是十几mA到几十mA,同时总的VDD电流也有限制,大概为150mA.所以单片机驱动外设时,如果不是信号型而是功率 ...
- 如何检测 51单片机IO口的下降沿
下降沿检测,说白了就是满足这样一个逻辑,上次检测是1,这次检测是0,就是下降沿. 从这个条件可知,要确保能够正确检测到一个下降沿,负脉冲的宽度,必须大于一个检测周期,当负脉冲宽度小于一个检测周期,就有 ...
- 51单片机:IO口扩展芯片用法(74HC165,74HC595)
IO口扩展芯片,主要是解决单片机IO口太少. 74HC165:数据从并转串 74HC595:数据从串转并 两种芯片,都是通过时序电路,加上移位功能,进行数据传输 74HC165:数据从并转串.以下实例 ...
- 单片机小白学步系列(二十) IO口原理
IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比較长的篇幅介绍IO口的原理. 也是查阅了不少资料,确保内容正确无误,花了非常长时间写的. IO口原理原本须要涉及非常多深入的知识,而这里尽最大 ...
- MOS管、PCB、H桥、步进电机驱动电路、51单片机的IO口驱动能力、灌电流、拉电流、上拉电阻的选择
嵌入式开发PCB设计几点体会(转载):http://bbs.ednchina.com/BLOG_ARTICLE_3021801.HTMCollector-Emitter Saturation Volt ...
- 51单片机I/O引脚IO口工作原理
51单片机I/O引脚IO口工作原理 一.51单片机管脚p0.p1.p2.p3口区别如下: 1.意思不同P0口作输出口用时,需加上拉电阻.P0口有复用功能.当对外部存储器进行读写操作时,P0口先是提供外 ...
- AVR单片机8位数码管显示的程序实现
AVR单片机8位数码管显示的程序实现 转载:http://www.sohu.com/a/117255149_119709 2016-10-26 16:30 我们接着来完成 数码管的显示实验.现在我 ...
- 单片机与控制实验(5)——重量测量并在LCD12864显示
一.实验目的和要求 掌握点阵式液晶显示屏的原理和控制方法,掌握点阵字符的显示方法.掌握模拟/数字(A/D)转换方式,进一步掌握使用C51语言编写程序的方法,使用C51语言编写实现重量测量的功能. 二. ...
随机推荐
- The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone问题解决
从错误即可知道是时区的错误,因此只要将时区设置为你当前系统时区即可 因此使用root用户登录mysql,按照如下图所示操作即可. 把时区设置为所在地时区(即东八区的时区)后,再连接数据库就可以了
- MySQL复制(Replication)
引自:http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html 1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1 ...
- python正则表达式获取两段标记内的字符串
比如获取绿色字符串 ModelData.PayTableData =[{"}, {"}, {"}]; ModelData.PayTableData1 =[{"} ...
- strace使用
统计信息 -c -- count time, calls, and errors for each syscall and report summary 输出结果到文件 -o 例如 strace ...
- 2018.10.27 bzoj3209: 花神的数论题(数位dp)
传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...
- c#中数组array和list在函数间传递 转置
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 安卓修改开机logo和开机动画的方法
第一种和第二种方法亲测可用,安卓版本是4.2和安卓5.1均可.第二种方法待验证 以下三种方法 Android 开机其实总共会出现3个画面: 1.第一个就是 linux 系统启动,出现Linux小企鹅画 ...
- python.csv 按行按列读取
参考:https://blog.csdn.net/ly_ysys629/article/details/55107237 # header=0,表示文件第0行为列索引 # index_col=0,表示 ...
- AngularJS实战之filter的使用二
博文一中的filter是angular自带的filter,一般不会满足我们的使用.我们可以自定义filter. 一.自定义filter实现反转字符串 <div>{{ceshi|revers ...
- 源项目 -> fork -> 本地 (如何把源项目的代码合并到本地然后推送给fork)
git remote -v git remote add 别名 地址 git fetch 别名 git merge 别名/分支 第一步:命令行进入到本地.git 所在的目录,查看remote 信息 ...