標(biāo)題:
51單片機(jī)數(shù)碼管實(shí)驗(yàn)程序(動(dòng)態(tài)、靜態(tài)顯示)注釋很詳細(xì)
[打印本頁(yè)]
作者:
Galtondaxy
時(shí)間:
2022-5-20 17:59
標(biāo)題:
51單片機(jī)數(shù)碼管實(shí)驗(yàn)程序(動(dòng)態(tài)、靜態(tài)顯示)注釋很詳細(xì)
基于AT89C52單片機(jī)的數(shù)碼管類實(shí)驗(yàn)
電路原理圖如下
1.png
(87.07 KB, 下載次數(shù): 30)
下載附件
2022-5-20 19:47 上傳
單片機(jī)源程序如下:
/***************************************************************************
標(biāo)題: 數(shù)碼管的顯示
效果: 顯示00-99,動(dòng)態(tài)顯示+變化顯示
******************************************************************************/
//頭文件:
#include "reg51.h"
//變量定義:
unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共陽(yáng)數(shù)碼管 0-9
//引腳定義:
sbit SMG_q = P1^0; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)
sbit SMG_b = P1^1; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P1^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P1^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
//函數(shù)聲明:
void display(unsigned char da);//定義顯示函數(shù),參數(shù)為顯示內(nèi)容,只顯示兩位數(shù)
void delay(void);
//主函數(shù),C語(yǔ)言的入口函數(shù):
void main(void)
{
unsigned char i=0; //作為查表的索引號(hào)
unsigned char ldata; //變量用作0~99計(jì)數(shù)
unsigned int j; //此變量作為計(jì)數(shù)跳變刷新時(shí)間
while(1)
{
j=5000;
while(j--){
display(ldata); //刷新5000次,約1秒,注:在C語(yǔ)言里是沒有周期可計(jì)算的哦~~~
}
if(ldata<99)
ldata++; //刷新完成約1秒,變量做加計(jì)數(shù)
else
ldata=0;
}
}
//顯示函數(shù),參數(shù)為顯示內(nèi)容,只顯示兩位數(shù)
void display(unsigned char da)
{
SMG_q=0; //選擇十位數(shù)碼管
P0=table[da/10]; //獲取十位值,查表輸出定義好的數(shù)碼管段值與P0口,顯示相應(yīng)的0-9
delay(); //延時(shí)
P0=0XFF; //清除數(shù)碼管顯示,因是共陽(yáng)型,所以不是0
SMG_q=1; //關(guān)閉十位數(shù)碼管
SMG_b=0; //選擇個(gè)位數(shù)碼管
P0=table[da%10]; //獲取個(gè)位值,查表輸出定義好的數(shù)碼管段值與P0口,顯示相應(yīng)的0-9
delay(); //延時(shí)
P0=0XFF; //清除數(shù)碼管顯示,因是共陽(yáng)型,所以不是0
SMG_b=1; //關(guān)閉個(gè)位數(shù)碼管
}
//延時(shí)子函數(shù),短暫延時(shí)
void delay(void){
unsigned char i=10;
while(i--);
}
復(fù)制代碼
/***************************************************************************
標(biāo)題: 數(shù)碼管的顯示
效果: 顯示1234,從這個(gè)例子可以學(xué)習(xí)多位數(shù)碼管的動(dòng)態(tài)顯示技術(shù)
******************************************************************************/
//頭文件:
#include "reg51.h"
//變量定義:
unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共陽(yáng)數(shù)碼管 0-9
//引腳定義:
sbit SMG_q = P1^0; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)
sbit SMG_b = P1^1; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P1^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P1^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
//函數(shù)聲明:
void delay(void); //延時(shí)子函時(shí)
//主函數(shù),C語(yǔ)言的入口函數(shù):
void main(void)
{
unsigned char i=0; //作為查表的索引號(hào)
while(1) //不停的循環(huán)掃描,不掃描則不顯示或顯示不正確,即為動(dòng)態(tài)顯示,
{ //數(shù)碼管顯示 1234,可自行修改
SMG_q=0; //選擇千位數(shù)碼管
P0=table[1]; //查找"1"定義好的數(shù)碼管段值與P0口輸出,顯示相應(yīng)的1
delay(); //加入短暫延時(shí)
P0=0XFF; //清除數(shù)碼管顯示,因是共陽(yáng)型,所以不是0
SMG_q=1; //關(guān)閉千位數(shù)碼管
SMG_b=0; //選擇百位數(shù)碼管
P0=table[2]; //查找"2"定義好的數(shù)碼管段值與P0口輸出,顯示相應(yīng)的2
delay(); //加入短暫延時(shí)
P0=0XFF; //清除數(shù)碼管顯示,因是共陽(yáng)型,所以不是0
SMG_b=1; //關(guān)閉百位數(shù)碼管
SMG_s=0; //選擇十位數(shù)碼管
P0=table[3]; //查找"2"定義好的數(shù)碼管段值與P0口輸出,顯示相應(yīng)的2
delay(); //加入短暫延時(shí)
P0=0XFF; //清除數(shù)碼管顯示,因是共陽(yáng)型,所以不是0
SMG_s=1; //關(guān)閉十位數(shù)碼管
SMG_g=0; //選擇個(gè)位數(shù)碼管
P0=table[4]; //查找"2"定義好的數(shù)碼管段值與P0口輸出,顯示相應(yīng)的2
delay(); //加入短暫延時(shí)
P0=0XFF; //清除數(shù)碼管顯示,因是共陽(yáng)型,所以不是0
SMG_g=1; //關(guān)閉個(gè)位數(shù)碼管
}
}
//延時(shí)子函數(shù),短暫延時(shí)
void delay(void){
unsigned char i=10;
while(i--);
}
復(fù)制代碼
/***************************************************************************
標(biāo)題: 數(shù)碼管的顯示
效果: 靜態(tài)顯示一位數(shù)碼管,顯示0-9
******************************************************************************/
//頭文件:
#include "reg51.h"
//變量定義:
unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共陽(yáng)數(shù)碼管 0-9
//引腳定義:
sbit SMG_q = P1^0; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)
sbit SMG_b = P1^1; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P1^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P1^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
//函數(shù)聲明:
void delay(unsigned int d_time); //延時(shí)子函時(shí),
//主函數(shù),C語(yǔ)言的入口函數(shù):
void main(void)
{
unsigned char i; //定義循環(huán)變量
while(1)
{
SMG_q=0; //選擇千位數(shù)碼管,這是靜態(tài)顯示,P0口輸出顯示,不需要刷新,也可選擇百位、十位或個(gè)位;
//也可兩位或全部同時(shí)輸出顯示
for(i=0;i<10;i++) //循環(huán)顯示0-9
{
P0=table[i]; //查表輸出數(shù)碼管段值給P0口,顯示相應(yīng)的0-9
delay(500); //延時(shí)
}
}
}
//延時(shí)子函數(shù),參數(shù)范圍 0-65536
void delay(unsigned int tmp)
{
unsigned char j;
while(tmp--){
j=255;
while(j--);
}
}
復(fù)制代碼
/***************************************************************************
標(biāo)題: 數(shù)碼管的顯示
效果: 靜態(tài)顯示一位數(shù)碼管,顯示一個(gè)"5"
******************************************************************************/
//頭文件:
#include "reg51.h"
//引腳定義:
sbit SMG_q = P1^0; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)
sbit SMG_b = P1^1; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P1^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P1^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
//主函數(shù),C語(yǔ)言的入口函數(shù):
void main(void)
{
SMG_q=0; //打開千位數(shù)碼管,這是靜態(tài)顯示,P0口輸出顯示,不需要刷新,也可選擇百位、十位或個(gè)位;
//也可兩位或全部同時(shí)輸出顯示
P0=0x92; //輸出數(shù)碼管段值給P0口,顯示相應(yīng)的5,
//0-9的段值分別是(共陽(yáng)):0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
while(1); //程序停止
}
復(fù)制代碼
/***************************************************************************
標(biāo)題: 數(shù)碼管的顯示
效果: 顯示1234,緩沖顯示
******************************************************************************/
//頭文件:
#include "reg51.h"
//變量定義:
code unsigned char table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:共陽(yáng)數(shù)碼管 0-9
unsigned char l_disbuff[4]={1,2,3,4,};//顯示緩沖
unsigned char l_posit=0; //顯示位置
//引腳定義:
sbit SMG_q = P1^0; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)
sbit SMG_b = P1^1; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P1^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P1^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
//函數(shù)聲明:
void delay(unsigned int timer); //延時(shí)子函時(shí)
void display(); //顯示
//主函數(shù),C語(yǔ)言的入口函數(shù):
void main(void)
{
unsigned int i=10000,j=1000;
while(1) //不停的循環(huán)掃描,不掃描則不顯示或顯示不正確,即為動(dòng)態(tài)顯示,
{
display(); //調(diào)用顯示緩沖內(nèi)容
delay(10);
}
}
//延時(shí)子函數(shù),短暫延時(shí)
void delay(unsigned int timer){
while(timer--);
}
//顯示函數(shù),參數(shù)為顯示內(nèi)容
void display()
{
P0=0XFF; //
switch(l_posit){
case 0: //選擇千位數(shù)碼管,關(guān)閉其它位
SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[0]]; //輸出顯示內(nèi)容
break;
case 1: //選擇百位數(shù)碼管,關(guān)閉其它位
SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[1]];
break;
case 2: //選擇十位數(shù)碼管,關(guān)閉其它位
SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[2]];
break;
case 3: //選擇個(gè)位數(shù)碼管,關(guān)閉其它位
SMG_q=1;
SMG_b=1;
SMG_s=1;
SMG_g=0;
P0=table[l_disbuff[3]];
break;
}
l_posit++; //每調(diào)用一次將輪流顯示一位
if(l_posit>3)
l_posit=0;
}
復(fù)制代碼
以上Keil代碼下載:
純代碼.7z
(16.66 KB, 下載次數(shù): 14)
2022-5-23 03:21 上傳
點(diǎn)擊文件名下載附件
數(shù)碼管類實(shí)驗(yàn)包
下載積分: 黑幣 -5
作者:
heicad
時(shí)間:
2022-5-23 03:36
注釋夠詳細(xì) 對(duì)初學(xué)者有參考價(jià)值
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1