和我预想的一致,接下来该涉及外设了!
/********************************************************
*********数码管显示*****数码管显示********************
数码管显示****************数码管显示
***************************************************/
//实例60:用LED数码显示数字5
#include//包含51单片机寄存器定义的头文件
void main(void)
{
P2=0xfe;//P2.0引脚输出低电平,数码显示器接通电源准备点亮
P0=0x92;//让P0口输出数字"5"的段码92H
}
说是外设其实就是利用IO引脚而已,可见基础的重要性。
//实例61:用LED数码显示器循环显示数字0~9
#include //包含51单片机寄存器定义的头文件
/**************************************************
函数功能:延时函数,延时一段时间
***************************************************/
void delay(void)
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
}
/**************************************************
函数功能:主函数
***************************************************/
void main(void)
{
unsigned char i;
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0~9的段码表,程序运行中当数组值不发生变化时,
//前面加关键字code,可以大大节约单片机的存储空间
P2=0xfe; //P2.0引脚输出低电平,数码显示器DS0接通电源工作
while(1) //无限循环
{
for(i=0;i<10;i++)
{
P0=Tab[i]; //让P0口输出数字的段码92H
delay(); //调用延时函数
}
}
}
//实例62:用数码管慢速动态扫描显示数字"1234"
#include // 包含51单片机寄存器定义的头文件
void delay(void) //延时函数,延时一段时间
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
void main(void)
{
while(1) //无限循环
{
P2=0xfe; //P2.0引脚输出低电平,DS0点亮
P0=0xf9; //数字1的段码
delay();
P2=0xfd; //P2.1引脚输出低电平,DS1点亮
P0=0xa4; //数字2的段码
delay();
P2=0xfb; //P2.2引脚输出低电平,DS2点亮
P0=0xb0; //数字3的段码
delay();
P2=0xf7; //P2.3引脚输出低电平,DS3点亮
P0=0x99; //数字4的段码
delay();
P2=0xff;
}
}
注意外设的原理,主要是看引脚的对接和电平的逻辑
//实例63:用LED数码显示器伪静态显示数字1234
#include // 包含51单片机寄存器定义的头文件
void delay(void) //延时函数,延时约0.6毫秒
{
unsigned char i;
for(i=0;i<200;i++)
;
}
void main(void)
{
while(1) //无限循环
{
P2=0xfe; //P2.0引脚输出低电平,DS0点亮
P0=0xf9; //数字1的段码
delay();
P2=0xfd; //P2.1引脚输出低电平,DS1点亮
P0=0xa4; //数字2的段码
delay();
P2=0xfb; //P2.2引脚输出低电平,DS2点亮
P0=0xb0; //数字3的段码
delay();
P2=0xf7; //P2.3引脚输出低电平,DS3点亮
P0=0x99; //数字4的段码
delay();
P2=0xff;
}
}
//实例64:用数码管显示动态检测结果
#include // 包含51单片机寄存器定义的头文件
#include//包含随机函数rand()的定义文件
unsigned char i;//记录中断次数
unsigned int x;//随机检测的数据
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表
/********************************************************************
函数功能:快速动态扫描延时,延时约0.9毫秒
********************************************************************/
void delay(void)
{
unsigned int i;
for(i=0;i<300;i++)
}
/*******************************************************************
函数功能:4位数的数码显示器显示
入口参数:k
出口参数:无
********************************************************************/
void display(unsigned int k)
{
P2=0xfe; //即P2=11111110B,P2.0引脚输出低电平,数码显示器DS0接通电源
P0=Tab[k/1000]; //显示千位
delay();
P2=0xfd; //即P2=11111101B,P2.1引脚输出低电平,数码显示器DS1接通电源
P0=Tab[(k%1000)/100]; //显示百位
delay();
P2=0xfb; //即P2=11111011B,P2.2引脚输出低电平,数码显示器DS2接通电源
P0=Tab[(k%100)/10]; //显示十位
delay();
P2=0xf7; //即P2=11110111B,P2.3引脚输出低电平,数码显示器DS3接通电源
P0=Tab[k%10];//显示个位
delay();
P2=0xff; //关闭所有显示器
}
void main(void)//主函数
{
TMOD=0x01;//定时器0工作方式一
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
display(x);//调用检测结果的显示程序
}
}
/********************************************************
函数功能:定时器T0的中断服务程序
*******************************************************/
void Time0(void) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
i++; //每来一次中断,i自加1
if(i==20) //够20次中断,即1秒钟进行一次检测结果采样
{
x=rand()/10; //随机产生一个从0到32767的整数,再将其除以10,获得一个随机4位数,模拟检测结果
i=0; //将i清0,重新统计中断次数
}
TH0=(65536-46083)/256; //重新给计数器T0赋初值
TL0=(65536-46083)%256;
TR0=1; //启动定时器T0
}
x在中断中发生改变,通过显示函数显示,这个函数的结构就是一个比较复杂的程序的常用结构了,包括初始化和功能块,注意逻辑分析。
//实例65:数码秒表设计
包含51单片机寄存器定义的头文件
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表
unsigned char int_time; //记录中断次数
unsigned char second; //储存秒
/********************************************************************
***
函数功能:快速动态扫描延时,延时约0.6毫秒
*********************************************************************
***/
void delay(void)
{
unsigned char i;
for(i=0;i<200;i++)
;
}
/********************************************************************
***
函数功能:显示秒
入口参数:k
出口参数:无
*********************************************************************
***/
void Display Second(unsigned char k)
{
P2=0xfb; //P2.6引脚输出低电平,DS6点亮
P0=Tab[k/10]; //显示十位
delay();
P2=0xf7; //P2.7引脚输出低电平,DS7点亮
P0=Tab[k%10]; //显示个位
delay();
P2=0xff; //关闭所有数码管
}
void main(void)//主函数
{
TMOD=0x01;//使用定时器T0秒
TH0=(65536-46083)/256; //将定时器计时时间设定为46083×1.085微=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1;//开启总中断
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器T0开始运行
int_time=0;//中断次数初始化
second=0;//秒初始化
while(1)
{
DisplaySecond(second);//调用秒的显示子程序
}
}
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
void interserve(void) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
int_time++; //每来一次中断,中断次数int_time自加1
if(int_time==20) //够20次中断,即1秒钟进行一次检测结果采样
{
int_time=0; //中断次数清0
second++; //秒加1
if(second==60)
second=0;//秒等于60就返回0
}
TH0=(65536-46083)/256; //重新给计数器T0赋初值
TL0=(65536-46083)%256;
TR0=1; //启动定时器T0
}
//实例66:数码时钟设计
#include//包含51单片机寄存器定义的头文件
unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//control shape
unsigned char port[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char int_time;//中断次数计数变量
unsigned char second; //秒计数变量
unsigned char minute; //分钟计数变量
unsigned char hour; //小时计数变量
void delay(void)//延时函数,延时约0.6ms
{
unsigned char j;
for(j=0;j<200;j++);
}
/******************************************************************
函数功能:显示秒的子程序
入口参数:s
********************************************************************/
void Display Second(unsigned char s)
{
P2=0xbf; //P2.6引脚输出低电平,DS6点亮
P0=Tab[s/10]; //显示十位
delay();
P2=0x7f; //P2.7引脚输出低电平,DS7点亮
P0=Tab[s%10]; //显示个位
delay();
P2=0xff; //关闭所有数码管
}
/******************************************************************
函数功能:显示分钟的子程序
入口参数:m
********************************************************************/
void Display Minute(unsigned char m)
{
P2=0xf7; //P2.3引脚输出低电平,DS3点亮
P0=Tab[m/10];//显示个位
delay();
P2=0xef; //P2.4引脚输出低电平,DS4点亮
P0=Tab[m%10];
delay();
P2=0xdf; //P2.5引脚输出低电平,DS5点亮
P0=0xbf; //分隔符“-”的段码
delay();
P2=0xff; //关闭所有数码管
}
/******************************************************************
函数功能:显示小时的子程序
入口参数:h
********************************************************************/
void Display Hour(unsigned char h)
{
P2=0xfe; //P2.0引脚输出低电平,DS0点亮
P0=Tab[h/10]; //显示十位
delay();
P2=0xfd; //P2.1引脚输出低电平,DS1点亮
P0=Tab[h%10]; //显示个位
delay();
P2=0xfb; //P2.2引脚输出低电平,DS2点亮
P0=0xbf; //分隔符“-”的段码
delay();
P2=0xff; //关闭所有数码管
}
/******************************************************************
函数功能:主函数
********************************************************************/
void main(void)
{
TMOD = 0x01; //使用定时器T0
EA=1; //开中断总允许
ET0=1; //允许T0中断
TH0=(65536-46083)/256; //定时器高八位赋初值
TL0=(65536-46083)%256; //定时器低八位赋初值
TR0=1;
int_time=0; //中断计数变量初始化
second=0; //秒计数变量初始化
minute=0; //分钟计数变量初始化
hour=0; //小时计数变量初始化
while(1)
{
DisplaySecond(second); //调用秒显示子程序
delay();
DisplayMinute(minute); //调用分钟显示子程序
delay();
DisplayHour(hour);
delay();
}
}
/******************************************************************
函数功能:定时器T0的中断服务子程序
********************************************************************/
void interserve(void) interrupt 1 using 1 //usingTime0
{
int_time++;
if(int_time==20)
{
int_time=0; //中断计数变量清0
second++; //秒计数变量加1
}
if(second==60)
{
second=0; //如果秒计满60,将秒计数变量清0
minute++; //分钟计数变量加1