#include<reg52.h>
sbit deng=P0^0;
void delay(uint z)
{ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void main()
{ while(1) { deng=1; delay(1000);//延時1S } }
/*用定時器以間隔1000MS在6位數(shù)碼管上依次顯示 0、1、2、3....C、D、E、F,重復(fù)。同時讓數(shù)碼管亮 設(shè)時鐘頻率為12M */ /*********************************************************/ #include<reg52.h> //52單片機頭文件 #include <intrins.h> //包含有左右循環(huán)移位子函數(shù)的庫 #include "51hei.h" #define uint unsigned int //宏定義 #define uchar unsigned char //宏定義 sbit dula=P2^6; //數(shù)碼管段選鎖存端 sbit wela=P2^7; ////數(shù)碼管位選鎖存端 sbit den_con=P1^4; /// 燈的控制端口 uchar num,tt,i; uchar code table[]={ //段碼表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void main() {guandz(); num=0; tt=0; den_con=1; TMOD=0x01;//設(shè)置定時器0為工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//開總中斷 ET0=1;//開定時器0中斷 TR0=1;//啟動定時器0 dula=1; P0=0x3f; //給段開始送顯示0。 dula=0;//關(guān)閉段選鎖存端,防止開始時出現(xiàn)亂碼。 wela=1;//11101010 P0=0x00; // 打開六個數(shù)碼管位選 wela=0; while(1) //死循環(huán) { if(tt==20) //每進入10次中斷即為500ms,執(zhí)行一次顯示變化。 { tt=0; num++; if(num==16) num=0; dula=1; //開通74hc573,使p0口數(shù)據(jù)能直通 P0=table[num]; //送數(shù)碼管段選值 dula=0; //鎖存負責(zé)段選的74hc573 den_con=0; //燈亮的控制口打開 P0=0xfe; for(i=0;i<100;i++); den_con=1; //燈亮控制口關(guān)閉 } } } void exter0() interrupt 1 // 定時器0中斷 { TH0=(65536-50000)/256; //送初值 TL0=(65536-50000)%256; tt++; //tt=tt+1 }
樓上的2位的答案很好 2樓是用延時的方法搞定的 3樓是用定時器的方法搞定的.
12M不是有誤差嗎?我什么不用11.0592M的
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |