51單片機:想要計數器每加1,LED1能閃一次,就是LED1狀態是亮-滅-亮-滅,
已經把P34和P10接起來了,但為什么燒錄后,燈是一直亮著的,沒有滅
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit DU = P2^6;
sbit WE = P2^7;
void delay (uint z)//自定義的延時函式
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(uint i)
{
uchar bai,shi,ge;
bai=i/100;
shi=i%100/10;
ge=i%10;
P0=0xff;//清除斷碼
WE = 1;//打開位選鎖存器 高電平打開
P0 = 0xfe;
WE = 0;//鎖存位選資料 低電平關閉
DU = 1;//打開段選鎖存器
P0 = tabel[bai];
DU = 0;//鎖存段選資料
delay(10);
P0=0xff;//清除斷碼
WE = 1;//打開位選鎖存器 高電平打開
P0 = 0xfd;
WE = 0;//鎖存位選資料 低電平關閉
DU = 1;//打開段選鎖存器
P0 = tabel[shi];
DU = 0;//鎖存段選資料
delay(10);
P0 = 0xff;//清除斷碼
WE = 1;//打開位選鎖存器 高電平打開
P0 = 0xfb;//1111 1101
WE = 0;//鎖存位選資料 低電平關閉
DU = 1;//打開段選鎖存器
P0 = tabel[ge];// 顯示2
DU = 0;//鎖存段選資料
delay(10);
}
//定時器0初始化函式
void timer0Init()
{
TR0=1;//啟動定時器0
TMOD=0x01;//選擇定時器0第一個模式 16位定時器,TL0 TH0全用
//TH0和TL0是用來設定初值的,如果想定時50ms,需要先轉換單位,變成50 000us
//用50 000/1.085=46082,這是要加這么多1,初值=65535-46082=19453
//TH0=(19453/256);//這是高八位,除以256是得到有多少個256
//TL0=(19453%256);//這是低八位
//或者可以直接利用計算器來定義,在計算器中19453轉換為二進制為100 1011 1111 1101
//八進制即為4bfd
TH0=0x4b;
TL0=0xfd;
}
void main() //因為沒有用到中斷,所以TF不會主動被硬體清零,需要用程式查詢清零
{
uchar msec=0,sec=0;//毫秒 秒
timer0Init();//定時器0初始化
while(1)
{
if(TF0==0)//判斷是否到了50ms
{
TF0=0;//軟體清零溢位標志位
//溢位標志位清零后TH0 TL0也都被清零了,所以要重放初值
TH0=0x4b;
TL0=0xfd;
msec++;//msec加一,表示50ms到了一次
if(msec==20)//20*50=1000ms=1s
{
msec=0;//將msec清零,讓表能夠走起來
sec++;//表示一秒時間到
}
}
display(sec);
if(sec==10)
{
sec=0;//把秒清零
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226722.html
標籤:單片機/工控
上一篇:TCP
下一篇:紙張對折計算
