【Keil5 C51】AT89C52 数码管的动态显示
生活随笔
收集整理的這篇文章主要介紹了
【Keil5 C51】AT89C52 数码管的动态显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數碼管的動態顯示原理
第一個數碼管顯示0,1s后第二個數碼管顯示1,直到第六個數碼管顯示5后又重新開始
#include <reg52.h>#define uint unsigned int #define uchar unsigned charsbit LE_D = P2^6; sbit LE_W = P2^7;uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98}; uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20}; uint time = 0; uint Num_D = 0; uint Num_W = 0;void main(){//中斷初始化TMOD = 0x01; //0000 0001TH0 = 0xFC; //1msTL0 = 0x17;EA = 1;ET0 = 1;TR0 = 1;//第一個數碼管顯示0,1mS后第二個數碼管顯示1...while(1){if(time == 1000){ time = 0;if(Num_D == 6) Num_D = 0; if(Num_W == 6) Num_W = 0;//消隱(當你更新顯示的“段”的時候,顯示的位置,還是在前一時間的“位”上;//然后你再更新“位”,這就出現移動的效果了。)LE_W = 1;P0 = 0x00;LE_W = 0;LE_D = 1;P0 = table_D[Num_D];LE_D = 0;LE_W = 1;P0 = table_W[Num_W];LE_W = 0;Num_D++;Num_W++; } } }void exter1() interrupt 1{TH0 = 0xFC; //1msTL0 = 0x17;time++; }如果我們把數字依次顯示的間隔時間換為5mS,那么數碼管就能動態顯示出012345
用數碼管動態顯示1-300
#include <reg52.h>#define uint unsigned int #define uchar unsigned charsbit LE_D = P2^6; sbit LE_W = P2^7;uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98}; uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20}; uint time = 0; uint Num_D = 0; uint Num_W = 0; uchar ge,shi,bai; uint num = 0;void init(); void delay(uint dtime); void display(uint num);void main(){init();num = 0;while(1){if (time >= 1000){time = 0;num++; if(num == 301){num = 0;} }display(num);} }//計時器中斷函數 void exter1() interrupt 1{TH0 = 0xFC; //1msTL0 = 0x17;time++; }//數碼管顯示數字的函數 void display(uint num){ bai = num / 100; //百位應顯示的數字shi = num % 100 /10; //十位應顯示的數字ge = num % 10; //個位應顯示的數字//數碼管顯示個位數字LE_D = 1;P0 = table_D[ge]; //段——>位 會在段所指的位置上顯示段LE_D = 0; //位——>段 新的數字會顯示到之前的位置上LE_W = 1;P0 = 0x20; //0010 0000LE_W = 0;delay(1);LE_W = 1; //消隱P0 = 0;LE_W = 0;//數碼管顯示十位數字LE_D = 1;P0 = table_D[shi]; LE_D = 0; LE_W = 1;P0 = 0x10; //0001 0000LE_W = 0;delay(1);LE_W = 1; //消隱P0 = 0;LE_W = 0;//數碼管顯示百位數字LE_D = 1;P0 = table_D[bai];LE_D = 0;LE_W = 1;P0 = 0x08; //0000 1000LE_W = 0;delay(1);LE_W = 1; //消隱P0 = 0;LE_W = 0; } //延時 void delay(uint dtime) //delay = 1 ms 0.001s {uint y;uint z;for(z = dtime; z > 0; z--){for(y = 115; y > 0; y--){}} }//初始化 void init(){ LE_D = 0;LE_W = 0;TMOD = 0x01; //0000 0001TH0 = 0xFC; //1msTL0 = 0x17;EA = 1;ET0 = 1;TR0 = 1; }Proteus仿真
總結
以上是生活随笔為你收集整理的【Keil5 C51】AT89C52 数码管的动态显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高质量的年会怎么策划
- 下一篇: 运算放大电路在音频放大电路中的应用研究与