以下是部分程序,需要完整程序請下載附件
制作出來的實物圖如下:
51hei圖片_20220517225753.jpg (84.62 KB, 下載次數(shù): 154)
下載附件
2022-5-17 22:58 上傳
單片機源程序如下:
//**************************************************************
//【本程序使用STC12C5A60S2單片機和12M晶振,外掛DS1302和DS18B20】
//【本程序集成時間顯示,溫度顯示,ADC電壓顯示,8位PWM輸出功能】
//**************************************************************
//【對于學習單片機的新手來說,此程序看一下然后慢慢理解】
//【對于老手來說可以路過】
//**************************************************************
//【程序中使用經(jīng)典寫法保證DS1302走時穩(wěn)定和DS18B20顯示精度】
//【程序中也使用一些非經(jīng)典寫法,使ADC非查詢方式也非中斷方式】
//【保證ADC采樣速度的同時也保證穩(wěn)定性(在相應的ADC端口要接30PF
//左右的電容保證采樣穩(wěn)定性)】
//【本程序可以ADC和PWM單獨使用,也可以ADC控制PWM做相應輸出】
//【ADC采樣引腳:P1.0,PWM輸出P1.3】
//****************************************************************
//【LCD1602的數(shù)據(jù)線】
//****************************************************************
// RS=P2^6; //模式位,低電平輸入指令,高電平輸入數(shù)據(jù)
// RW=P2^5; //讀寫位,低電平讀,高電平寫
// E =P2^7; //LCD12864使能位,低電平無效,高電平使能
//****************************************************************
//【DS1302的數(shù)據(jù)線】
//****************************************************************
// CLK=P3^6; //DS1302的時鐘信號線
// IO =P3^4; //DS1302的數(shù)據(jù)端口線
// RST=P3^5; //DS1302的片選信號線
//***************************************************************
//【程序編寫于2022年5月17日深夜】
//***************************************************************
#include<STC12C5A60S2.h> //載入單片機頭文件
#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ù)據(jù)
{
hour=ReadDs1302(0x85); //讀小時數(shù)據(jù)
LCDTestWord(0,0x80); //在80位置顯示小時數(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); //寫三個空格,把空的部分占掉以免亂碼
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等于讀出來的溫度值
a=i/100; //溫度十位
LCDTestWord(1,a+0x30);
b=i/10-a*10; //溫度個位
LCDTestWord(1,b+0x30);
LCDTestWord(1,0x2e); //寫入小數(shù)點
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; //個位結(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ù)據(jù)
DisplayMin(); //顯示分鐘數(shù)據(jù)
DisplaySec(); //顯示秒鐘數(shù)據(jù)
DisplayTemp(); //顯示溫度數(shù)據(jù)
Displayvoltage(); //顯示ADC采樣電壓值
}
//****************************************************************
//【延時部分子程序】
//****************************************************************
void DelayMs(unsigned int a) //延時 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 上傳
此程序已完美驗證,注意本程序使用12M晶振,22.1184M晶振容易導致DS18B20不顯示溫度,那個延時太難調(diào)了.
Keil5代碼下載:
LCD1602ADCPWM.rar
(47.96 KB, 下載次數(shù): 414)
2022-5-17 23:01 上傳
點擊文件名下載附件
回復是美德 下載積分: 黑幣 -5
|