時(shí)鐘及溫度用74hc164+74ls145數(shù)碼管顯示單片機(jī)程序
電路圖很簡(jiǎn)單我就不畫(huà)了 數(shù)碼管用74hc164串行轉(zhuǎn)并行芯片+74ls145這2個(gè)芯片驅(qū)動(dòng)一個(gè)負(fù)責(zé)段選一個(gè)負(fù)責(zé)位選,具體看程序頂部的引腳定義.完整的keil工程文件下載地址:http://www.51hei.com/f/164smg.rar 下面是程序源碼.
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit iicclk=P1^0;////總線存儲(chǔ)時(shí)鐘引腳定義
sbit iicdat=P1^1;////總線存儲(chǔ)數(shù)據(jù)引腳定義
sbit hc164dat=P1^2;//段顯串行數(shù)據(jù)引腳定義
sbit hc164clk=P1^3;//段顯串行時(shí)鐘引腳定義
/*sbit hc164clr=P1^4;*///段顯芯片清零引腳,低電平時(shí),全部輸出引腳清零,即低電平
sbit ls145p0=P1^5;///位選譯碼芯片P0
sbit ls145p1=P1^6;///位選譯碼芯片P1
sbit ls145p2=P1^7;///位選譯碼芯片P2
sbit ls145p3=P3^7;///位選譯碼芯片P2,用于在74HC164移入數(shù)據(jù)時(shí)P0~P3全置高,關(guān)閉所有數(shù)碼管
sbit DS1820DQ=P0^0;
sbit ADD=P0^4;///////加一
sbit MINUS=P0^5;/////減一
sbit ENTER=P0^6;/////確定
sbit SET=P0^7;///////設(shè)定鍵
uchar code tabledu[]={0xed,0x21,0x8f,0xab,0x63,0xea,0xee,0xa1,0xef,0xeb,0x0};//垃圾顯示板0~~9段顯數(shù)據(jù)
uchar code tablewe[]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0x10};//位選編碼,P2口高八位產(chǎn)生編碼值,0x10為關(guān)閉所有位選
char dateshu[8];
uchar tim,sec,ming,mins,hourg,hours,min,hour,setflag,seta,dqflag,temperl,temperh,dat;
void delay1ms(uint x)//0.5毫秒延時(shí)函數(shù)
{
uint y,z;
for(y=x;y>0;y--)
for(z=60;z>0;z--);
}
void delayns()
{
_nop_();
_nop_();
}
void delay10us(uchar z)//z為3是定時(shí)10微秒
{
while(z)
z--;
}
void DelayX0us(uchar n)
{
while (n--)
{
_nop_();
_nop_();
}
}
void dqrsr()//1820初始化函數(shù)
{
dqflag=0;
DS1820DQ=1;
delayns();
DS1820DQ=0;
DelayX0us(48);//時(shí)序延時(shí)500US
DS1820DQ=1;
delay10us(6);//時(shí)序延時(shí)20us
if(DS1820DQ==0)dqflag=1;
DelayX0us(42);
}
void dqwrite(uchar a)
{
uchar i;
dqflag=0;
DS1820DQ=1; //to釋放總線
delayns();//時(shí)序延時(shí)
for(i=8;i>0;i--)//寫(xiě)一個(gè)字節(jié)的數(shù)據(jù)
{
DS1820DQ=0;//總線置低
_nop_();
_nop_();
a=a>>1;//右移時(shí),逸出位保存到CY中
DS1820DQ=CY;//發(fā)送送據(jù)
DelayX0us(6);//延時(shí)70us
DS1820DQ=1; //to釋放總線
}
}
uchar dqread(void)//1820讀函數(shù)
{
uchar i;
DS1820DQ=1; //to釋放總線
delayns();//時(shí)序延時(shí)
for(i=0;i<8;i++)
{
dat>>=1;
DS1820DQ=0;
_nop_();
_nop_();
DS1820DQ=1;
delayns();
if(DS1820DQ)dat|=0x80; //如果讀回的數(shù)據(jù)為1則作與處理移入DAT變量
DelayX0us(6);//延時(shí)70us
}
return dat;
}
void write164(uchar x)
{
uchar y;
hc164clk=0;//時(shí)鐘置低
_nop_();
_nop_();
for(y=0;y<8;y++)
{
hc164dat=(x&0x80);
delayns();
hc164clk=1;
delayns();
hc164clk=0;
delayns();
x<<=1;
}
}
void init()
{
P0=0xff;//輸入接口P0全置一,讓按鍵讀回輸入信息
P2=tablewe[8];//關(guān)閉所有數(shù)碼管的位選
hc164clk=0;//時(shí)鐘置低,以產(chǎn)生上升沿移入數(shù)據(jù)
IE=0X82; //EA=1開(kāi)總中斷ET0=1定時(shí)器零中斷允許
TCON=0X10;//TR0=1定時(shí)零中斷啟動(dòng)
TMOD=0X01;//M1M0=01 T0 工作方式1,16位定時(shí)器
TH0=(65636-50000)/256;
TL0=(65636-50000)%256;//50ms定時(shí)初值
DS1820DQ=1;
}
void iicstart()//暫未使用
{
}
void iicstop()//暫未使用
{
}
void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)//顯示函數(shù)
{
P2=tablewe[8];
write164(tabledu[a]);
P2=tablewe[0];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[b]);
P2=tablewe[1];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[c]);
P2=tablewe[2];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[d]);
P2=tablewe[3];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[e]);
P2=tablewe[4];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[f]);
P2=tablewe[5];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[g]);
P2=tablewe[6];
delay1ms(2);
P2=tablewe[8];
write164(tabledu[h]);
P2=tablewe[7];
delay1ms(2);
}
void timer()//24小時(shí)時(shí)間計(jì)算函數(shù)
{
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)
{
hour=0;
}
}
}
dateshu[0]=sec%10;
dateshu[1]=sec/10;
dateshu[2]=min%10;
dateshu[3]=min/10;
dateshu[4]=hour%10;
dateshu[5]=hour/10;
}
void key()//設(shè)定程序入口
{
if(SET==0)
{
setflag=1;
}
評(píng)論