|
以下是部分程序,需要完整程序請(qǐng)下載附件
制作出來(lái)的實(shí)物圖如下:
51hei圖片_20220517225753.jpg (84.62 KB, 下載次數(shù): 154)
下載附件
2022-5-17 22:58 上傳
單片機(jī)源程序如下:
//**************************************************************
//【本程序使用STC12C5A60S2單片機(jī)和12M晶振,外掛DS1302和DS18B20】
//【本程序集成時(shí)間顯示,溫度顯示,ADC電壓顯示,8位PWM輸出功能】
//**************************************************************
//【對(duì)于學(xué)習(xí)單片機(jī)的新手來(lái)說(shuō),此程序看一下然后慢慢理解】
//【對(duì)于老手來(lái)說(shuō)可以路過(guò)】
//**************************************************************
//【程序中使用經(jīng)典寫法保證DS1302走時(shí)穩(wěn)定和DS18B20顯示精度】
//【程序中也使用一些非經(jīng)典寫法,使ADC非查詢方式也非中斷方式】
//【保證ADC采樣速度的同時(shí)也保證穩(wěn)定性(在相應(yīng)的ADC端口要接30PF
//左右的電容保證采樣穩(wěn)定性)】
//【本程序可以ADC和PWM單獨(dú)使用,也可以ADC控制PWM做相應(yīng)輸出】
//【ADC采樣引腳:P1.0,PWM輸出P1.3】
//****************************************************************
//【LCD1602的數(shù)據(jù)線】
//****************************************************************
// RS=P2^6; //模式位,低電平輸入指令,高電平輸入數(shù)據(jù)
// RW=P2^5; //讀寫位,低電平讀,高電平寫
// E =P2^7; //LCD12864使能位,低電平無(wú)效,高電平使能
//****************************************************************
//【DS1302的數(shù)據(jù)線】
//****************************************************************
// CLK=P3^6; //DS1302的時(shí)鐘信號(hào)線
// IO =P3^4; //DS1302的數(shù)據(jù)端口線
// RST=P3^5; //DS1302的片選信號(hào)線
//***************************************************************
//【程序編寫于2022年5月17日深夜】
//***************************************************************
#include<STC12C5A60S2.h> //載入單片機(jī)頭文件
#include<intrins.h> //載入編程規(guī)則文件
#include<lcd1602cl.h> //載入LCD1602文件
#include<ds1302cl.h> //載入DS1302文件
#include<ds18b20cl.h> //載入DS18B20文件
unsigned int result,ge,shifen,baifen;
unsigned char seg[10]={'0','1','2','3','4','5','6','7','8','9'};//要顯示字符
bit flag1 =0;
bit flag2 =0;
bit flag3 =0;
//****************************************************************
//【顯示界面子程序】
//****************************************************************
//void Displayqt(void)
//{
// LCDTestWord(0,0x80);
// LCDSendWord("LOVE LIFE! ");
// }
void DisplayHour(void) //往LCD上填寫小時(shí)數(shù)據(jù)
{
hour=ReadDs1302(0x85); //讀小時(shí)數(shù)據(jù)
LCDTestWord(0,0x80); //在80位置顯示小時(shí)數(shù)據(jù)
LCDTestWord(1,(hour/16)+0x30);
LCDTestWord(1,hour%16+0x30);
LCDTestWord(0,0x82); //在82位置顯示":"
LCDTestWord(1,(0x3a));
}
void DisplayMin(void) //往LCD上填寫分鐘數(shù)據(jù)
{
min=ReadDs1302(0x83); //讀分鐘數(shù)據(jù)
LCDTestWord(0,0x83); //在83位置顯示分鐘數(shù)據(jù)
LCDTestWord(1,(min/16)+0x30);
LCDTestWord(1,min%16+0x30);
LCDTestWord(0,0x85); //在85位置顯示":"
LCDTestWord(1,0x3a);
}
void DisplaySec(void) //往LCD上填寫秒鐘數(shù)據(jù)
{
unsigned char i=0;
unsigned int a=0,b=0,c=0;
sec=ReadDs1302(0x81); //讀秒鐘數(shù)據(jù)
LCDTestWord(0,0x86); //在86位置顯示秒數(shù)據(jù)
LCDTestWord(1,(sec/16)+0x30);
LCDTestWord(1,sec%16+0x30);
LCDTestWord(0,0x88); //寫三個(gè)空格,把空的部分占掉以免亂碼
LCDSendWord(" ");
}
void DisplayTemp(void) //往LCD上填寫溫度數(shù)據(jù)
{
unsigned int i; //定義i
unsigned char a,b,c; //定義a,b,c
LCDTestWord(0,0x8b); //從8b位置開始寫入
TempChange();
i=GetTemp(); //i等于讀出來(lái)的溫度值
a=i/100; //溫度十位
LCDTestWord(1,a+0x30);
b=i/10-a*10; //溫度個(gè)位
LCDTestWord(1,b+0x30);
LCDTestWord(1,0x2e); //寫入小數(shù)點(diǎn)
c=i-a*100-b*10; //溫度小數(shù)位
LCDTestWord(1,c+0x30);
LCDSendWord("C"); //寫入字母"C"
}
void Displayvoltage(void) //往LCD上填寫電壓數(shù)據(jù)
{ //ADC轉(zhuǎn)換結(jié)果
unsigned int temp;
temp=ADC_RES;
result=temp*0.01953125*1000;
ge=result/1000; //個(gè)位結(jié)果
shifen=result%1000/100; //十分位結(jié)果
baifen=result%100/10; //百分位結(jié)果
ADC_CONTR = 0xc8; //開啟轉(zhuǎn)換
LCDTestWord(0,0xC0); //從80位置開始顯示
LCDSendWord(" ");
LCDTestWord(0,0xC8); //從86位置開始顯示
LCDSendWord("A"); //寫入字母"A"
LCDSendWord("D"); //寫入字母"D"
DelayMs(20);
LCDTestWord(1,0x3a);
LCDTestWord(1,seg[ge]);
LCDTestWord(1,0x2e);
LCDTestWord(1,seg[shifen]);
LCDTestWord(1,seg[baifen]);
LCDSendWord("V"); //寫入字母"V"
}
//****************************************************************
//【顯示指定內(nèi)容程序】
//****************************************************************
void Displayxs(void)
{
DisplayHour(); //顯示小時(shí)數(shù)據(jù)
DisplayMin(); //顯示分鐘數(shù)據(jù)
DisplaySec(); //顯示秒鐘數(shù)據(jù)
DisplayTemp(); //顯示溫度數(shù)據(jù)
Displayvoltage(); //顯示ADC采樣電壓值
}
//****************************************************************
//【延時(shí)部分子程序】
//****************************************************************
void DelayMs(unsigned int a) //延時(shí) 1MS/次
{
unsigned char i;
while(--a!=0)
{
for(i=0;i<125;i++)
;
}
}
void Delay(unsigned char num)
{
unsigned char i;
_nop_();
while(num--)
i=num;
;
}
51hei.png (6.68 KB, 下載次數(shù): 153)
下載附件
2022-5-18 05:15 上傳
此程序已完美驗(yàn)證,注意本程序使用12M晶振,22.1184M晶振容易導(dǎo)致DS18B20不顯示溫度,那個(gè)延時(shí)太難調(diào)了.
Keil5代碼下載:
LCD1602ADCPWM.rar
(47.96 KB, 下載次數(shù): 414)
2022-5-17 23:01 上傳
點(diǎn)擊文件名下載附件
回復(fù)是美德 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|