欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
自己做的0-99的4位按鍵顯示單片機程序 可控制加減與清零 2017藍橋杯驅動
[打印本頁]
作者:
30296956
時間:
2017-3-19 19:14
標題:
自己做的0-99的4位按鍵顯示單片機程序 可控制加減與清零 2017藍橋杯驅動
這是我自己做的一個0-99的4位按鍵顯示,可分別控制其加減,與清零。同時利用定時器,讓其自動跑。同時附帶IIc,關機自動存儲,已跑的數據。內含數碼管顯示代碼,定時器代碼,IIc代碼。
同時附帶2017藍橋杯驅動.zip。
部分源碼預覽:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit write = 0; //一秒存儲一次
sbit A138 = P2^5; //數碼管動態顯示
sbit B138 = P2^6;
sbit C138 = P2^7;
sbit key1 = P3^0; //4位按鍵
sbit key2 = P3^1;
sbit key3 = P3^2;
sbit key4 = P3^3;
sbit I2C_SCL = P2^0; //II2c
sbit I2C_SDA = P2^1;
uchar duan[18] = //共陽極數碼管
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
uchar wei[8] = //位選
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void display1(uchar w,uchar d);
void display(uchar num);
void delay(uint a);
void timerconfigration(); //定時器初始化
void keyscan(); //按鍵掃描
void I2C_Delay10us();
void I2C_Start();
void I2C_Stop();
uchar I2C_SendByte(uchar dat, uchar ack);
uchar I2C_ReadByte();
void At24c02Write(unsigned char ,unsigned char );
unsigned char At24c02Read(unsigned char );
uchar count,sec;
void main()
{
sec = At24c02Read(2); //讀存儲內容
if(sec>99)
sec = 0;
timerconfigration();
while(1)
{
keyscan();
display(sec);
if(write==1)
{
write = 0;
At24c02Write(2,sec); //存儲
}
}
}
void delay(uint a) //a ms 去抖10MS足以
{
uchar b;
for (;a>0;a--)
for (b=110;b>0;b--);
}
void display1(uchar w,uchar d)
{
A138 = 0;
B138 = 1;
C138 = 1;
P0 = wei[w];
A138 = 1;
P0 = duan[d];
delay(5);
P0 = 0xff;
}
void display(uchar num)
{
display1(0,num/10);
display1(1,num%10);
}
void keyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
sec++;
if(sec==99)
sec = 0;
write = 1;
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(sec==0)
sec = 99;
else
sec--;
write = 1;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
sec = 0;
write = 1;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
while(!key4);
TR0 = ~TR0;
}
}
}
void timerconfigration() //定時器
{
TMOD = 0x01;
TH0 = (65535-46296)/256;
TL0 = (65535-46296)%256;
EA = 1;
ET0 = 1;
// TR0 = 1;
}
void T0_time() interrupt 1
{
TH0 = (65535-46296)/256;
TL0 = (65535-46296)%256;
count++;
if(count==20)
{
count = 0;
sec++;
write = 1;
if(sec==99)
sec = 0;
}
}
void I2C_Delay10us()
{
uchar a, b;
for(b=1; b>0; b--)
{
for(a=2; a>0; a--);
}
}
/*******************************************************************************
* 函 數 名 : I2C_Start()
* 函數功能 : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產生一個下降沿
* 輸 入 : 無
* 輸 出 : 無
* 備 注 : 起始之后I2C_SDA和I2C_SCL都為0
*******************************************************************************/
void I2C_Start()
{
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時間是I2C_SDA保持時間>4.7us
I2C_SDA = 0;
I2C_Delay10us();//保持時間是>4us
I2C_SCL = 0;
I2C_Delay10us();
}
/*******************************************************************************
* 函 數 名 : I2C_Stop()
* 函數功能 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產生一個上升沿
* 輸 入 : 無
* 輸 出 : 無
* 備 注 : 結束之后保持I2C_SDA和I2C_SCL都為1;表示總線空閑
*******************************************************************************/
void I2C_Stop()
{
I2C_SDA = 0;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時間大于4.7us
I2C_SDA = 1;
I2C_Delay10us();
}
/*******************************************************************************
* 函 數 名 : I2cSendByte(uchar num)
* 函數功能 : 通過I2C發送一個字節。在I2C_SCL時鐘信號高電平期間,
* * 保持發送信號I2C_SDA保持穩定
* 輸 入 : num ,ack
* 輸 出 : 0或1。發送成功返回1,發送失敗返回0
* 備 注 : 發送完一個字節I2C_SCL=0, 需要應答則應答設置為1,否則為0
*******************************************************************************/
uchar I2C_SendByte(uchar dat, uchar ack)
{
uchar a = 0,b = 0;//最大255,一個機器周期為1us,最大延時255us。
for(a=0; a<8; a++)//要發送8位,從最高位開始
{
I2C_SDA = dat >> 7; //起始信號之后I2C_SCL=0,所以可以直接改變I2C_SDA信號
dat = dat << 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時間>4.7us
I2C_SCL = 0;
I2C_Delay10us();//時間大于4us
}
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
while(I2C_SDA && (ack == 1))//等待應答,也就是等待從設備把I2C_SDA拉低
{
b++;
if(b > 200) //如果超過200us沒有應答發送失敗,或者為非應答,表示接收結束
{
I2C_SCL = 0;
I2C_Delay10us();
return 0;
}
}
I2C_SCL = 0;
I2C_Delay10us();
return 1;
}
/*******************************************************************************
* 函 數 名 : I2cReadByte()
* 函數功能 : 使用I2c讀取一個字節
* 輸 入 : 無
* 輸 出 : dat
* 備 注 : 接收完一個字節I2C_SCL=0
*******************************************************************************/
uchar I2C_ReadByte()
{
uchar a = 0,dat = 0;
I2C_SDA = 1; //起始和發送一個字節之后I2C_SCL都是0
I2C_Delay10us();
for(a=0; a<8; a++)//接收8個字節
{
I2C_SCL = 1;
I2C_Delay10us();
dat <<= 1;
dat |= I2C_SDA;
I2C_Delay10us();
I2C_SCL = 0;
I2C_Delay10us();
}
return dat;
}
/*******************************************************************************
* 函 數 名 : void At24c02Write(unsigned char addr,unsigned char dat)
* 函數功能 : 往24c02的一個地址寫入一個數據
* 輸 入 : 無
* 輸 出 : 無
…………余下代碼請下載附件…………
復制代碼
0.png
(42.91 KB, 下載次數: 64)
下載附件
2017-3-20 03:39 上傳
下載:
4鍵控制數碼管 存儲.zip
(36.12 KB, 下載次數: 16)
2017-3-19 19:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2017藍橋杯驅動.zip
(113.22 KB, 下載次數: 13)
2017-3-19 19:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
挖掘機在垃圾也
時間:
2019-3-1 21:26
學習借鑒下,原來可以這樣寫的
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1