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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16143|回復: 77
打印 上一主題 下一主題
收起左側(cè)

STC12C5A60S2+DS1302+DS18B20+ADC+PWM(單片機程序開源)

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:61140 發(fā)表于 2022-5-17 23:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
以下是部分程序,需要完整程序請下載附件

制作出來的實物圖如下:


單片機源程序如下:

//**************************************************************
//【本程序使用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;
;
}        


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

評分

參與人數(shù) 2黑幣 +80 收起 理由
QJM198972 + 30 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏27 分享淘帖 頂7 踩
回復

使用道具 舉報

沙發(fā)
ID:1024371 發(fā)表于 2022-5-18 13:40 | 只看該作者
好資料,必須支持開源,
回復

使用道具 舉報

板凳
ID:32289 發(fā)表于 2022-5-18 21:19 | 只看該作者
學了N年的單片機,硬是沒有入門,只有仿制了。
回復

使用道具 舉報

地板
ID:61140 發(fā)表于 2022-5-18 23:16 | 只看該作者
rrqxx 發(fā)表于 2022-5-18 21:19
學了N年的單片機,硬是沒有入門,只有仿制了。

仿制也是一種學習的方法,適當?shù)臅r候仿制比課本上學的還快些.
回復

使用道具 舉報

5#
ID:305762 發(fā)表于 2022-5-19 07:59 | 只看該作者

好資料,必須支持開源
回復

使用道具 舉報

6#
ID:921339 發(fā)表于 2022-5-19 08:34 | 只看該作者
下載,學習了,值得借簽
回復

使用道具 舉報

7#
ID:242300 發(fā)表于 2022-5-19 21:13 | 只看該作者
好資料,支持開源
回復

使用道具 舉報

8#
ID:67312 發(fā)表于 2022-5-20 09:23 | 只看該作者
收藏了,暫時還看不懂
回復

使用道具 舉報

9#
ID:443637 發(fā)表于 2022-5-20 13:47 | 只看該作者
學習了,值得借簽
回復

使用道具 舉報

10#
ID:230742 發(fā)表于 2022-5-20 14:22 | 只看該作者
弱弱的問一下,這個是可以調(diào)整時間的嗎?
回復

使用道具 舉報

11#
ID:61140 發(fā)表于 2022-5-20 15:58 | 只看該作者
本帖最后由 xiaoyuxinke 于 2022-5-21 08:37 編輯
啤酒瓶子老大 發(fā)表于 2022-5-20 14:22
弱弱的問一下,這個是可以調(diào)整時間的嗎?

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

調(diào)整時間很簡單 比如要調(diào)整分,按鍵按下,DS1302停止走時,讀出DS1302分數(shù)據(jù)然后分鐘加一,若分鐘不等于或大于60則把加1后的數(shù)據(jù)再寫回DS1302,打開DS1302走時,禁止寫入時間.  若分鐘加一后等于或大于60,然后把小時數(shù)據(jù)也讀出來分鐘清0小時加1,若小時不等于或大于24則把清零后的分鐘和小時都寫回DS1302,退出.若小時等于或大于24(這里的大于24是防止程序跑飛的現(xiàn)象,有時用手摸一下DS1302時間會顯示超過24小時)則時分秒全部清0退出.
      至于按鍵消抖部分你自己想辦法.
回復

使用道具 舉報

12#
ID:965189 發(fā)表于 2022-5-20 22:46 | 只看該作者
程序簡潔,注釋詳細。值得學習。
回復

使用道具 舉報

13#
ID:1028406 發(fā)表于 2022-5-21 12:02 | 只看該作者

好資料,支持開源
回復

使用道具 舉報

14#
ID:447439 發(fā)表于 2022-5-23 09:12 | 只看該作者
樓主能否分享下用ADC采用做電量檢測,其次是想問下ADC分壓按鍵同時按住如何減少干擾。謝謝
回復

使用道具 舉報

15#
ID:776619 發(fā)表于 2022-5-23 19:37 | 只看該作者
度C可以自編一個顯示,1602支持8個自選顯示。
回復

使用道具 舉報

16#
ID:1028725 發(fā)表于 2022-5-24 20:46 | 只看該作者
有多路ds18b20的程序嗎
回復

使用道具 舉報

17#
ID:61140 發(fā)表于 2022-5-25 22:25 | 只看該作者
啤酒瓶子老大 發(fā)表于 2022-5-20 14:22
弱弱的問一下,這個是可以調(diào)整時間的嗎?

您可以自行修改一下就可以調(diào)時間了,DS1302調(diào)時間很容易,80H/82H/84H分別是秒分時的調(diào)整.
回復

使用道具 舉報

18#
ID:61140 發(fā)表于 2022-5-25 22:29 | 只看該作者
小丑only 發(fā)表于 2022-5-23 09:12
樓主能否分享下用ADC采用做電量檢測,其次是想問下ADC分壓按鍵同時按住如何減少干擾。謝謝

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

至于你說的ADC分壓按鍵減少干擾,每個鍵上面并個30PF電容(注意是每個鍵上都要并,不只是你按下的鍵),不要太大,否則會對你ADC采樣造成影響.
回復

使用道具 舉報

19#
ID:61140 發(fā)表于 2022-5-25 22:34 | 只看該作者

DS18B20并不是很麻煩的東西,你可以看著說明書自己寫就行了.只是延時部分要求嚴格些.
回復

使用道具 舉報

20#
ID:61140 發(fā)表于 2022-6-3 04:06 | 只看該作者
會沉么,會的,所以再來頂一下,免的沉下去.
回復

使用道具 舉報

21#
ID:409878 發(fā)表于 2022-6-3 16:17 | 只看該作者
學習的最好方法,就是不斷的寫,不斷的動手。
回復

使用道具 舉報

22#
ID:1019972 發(fā)表于 2022-6-3 17:50 | 只看該作者
不斷的動手
回復

使用道具 舉報

23#
ID:409674 發(fā)表于 2022-6-4 17:29 | 只看該作者
DS1302時間總是會跑快的,要經(jīng)常調(diào)整時間,不是很理想。
回復

使用道具 舉報

24#
ID:624685 發(fā)表于 2022-6-5 11:43 | 只看該作者
好資料,雖然現(xiàn)在還看不太懂,謝謝,慢慢學習
回復

使用道具 舉報

25#
ID:368834 發(fā)表于 2022-6-7 08:33 | 只看該作者
強,好資料,必須支持
回復

使用道具 舉報

26#
ID:368834 發(fā)表于 2022-6-7 08:34 | 只看該作者
好資料,必須頂上去
回復

使用道具 舉報

27#
ID:915491 發(fā)表于 2022-6-7 09:39 | 只看該作者
很好,功能很全
回復

使用道具 舉報

28#
ID:61140 發(fā)表于 2022-6-13 15:06 | 只看該作者

后面會發(fā)一些適合新手學習的程序和DIY項目
回復

使用道具 舉報

29#
ID:1000963 發(fā)表于 2022-6-14 09:39 | 只看該作者
程序?qū)懙牟诲e的
回復

使用道具 舉報

30#
ID:388099 發(fā)表于 2022-6-14 20:20 | 只看該作者
感謝分享,下載了慢慢學習。謝謝。
回復

使用道具 舉報

31#
ID:893249 發(fā)表于 2022-6-19 23:13 | 只看該作者
好資料,必須支持開源
回復

使用道具 舉報

32#
ID:61140 發(fā)表于 2022-6-19 23:56 | 只看該作者
wolfinn 發(fā)表于 2022-5-23 19:37
度C可以自編一個顯示,1602支持8個自選顯示。

本程序只做演示不做實用,如果實用的話我會夾帶匯編以修正時間差,可以做到年走時誤差3S以內(nèi)不是神話.
回復

使用道具 舉報

33#
ID:372579 發(fā)表于 2022-6-20 11:09 | 只看該作者
好資料,必須支持樓主
回復

使用道具 舉報

34#
ID:58874 發(fā)表于 2022-6-20 23:45 | 只看該作者
好資料,必須支持開源
回復

使用道具 舉報

35#
ID:893249 發(fā)表于 2022-6-21 21:56 來自手機 | 只看該作者
請問ad采集的哪里的電壓,pwm輸出到哪里?是要控制什么嗎?
回復

使用道具 舉報

36#
ID:425251 發(fā)表于 2022-6-22 08:09 | 只看該作者
好資料,必須支持開源。收藏了。
回復

使用道具 舉報

37#
ID:1036478 發(fā)表于 2022-6-22 20:23 | 只看該作者
  好資料,必須支持開源
回復

使用道具 舉報

38#
ID:1033693 發(fā)表于 2022-6-25 11:13 | 只看該作者
好資料,有獨立的思考方式
回復

使用道具 舉報

39#
ID:61140 發(fā)表于 2022-6-25 22:21 | 只看該作者
本帖最后由 xiaoyuxinke 于 2022-9-14 15:29 編輯
nicevoip 發(fā)表于 2022-6-21 21:56
請問ad采集的哪里的電壓,pwm輸出到哪里?是要控制什么嗎?

這個看你想怎么應用了,可以用AD變成PWM控制電機轉(zhuǎn)速,也可以用PWM控制其它或用其它變量控制輸出的PWM,這個可以靈活應用.
回復

使用道具 舉報

40#
ID:965189 發(fā)表于 2022-9-13 21:46 | 只看該作者
好資料就要下載學習。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线免费 | 国产成人在线播放 | 美女天天操| 免费午夜电影 | 中文一区二区视频 | 91视频观看 | 男女视频在线观看 | 日韩av看片 | 在线成人免费视频 | 亚洲欧美日韩精品久久亚洲区 | 成人免费视频网站在线观看 | 麻豆精品久久 | 91在线电影 | 久久不卡 | 色综合视频在线 | 久久久精品天堂 | 精品欧美一区二区三区久久久 | 国产精品日韩一区二区 | 不卡一区二区三区四区 | 国产操操操 | 99小视频 | 国产福利在线看 | 久久9久| 久久99精品久久久久久国产越南 | 91免费看片神器 | 国产精品欧美日韩 | 国产精品无码专区在线观看 | 国产视频福利在线观看 | 国产精品三级久久久久久电影 | 精品美女久久久久久免费 | 国产日韩欧美综合 | 日韩一区三区 | 日韩免费在线视频 | 高清色 | 精品欧美乱码久久久久久1区2区 | 91在线视频播放 | 亚洲精品久久久久久首妖 | 成人亚洲精品久久久久软件 | 国产一区二区精 | 色接久久 | 日本欧美在线观看视频 |