久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

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

制作出來的實物圖如下:


單片機源程序如下:

//**************************************************************
//【本程序使用STC12C5A60S2單片機和12M晶振,外掛DS1302和DS18B20】
//【本程序集成時間顯示,溫度顯示,ADC電壓顯示,8位PWM輸出功能】
//**************************************************************
//【對于學習單片機的新手來說,此程序看一下然后慢慢理解】
//【對于老手來說可以路過】
//**************************************************************
//【程序中使用經典寫法保證DS1302走時穩定和DS18B20顯示精度】
//【程序中也使用一些非經典寫法,使ADC非查詢方式也非中斷方式】
//【保證ADC采樣速度的同時也保證穩定性(在相應的ADC端口要接30PF
//左右的電容保證采樣穩定性)】
//【本程序可以ADC和PWM單獨使用,也可以ADC控制PWM做相應輸出】
//【ADC采樣引腳:P1.0,PWM輸出P1.3】
//****************************************************************
//【LCD1602的數據線】
//****************************************************************  
//            RS=P2^6;                //模式位,低電平輸入指令,高電平輸入數據
//            RW=P2^5;                //讀寫位,低電平讀,高電平寫
//            E =P2^7;                //LCD12864使能位,低電平無效,高電平使能
//****************************************************************
//【DS1302的數據線】
//****************************************************************
//            CLK=P3^6;               //DS1302的時鐘信號線   
//            IO =P3^4;               //DS1302的數據端口線
//            RST=P3^5;               //DS1302的片選信號線
//***************************************************************
//【程序編寫于2022年5月17日深夜】
//***************************************************************
#include<STC12C5A60S2.h>                          //載入單片機頭文件
#include<intrins.h>                                          //載入編程規則文件
#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上填寫小時數據
{
hour=ReadDs1302(0x85);                                   //讀小時數據
LCDTestWord(0,0x80);                                   //在80位置顯示小時數據
LCDTestWord(1,(hour/16)+0x30);
LCDTestWord(1,hour%16+0x30);
LCDTestWord(0,0x82);                                   //在82位置顯示":"
LCDTestWord(1,(0x3a));
}

void DisplayMin(void)                  //往LCD上填寫分鐘數據   
{
min=ReadDs1302(0x83);                                   //讀分鐘數據
LCDTestWord(0,0x83);                                   //在83位置顯示分鐘數據
LCDTestWord(1,(min/16)+0x30);
LCDTestWord(1,min%16+0x30);
LCDTestWord(0,0x85);                                   //在85位置顯示":"
LCDTestWord(1,0x3a);
}

void DisplaySec(void)                  //往LCD上填寫秒鐘數據
{
unsigned char i=0;
unsigned int a=0,b=0,c=0;
sec=ReadDs1302(0x81);                                   //讀秒鐘數據
LCDTestWord(0,0x86);                                   //在86位置顯示秒數據
LCDTestWord(1,(sec/16)+0x30);
LCDTestWord(1,sec%16+0x30);
LCDTestWord(0,0x88);                                   //寫三個空格,把空的部分占掉以免亂碼
LCDSendWord(" ");
}

void DisplayTemp(void)                                   //往LCD上填寫溫度數據
{
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);                                   //寫入小數點
c=i-a*100-b*10;                                           //溫度小數位
LCDTestWord(1,c+0x30);
LCDSendWord("C");                                           //寫入字母"C"
}

void Displayvoltage(void)              //往LCD上填寫電壓數據
{                                                                           //ADC轉換結果
unsigned int temp;
temp=ADC_RES;
result=temp*0.01953125*1000;
ge=result/1000;                                                   //個位結果
shifen=result%1000/100;                                   //十分位結果
baifen=result%100/10;                                   //百分位結果
ADC_CONTR = 0xc8;                      //開啟轉換

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"
  }
//****************************************************************
//【顯示指定內容程序】
//****************************************************************
void  Displayxs(void)
{
           DisplayHour();                                           //顯示小時數據
        DisplayMin();                                           //顯示分鐘數據
        DisplaySec();                                           //顯示秒鐘數據
        DisplayTemp();                                           //顯示溫度數據
        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;
;
}        


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

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

仿制也是一種學習的方法,適當的時候仿制比課本上學的還快些.
作者: 單片機mcu    時間: 2022-5-19 07:59

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

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

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

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

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

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

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

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

后面會發一些適合新手學習的程序和DIY項目

作者: 867910038    時間: 2022-6-14 09:39
程序寫的不錯的
作者: qq76832893    時間: 2022-6-14 20:20
感謝分享,下載了慢慢學習。謝謝。
作者: nicevoip    時間: 2022-6-19 23:13
好資料,必須支持開源
作者: xiaoyuxinke    時間: 2022-6-19 23:56
wolfinn 發表于 2022-5-23 19:37
度C可以自編一個顯示,1602支持8個自選顯示。

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

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

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

是的,一次做等于很多次學。
我記得我成長最快的時候是給朋友做設計,現在10年過去了,我去找了原來的代碼,發現那幾個月自己產出的東西真多,而且也因為那個時期寫了好多代碼,發現自己逐漸懂了一些,有些東西是一下子就能看懂看明白的。

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

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

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

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

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

很簡單的東東,實現的方法也很多,

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



[attach]320942[/attach]

[attach]320943[/attach]


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

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

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

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

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

嘿嘿,小樣,仔細看一下STC的單片機說明書你會發現差別,




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 天天躁日日躁bbbbb | 玖玖在线观看 | 国产精品一区二区不卡 | 视频一区二区三区在线观看 | 国产精品视频一区二区三区 | 国产精品尤物 | 亚洲区一区二 | 日本久久精品视频 | 日韩一区二区三免费高清在线观看 | 亚洲 欧美 另类 综合 偷拍 | 久久久三级 | 欧美激情一区 | 国产欧美日本 | 超碰精品在线 | 国产三级久久 | 免费视频成人 | 欧美深夜福利 | 四虎8848精品成人免费网站 | 日韩精品在线免费观看 | 日韩精品视频免费在线观看 | 久久99精品久久久久久 | 99这里只有精品 | 在线播放h| 亚洲成人毛片 | 成人综合网站 | 免费一级大片 | 美日韩丰满少妇在线观看 | 在线观看亚洲视频 | 国产免费黄色片 | 成年网站在线观看 | 亚洲在线一区 | 在线观看小视频 | 亚洲一区二区三区 | 黄色录像免费看 | 亚洲天堂免费 | 超碰在线免费公开 | 福利影视 | 九九视频在线观看 | 亚洲一级黄色片 | a亚洲天堂 | 亚洲精品久久久 |