仿真圖proteus7.8及以上
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計(jì)編號:S0061
?1.主要功能:
基于51單片機(jī)AT89C51/52(與AT89S51/52、AT89C51/52、STC89C51/52等51內(nèi)核單片機(jī)通用)
1、設(shè)備初始化時(shí)鐘為 23 時(shí) 59 分 50 秒。
2、按鍵 K4 定義為“時(shí)鐘設(shè)置”按鍵,通過該按鍵可切換選擇待調(diào)整的時(shí)、分、秒,當(dāng)前選擇的顯示單元以 1 秒為間隔亮滅,時(shí)、分、秒的調(diào)整需注意數(shù)據(jù)邊界屬性。
3、按鍵 K2 定義為“加”按鍵,在“時(shí)鐘設(shè)置”狀態(tài)下,每次按下該按鍵當(dāng)前選擇的單元(時(shí)、分或秒)增加 1 個(gè)單位。
4、按鍵 K1 定義為“減”按鍵,在“時(shí)鐘設(shè)置”狀態(tài)下,每次按下該按鍵當(dāng)前選擇的單元(時(shí)、分或秒)減少 1 個(gè)單位。
5、“時(shí)鐘顯示”狀態(tài)下,按下 K3 按鍵,顯示溫度數(shù)據(jù),松開按鍵,返回“時(shí)鐘顯示”界面。
6、當(dāng)溫度超過 30 攝氏度時(shí)指示燈 D1 以 0.2 秒為間隔閃爍。
需注意仿真中51單片機(jī)芯片是兼容的,AT89C51,AT89C52是51單片機(jī)的具體型號,內(nèi)核是一樣的。相同的原理圖里,無論stc還是at都一樣,引腳功能都是一樣的,程序是兼容的,芯片可以替換為STC89C52/STC89C51/AT89C52/AT89C51等51單片機(jī)芯片。
?講解視頻:
仿真講解+代碼講解
?2.仿真設(shè)計(jì)
開始仿真
打開仿真工程,雙擊proteus中的單片機(jī),選擇hex文件路徑,然后開始仿真。
?3. 程序代碼
使用keil4或者keil5編譯,代碼有注釋,可以結(jié)合報(bào)告理解代碼含義。
主函數(shù)main.c代碼
#include <reg51.h>
#include"temp.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sbit L1=P2^2;//138引腳
sbit L2=P2^3;
sbit L3=P2^4;
sbit k1=P3^0; //減
sbit k2=P3^1; //加
sbit k3=P3^2; //切換
sbit k4=P3^3; //設(shè)置
sbit led=P2^0; //led
uchar key=0;//按鍵標(biāo)志
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9
uchar shuma[8]={0x5b,0x4f,0x40,0x6d,0x6f,0x40,0x6d,0x3f};//時(shí)間顯存
uchar wendu[3]={0x3f,0x3f,0x39};//溫度顯存
uchar time=0,miao=50,fen=59,shi=23; //計(jì)時(shí)
uchar wen=0;//溫度
uchar time0=0,time1=0;//定時(shí)變量
uchar mode=0;//模式,設(shè)置用
void delay(uint i);//函數(shù)聲明
void display1() //顯示溫度
{
uchar i;
for(i=0;i<3;i++)
{
P0=0;
P2=(P2& 0xe3)+(i<<2);
P0=wendu[2-i];
delay(50);
}
}
void display2() //顯示時(shí)間
{
uchar i;
for(i=0;i<8;i++)
{
P0=0;
P2=(P2& 0xe3)+(i<<2);
P0=shuma[7-i];
delay(50);
}
}
//顯示計(jì)算
void suan()
{
shuma[0]=smgduan[shi/10];
shuma[1]=smgduan[shi%10];
shuma[3]=smgduan[fen/10];
shuma[4]=smgduan[fen%10];
shuma[6]=smgduan[miao/10];
shuma[7]=smgduan[miao%10];
wen=Ds18b20ReadTemp();//讀取溫度
wendu[0]=smgduan[wen/10];
wendu[1]=smgduan[wen%10];
}
//按鍵檢測
void key_scan()
{
if(k1 && k2 && k3 && k4) //按鍵標(biāo)志清零
key=0;
if(!k4 &&(key!=4))//設(shè)置
{
key=4;
if(mode<3)
mode++;
else
mode=0;
}
if(!k1 &&(key!=1))//減
{
key=1;
if(mode==1)
{
if(shi>0)
shi--;
else
shi=23;
}
if(mode==2)
{
if(fen>0)
fen--;
else
fen=59;
}
if(mode==3)
{
if(miao>0)
miao--;
else
miao=59;
}
suan();
}
if(!k2 &&(key!=2))//加
{
key=2;
if(mode==1)
{
if(shi<23)
shi++;
else
shi=0;
}
if(mode==2)
{
if(fen<59)
fen++;
else
fen=0;
}
if(mode==3)
{
if(miao<59)
miao++;
else
miao=0;
}
suan();
}
}
//延時(shí)
void delay(uint i)
{
while(i--)
{
key_scan();
}
}
//主函數(shù)
void main(void)
{
TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動。
TH0=0X3C; //給定時(shí)器賦初值,定時(shí)50ms
TL0=0Xb0;
ET0=1;//打開定時(shí)器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時(shí)器
while(1)
{
if(mode==0)
{
if(k3) //顯示
display2();//時(shí)間顯示
else
display1();//溫度顯示
}
else//閃爍顯示
{
if(mode==1)//小時(shí)
{
if(time<11)
{
P0=0;P2=(P2& 0xe3)+(0<<2);P0=shuma[7];delay(50);
P0=0;P2=(P2& 0xe3)+(1<<2);P0=shuma[6];delay(50);
P0=0;P2=(P2& 0xe3)+(2<<2);P0=shuma[5];delay(50);
P0=0;P2=(P2& 0xe3)+(3<<2);P0=shuma[4];delay(50);
P0=0;P2=(P2& 0xe3)+(4<<2);P0=shuma[3];delay(50);
P0=0;P2=(P2& 0xe3)+(5<<2);P0=shuma[2];delay(50);
}
else
display2();
}
if(mode==2)//分鐘
{
if(time<11)
{
P0=0;P2=(P2& 0xe3)+(0<<2);P0=shuma[7];delay(50);
P0=0;P2=(P2& 0xe3)+(1<<2);P0=shuma[6];delay(50);
P0=0;P2=(P2& 0xe3)+(2<<2);P0=shuma[5];delay(50);
P0=0;P2=(P2& 0xe3)+(5<<2);P0=shuma[2];delay(50);
P0=0;P2=(P2& 0xe3)+(6<<2);P0=shuma[1];delay(50);
P0=0;P2=(P2& 0xe3)+(7<<2);P0=shuma[0];delay(50);
}
else
display2();
}
if(mode==3)//秒
{
if(time<11)
{
P0=0;P2=(P2& 0xe3)+(2<<2);P0=shuma[5];delay(50);
P0=0;P2=(P2& 0xe3)+(3<<2);P0=shuma[4];delay(50);
P0=0;P2=(P2& 0xe3)+(4<<2);P0=shuma[3];delay(50);
P0=0;P2=(P2& 0xe3)+(5<<2);P0=shuma[2];delay(50);
P0=0;P2=(P2& 0xe3)+(6<<2);P0=shuma[1];delay(50);
P0=0;P2=(P2& 0xe3)+(7<<2);P0=shuma[0];delay(50);
}
else
display2();
}
}
}
}
//定時(shí)器0中斷
void Timer0() interrupt 1
{
if((time0<4)&&(wen>30))//led閃爍
{
time0=0;
led=!led;
}
else
led=1;
if(time<20)//計(jì)時(shí)
time++;
else
{
time=0;
if(mode==0) //模式0正常計(jì)時(shí)
{
if(miao<59)
miao++;
else
{
miao=0;
if(fen<59)
fen++;
else
{
fen=0;
if(shi<23)
shi++;
else
{
shi=0;
}
}
}
suan();//顯示計(jì)算
}
}
TH0=0X3C; //給定時(shí)器賦初值,定時(shí)50ms
TL0=0Xb0;
}
?4. 設(shè)計(jì)報(bào)告
5001字設(shè)計(jì)報(bào)告,內(nèi)容包括硬件設(shè)計(jì)、軟件設(shè)計(jì)、軟硬件框圖、調(diào)試、結(jié)論等
?5. 設(shè)計(jì)資料內(nèi)容清單&&下載鏈接
資料設(shè)計(jì)資料包括仿真,程序代碼、講解視頻、功能要求、設(shè)計(jì)報(bào)告、軟硬件設(shè)計(jì)框圖等。
0、常見使用問題及解決方法–必讀!?。。?/p>
1、仿真圖
2、程序源碼
3、功能要求
4、元器件清單
5、開題報(bào)告
6、軟硬件流程框圖
7、設(shè)計(jì)報(bào)告
8、講解視頻
Altium Designer 安裝破解
KEIL+proteus 單片機(jī)仿真設(shè)計(jì)教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡易使用教程
單片機(jī)學(xué)習(xí)資料
相關(guān)數(shù)據(jù)手冊
答辯技巧
設(shè)計(jì)報(bào)告常用描述
鼠標(biāo)雙擊打開查找嘉盛單片機(jī)51 STM32單片機(jī)課程畢業(yè)設(shè)計(jì).url