標(biāo)題: STC12C5A60S2+DS1302+DS18B20+ADC+PWM(單片機(jī)程序開源) [打印本頁]

作者: xiaoyuxinke    時(shí)間: 2022-5-17 23:04
標(biāo)題: STC12C5A60S2+DS1302+DS18B20+ADC+PWM(單片機(jī)程序開源)
以下是部分程序,需要完整程序請下載附件

制作出來的實(shí)物圖如下:


單片機(jī)源程序如下:

//**************************************************************
//【本程序使用STC12C5A60S2單片機(jī)和12M晶振,外掛DS1302和DS18B20】
//【本程序集成時(shí)間顯示,溫度顯示,ADC電壓顯示,8位PWM輸出功能】
//**************************************************************
//【對于學(xué)習(xí)單片機(jī)的新手來說,此程序看一下然后慢慢理解】
//【對于老手來說可以路過】
//**************************************************************
//【程序中使用經(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使能位,低電平無效,高電平使能
//****************************************************************
//【DS1302的數(shù)據(jù)線】
//****************************************************************
//            CLK=P3^6;               //DS1302的時(shí)鐘信號線   
//            IO =P3^4;               //DS1302的數(shù)據(jù)端口線
//            RST=P3^5;               //DS1302的片選信號線
//***************************************************************
//【程序編寫于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等于讀出來的溫度值
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;
;
}        


此程序已完美驗(yàn)證,注意本程序使用12M晶振,22.1184M晶振容易導(dǎo)致DS18B20不顯示溫度,那個(gè)延時(shí)太難調(diào)了.
Keil5代碼下載: LCD1602ADCPWM.rar (47.96 KB, 下載次數(shù): 414)

作者: 塵土的飛揚(yáng)    時(shí)間: 2022-5-18 13:40
好資料,必須支持開源,
作者: rrqxx    時(shí)間: 2022-5-18 21:19
學(xué)了N年的單片機(jī),硬是沒有入門,只有仿制了。
作者: xiaoyuxinke    時(shí)間: 2022-5-18 23:16
rrqxx 發(fā)表于 2022-5-18 21:19
學(xué)了N年的單片機(jī),硬是沒有入門,只有仿制了。

仿制也是一種學(xué)習(xí)的方法,適當(dāng)?shù)臅r(shí)候仿制比課本上學(xué)的還快些.
作者: 單片機(jī)mcu    時(shí)間: 2022-5-19 07:59

好資料,必須支持開源
作者: cszhougong    時(shí)間: 2022-5-19 08:34
下載,學(xué)習(xí)了,值得借簽
作者: qweer    時(shí)間: 2022-5-19 21:13
好資料,支持開源
作者: jinanyuanyue    時(shí)間: 2022-5-20 09:23
收藏了,暫時(shí)還看不懂
作者: 701    時(shí)間: 2022-5-20 13:47
學(xué)習(xí)了,值得借簽
作者: 啤酒瓶子老大    時(shí)間: 2022-5-20 14:22
弱弱的問一下,這個(gè)是可以調(diào)整時(shí)間的嗎?
作者: xiaoyuxinke    時(shí)間: 2022-5-20 15:58
本帖最后由 xiaoyuxinke 于 2022-5-21 08:37 編輯
啤酒瓶子老大 發(fā)表于 2022-5-20 14:22
弱弱的問一下,這個(gè)是可以調(diào)整時(shí)間的嗎?

調(diào)時(shí)間前應(yīng)先禁止走時(shí)并允許寫入
再把DS1302內(nèi)相應(yīng)數(shù)據(jù)先讀出來,然后相應(yīng)位按鍵就加1(若按鍵為長按則當(dāng)前位不斷加1,當(dāng)然中間要加延時(shí),不然加的速度會非?,人眼根本看不清)
秒鐘=60,若等于60清零當(dāng)前位并分鐘位加1,
分鐘=60,若等于60清零當(dāng)前位并小時(shí)位加1,
小時(shí)=24,若等于24則小時(shí)分鐘和秒鐘全部清零,
退出前開走時(shí)并禁止寫入時(shí)間.

調(diào)整時(shí)間很簡單 比如要調(diào)整分,按鍵按下,DS1302停止走時(shí),讀出DS1302分?jǐn)?shù)據(jù)然后分鐘加一,若分鐘不等于或大于60則把加1后的數(shù)據(jù)再寫回DS1302,打開DS1302走時(shí),禁止寫入時(shí)間.  若分鐘加一后等于或大于60,然后把小時(shí)數(shù)據(jù)也讀出來分鐘清0小時(shí)加1,若小時(shí)不等于或大于24則把清零后的分鐘和小時(shí)都寫回DS1302,退出.若小時(shí)等于或大于24(這里的大于24是防止程序跑飛的現(xiàn)象,有時(shí)用手摸一下DS1302時(shí)間會顯示超過24小時(shí))則時(shí)分秒全部清0退出.
      至于按鍵消抖部分你自己想辦法.
作者: 君工創(chuàng)    時(shí)間: 2022-5-20 22:46
程序簡潔,注釋詳細(xì)。值得學(xué)習(xí)。
作者: lingnicole    時(shí)間: 2022-5-21 12:02

好資料,支持開源
作者: 小丑only    時(shí)間: 2022-5-23 09:12
樓主能否分享下用ADC采用做電量檢測,其次是想問下ADC分壓按鍵同時(shí)按住如何減少干擾。謝謝
作者: wolfinn    時(shí)間: 2022-5-23 19:37
度C可以自編一個(gè)顯示,1602支持8個(gè)自選顯示。
作者: 51小白。lht    時(shí)間: 2022-5-24 20:46
有多路ds18b20的程序嗎
作者: xiaoyuxinke    時(shí)間: 2022-5-25 22:25
啤酒瓶子老大 發(fā)表于 2022-5-20 14:22
弱弱的問一下,這個(gè)是可以調(diào)整時(shí)間的嗎?

您可以自行修改一下就可以調(diào)時(shí)間了,DS1302調(diào)時(shí)間很容易,80H/82H/84H分別是秒分時(shí)的調(diào)整.
作者: xiaoyuxinke    時(shí)間: 2022-5-25 22:29
小丑only 發(fā)表于 2022-5-23 09:12
樓主能否分享下用ADC采用做電量檢測,其次是想問下ADC分壓按鍵同時(shí)按住如何減少干擾。謝謝

ADC做電量測量,如果要精準(zhǔn)需要加一個(gè)標(biāo)準(zhǔn)電壓檢測(需要三路ADC,一路做標(biāo)準(zhǔn)電壓檢測,另兩路分別是電壓和電流采樣)不需要太精準(zhǔn)的話,直接兩路ADC采集電壓電流值,然后算出功率,

至于你說的ADC分壓按鍵減少干擾,每個(gè)鍵上面并個(gè)30PF電容(注意是每個(gè)鍵上都要并,不只是你按下的鍵),不要太大,否則會對你ADC采樣造成影響.
作者: xiaoyuxinke    時(shí)間: 2022-5-25 22:34
51小白。lht 發(fā)表于 2022-5-24 20:46
有多路ds18b20的程序嗎

DS18B20并不是很麻煩的東西,你可以看著說明書自己寫就行了.只是延時(shí)部分要求嚴(yán)格些.
作者: xiaoyuxinke    時(shí)間: 2022-6-3 04:06
會沉么,會的,所以再來頂一下,免的沉下去.
作者: suiwinder    時(shí)間: 2022-6-3 16:17
學(xué)習(xí)的最好方法,就是不斷的寫,不斷的動手。
作者: 2590413275    時(shí)間: 2022-6-3 17:50
不斷的動手
作者: zxianyu    時(shí)間: 2022-6-4 17:29
DS1302時(shí)間總是會跑快的,要經(jīng)常調(diào)整時(shí)間,不是很理想。
作者: pq1972    時(shí)間: 2022-6-5 11:43
好資料,雖然現(xiàn)在還看不太懂,謝謝,慢慢學(xué)習(xí)
作者: cq03210    時(shí)間: 2022-6-7 08:33
強(qiáng),好資料,必須支持
作者: cq03210    時(shí)間: 2022-6-7 08:34
好資料,必須頂上去
作者: gao687    時(shí)間: 2022-6-7 09:39
很好,功能很全
作者: xiaoyuxinke    時(shí)間: 2022-6-13 15:06
gao687 發(fā)表于 2022-6-7 09:39
很好,功能很全

后面會發(fā)一些適合新手學(xué)習(xí)的程序和DIY項(xiàng)目

作者: 867910038    時(shí)間: 2022-6-14 09:39
程序?qū)懙牟诲e(cuò)的
作者: qq76832893    時(shí)間: 2022-6-14 20:20
感謝分享,下載了慢慢學(xué)習(xí)。謝謝。
作者: nicevoip    時(shí)間: 2022-6-19 23:13
好資料,必須支持開源
作者: xiaoyuxinke    時(shí)間: 2022-6-19 23:56
wolfinn 發(fā)表于 2022-5-23 19:37
度C可以自編一個(gè)顯示,1602支持8個(gè)自選顯示。

本程序只做演示不做實(shí)用,如果實(shí)用的話我會夾帶匯編以修正時(shí)間差,可以做到年走時(shí)誤差3S以內(nèi)不是神話.
作者: aide51    時(shí)間: 2022-6-20 11:09
好資料,必須支持樓主
作者: sdsdzs    時(shí)間: 2022-6-20 23:45
好資料,必須支持開源
作者: nicevoip    時(shí)間: 2022-6-21 21:56
請問ad采集的哪里的電壓,pwm輸出到哪里?是要控制什么嗎?
作者: chenzg2018    時(shí)間: 2022-6-22 08:09
好資料,必須支持開源。收藏了。
作者: yelk'    時(shí)間: 2022-6-22 20:23
  好資料,必須支持開源
作者: 無線hi    時(shí)間: 2022-6-25 11:13
好資料,有獨(dú)立的思考方式
作者: xiaoyuxinke    時(shí)間: 2022-6-25 22:21
本帖最后由 xiaoyuxinke 于 2022-9-14 15:29 編輯
nicevoip 發(fā)表于 2022-6-21 21:56
請問ad采集的哪里的電壓,pwm輸出到哪里?是要控制什么嗎?

這個(gè)看你想怎么應(yīng)用了,可以用AD變成PWM控制電機(jī)轉(zhuǎn)速,也可以用PWM控制其它或用其它變量控制輸出的PWM,這個(gè)可以靈活應(yīng)用.
作者: 君工創(chuàng)    時(shí)間: 2022-9-13 21:46
好資料就要下載學(xué)習(xí)。
作者: cqgdlq    時(shí)間: 2022-10-4 20:23
好資料,下來學(xué)習(xí)下。
作者: 2441982213    時(shí)間: 2022-10-4 22:43
好資料,必須支持開源
作者: zhhdok    時(shí)間: 2022-10-5 16:17
能幫我寫一個(gè)程序嗎?大俠&#129464;‍♀️,http://www.torrancerestoration.com/bbs/dpj-223490-1.html,我現(xiàn)在這段程序,還是不能用!
作者: 君工創(chuàng)    時(shí)間: 2022-11-23 20:10
好資料,值得學(xué)習(xí)學(xué)習(xí)。
作者: 肖肖111111    時(shí)間: 2022-11-24 12:32
非常棒,學(xué)習(xí)一下好程序
作者: xiaoyuxinke    時(shí)間: 2022-12-2 00:41
zhhdok 發(fā)表于 2022-10-5 16:17
能幫我寫一個(gè)程序嗎?大俠&#129464;‍♀️,http://www.torrancerestoration.com/bbs/dpj-223490-1.html,我現(xiàn) ...

沒時(shí)間,我工作忙,只能業(yè)除搞一下這些
作者: Su_xin    時(shí)間: 2022-12-5 08:12
好資料..學(xué)習(xí)學(xué)習(xí)..必須支持開源
作者: lixiongkuku    時(shí)間: 2023-2-23 17:39
suiwinder 發(fā)表于 2022-6-3 16:17
學(xué)習(xí)的最好方法,就是不斷的寫,不斷的動手。

是的,一次做等于很多次學(xué)。
我記得我成長最快的時(shí)候是給朋友做設(shè)計(jì),現(xiàn)在10年過去了,我去找了原來的代碼,發(fā)現(xiàn)那幾個(gè)月自己產(chǎn)出的東西真多,而且也因?yàn)槟莻(gè)時(shí)期寫了好多代碼,發(fā)現(xiàn)自己逐漸懂了一些,有些東西是一下子就能看懂看明白的。

不動手,只看,只想,永遠(yuǎn)出不來效果。
作者: 斯圖爾特魏    時(shí)間: 2023-4-2 08:34
不錯(cuò)哦,確實(shí)是好資料呢,感覺有點(diǎn)復(fù)雜,我得慢慢琢磨一下
作者: suiwinder    時(shí)間: 2023-4-2 19:58
硬件如果有問題,那就是大問題。
作者: 2663496424    時(shí)間: 2023-4-8 21:28
好資料,支持開源
作者: 風(fēng)的旋律    時(shí)間: 2023-4-11 09:05

感謝分享,好資料就要下載學(xué)習(xí),謝謝
作者: 666777888484    時(shí)間: 2023-4-23 20:47
大佬可以教一下怎么使用蜂鳴器播放音樂嗎
作者: meiwazichuan    時(shí)間: 2023-5-13 21:20

好資料,必須支持開源
作者: 芯菲    時(shí)間: 2023-5-14 19:37
正是我需要的資料,謝謝分享。
作者: 我的對象是佩琪    時(shí)間: 2023-5-15 15:46

好資料,必須支持開源
作者: 我的對象是佩琪    時(shí)間: 2023-5-15 15:49
支持開源。!

作者: Esst    時(shí)間: 2023-5-16 14:12
需要用到,感謝了
作者: 565378860    時(shí)間: 2023-6-6 14:38
支持樓主的高風(fēng)亮節(jié)
作者: 憨名    時(shí)間: 2023-7-15 08:04
好程序條理分明,注釋清晰,值得學(xué)習(xí)
作者: xiaoyuxinke    時(shí)間: 2023-8-9 18:25
666777888484 發(fā)表于 2023-4-23 20:47
大佬可以教一下怎么使用蜂鳴器播放音樂嗎

很簡單的東東,實(shí)現(xiàn)的方法也很多,

作者: 阿飛7812    時(shí)間: 2023-8-10 08:57
我用的12M 顯示總是更新的很快是什么原因,看都看不清。 我就改了下我開發(fā)板對應(yīng)的IO口,按一下復(fù)位能暫停
作者: 君工創(chuàng)    時(shí)間: 2023-8-19 20:28
我用STC8G2K的片子,讀不到DS1302的時(shí)間出來。
作者: 阿飛7812    時(shí)間: 2023-8-29 09:05
樓按你的程序怎么改AD采樣腳 怎么會改不了 ,程序里改了AD輸入P1.1和控制位也改了相應(yīng)的腳位, 但上電測試還是在原不那腳 除這二個(gè)地方外還要改那哦 請指教,還有DS1302那塊時(shí)間也不走
作者: 阿飛7812    時(shí)間: 2023-9-2 20:25
樓主;我按你的程序去打了PCB樣  腳位定都一樣,現(xiàn)在出現(xiàn)的問題是不改AD IO口采樣正常,但我改了IO口后如P1.1,但發(fā)現(xiàn)還是原來的P10口調(diào)電位器才有用,改的P1.1口電位不起作用,我改的地方P1ASF =0x02;原來0X01改成0X02,ADC_CONTR = 0xc9;        原來0XC8改成0XC9;0XCA,都試了還是在原來P1.0口上,還有時(shí)間讀不出來;我用壇友uid:889094程序試了能正常走時(shí),搞了二天都沒找到原因;溫度正常,望指點(diǎn)                                 
作者: ha987549e    時(shí)間: 2023-10-26 21:33
非常棒,學(xué)習(xí)一下好程序
作者: STC新未來    時(shí)間: 2023-10-28 08:52
感謝樓主的精彩分享!后續(xù)您有精力的話可以考慮移植到支持硬件USB下載和硬件USB仿真的STC8H8K64U上



[attach]320942[/attach]

[attach]320943[/attach]


作者: 不開單佛看見    時(shí)間: 2023-10-30 09:15
好資料,必須支持開源
作者: xiaoyuxinke    時(shí)間: 2023-11-4 21:29
阿飛7812 發(fā)表于 2023-9-2 20:25
樓主;我按你的程序去打了PCB樣  腳位定都一樣,現(xiàn)在出現(xiàn)的問題是不改AD IO口采樣正常,但我改了IO口后如P1 ...

不改就可以用,為什么要改呢?

作者: dyx811    時(shí)間: 2023-11-5 08:48
好資料就是要頂!
作者: dj3365191    時(shí)間: 2023-11-5 11:16
顯示用的是1602嗎
作者: xiaoyuxinke    時(shí)間: 2023-11-7 20:38
dj3365191 發(fā)表于 2023-11-5 11:16
顯示用的是1602嗎

是的,LCD1602
作者: QQQQ987    時(shí)間: 2023-11-13 21:42
附件有電路圖嗎?
作者: 市井閑叟    時(shí)間: 2023-12-18 22:48
好程序條理分明,注釋清晰全面,真心幫助別人進(jìn)步的好帖子。
作者: xiaoyuxinke    時(shí)間: 2024-1-18 16:38
666777888484 發(fā)表于 2023-4-23 20:47
大佬可以教一下怎么使用蜂鳴器播放音樂嗎

我的貼子里面有,自己找一下,
作者: xiaoyuxinke    時(shí)間: 2024-1-18 16:40
阿飛7812 發(fā)表于 2023-9-2 20:25
樓主;我按你的程序去打了PCB樣  腳位定都一樣,現(xiàn)在出現(xiàn)的問題是不改AD IO口采樣正常,但我改了IO口后如P1 ...

嘿嘿,小樣,仔細(xì)看一下STC的單片機(jī)說明書你會發(fā)現(xiàn)差別,




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1