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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16704|回復: 77
收起左側

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

  [復制鏈接]
ID:61140 發表于 2022-5-17 23:04 | 顯示全部樓層 |閱讀模式
以下是部分程序,需要完整程序請下載附件

制作出來的實物圖如下:
51hei圖片_20220517225753.jpg

單片機源程序如下:

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

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

評分

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

查看全部評分

回復

使用道具 舉報

ID:1024371 發表于 2022-5-18 13:40 | 顯示全部樓層
好資料,必須支持開源,
回復

使用道具 舉報

ID:32289 發表于 2022-5-18 21:19 | 顯示全部樓層
學了N年的單片機,硬是沒有入門,只有仿制了。
回復

使用道具 舉報

ID:61140 發表于 2022-5-18 23:16 | 顯示全部樓層
rrqxx 發表于 2022-5-18 21:19
學了N年的單片機,硬是沒有入門,只有仿制了。

仿制也是一種學習的方法,適當的時候仿制比課本上學的還快些.
回復

使用道具 舉報

ID:305762 發表于 2022-5-19 07:59 | 顯示全部樓層

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

使用道具 舉報

ID:921339 發表于 2022-5-19 08:34 | 顯示全部樓層
下載,學習了,值得借簽
回復

使用道具 舉報

ID:242300 發表于 2022-5-19 21:13 | 顯示全部樓層
好資料,支持開源
回復

使用道具 舉報

ID:67312 發表于 2022-5-20 09:23 | 顯示全部樓層
收藏了,暫時還看不懂
回復

使用道具 舉報

ID:443637 發表于 2022-5-20 13:47 | 顯示全部樓層
學習了,值得借簽
回復

使用道具 舉報

ID:230742 發表于 2022-5-20 14:22 | 顯示全部樓層
弱弱的問一下,這個是可以調整時間的嗎?
回復

使用道具 舉報

ID:61140 發表于 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退出.
      至于按鍵消抖部分你自己想辦法.
回復

使用道具 舉報

ID:965189 發表于 2022-5-20 22:46 | 顯示全部樓層
程序簡潔,注釋詳細。值得學習。
回復

使用道具 舉報

ID:1028406 發表于 2022-5-21 12:02 | 顯示全部樓層

好資料,支持開源
回復

使用道具 舉報

ID:447439 發表于 2022-5-23 09:12 | 顯示全部樓層
樓主能否分享下用ADC采用做電量檢測,其次是想問下ADC分壓按鍵同時按住如何減少干擾。謝謝
回復

使用道具 舉報

ID:776619 發表于 2022-5-23 19:37 | 顯示全部樓層
度C可以自編一個顯示,1602支持8個自選顯示。
回復

使用道具 舉報

ID:1028725 發表于 2022-5-24 20:46 | 顯示全部樓層
有多路ds18b20的程序嗎
回復

使用道具 舉報

ID:61140 發表于 2022-5-25 22:25 | 顯示全部樓層
啤酒瓶子老大 發表于 2022-5-20 14:22
弱弱的問一下,這個是可以調整時間的嗎?

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

使用道具 舉報

ID:61140 發表于 2022-5-25 22:29 | 顯示全部樓層
小丑only 發表于 2022-5-23 09:12
樓主能否分享下用ADC采用做電量檢測,其次是想問下ADC分壓按鍵同時按住如何減少干擾。謝謝

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

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

使用道具 舉報

ID:61140 發表于 2022-5-25 22:34 | 顯示全部樓層
51小白。lht 發表于 2022-5-24 20:46
有多路ds18b20的程序嗎

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

使用道具 舉報

ID:61140 發表于 2022-6-3 04:06 | 顯示全部樓層
會沉么,會的,所以再來頂一下,免的沉下去.
回復

使用道具 舉報

ID:409878 發表于 2022-6-3 16:17 | 顯示全部樓層
學習的最好方法,就是不斷的寫,不斷的動手。
回復

使用道具 舉報

ID:1019972 發表于 2022-6-3 17:50 | 顯示全部樓層
不斷的動手
回復

使用道具 舉報

ID:409674 發表于 2022-6-4 17:29 | 顯示全部樓層
DS1302時間總是會跑快的,要經常調整時間,不是很理想。
回復

使用道具 舉報

ID:624685 發表于 2022-6-5 11:43 | 顯示全部樓層
好資料,雖然現在還看不太懂,謝謝,慢慢學習
回復

使用道具 舉報

ID:368834 發表于 2022-6-7 08:33 | 顯示全部樓層
強,好資料,必須支持
回復

使用道具 舉報

ID:368834 發表于 2022-6-7 08:34 | 顯示全部樓層
好資料,必須頂上去
回復

使用道具 舉報

ID:915491 發表于 2022-6-7 09:39 | 顯示全部樓層
很好,功能很全
回復

使用道具 舉報

ID:61140 發表于 2022-6-13 15:06 | 顯示全部樓層
gao687 發表于 2022-6-7 09:39
很好,功能很全

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

使用道具 舉報

ID:1000963 發表于 2022-6-14 09:39 | 顯示全部樓層
程序寫的不錯的
回復

使用道具 舉報

ID:388099 發表于 2022-6-14 20:20 | 顯示全部樓層
感謝分享,下載了慢慢學習。謝謝。
回復

使用道具 舉報

ID:893249 發表于 2022-6-19 23:13 | 顯示全部樓層
好資料,必須支持開源
回復

使用道具 舉報

ID:61140 發表于 2022-6-19 23:56 | 顯示全部樓層
wolfinn 發表于 2022-5-23 19:37
度C可以自編一個顯示,1602支持8個自選顯示。

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

使用道具 舉報

ID:372579 發表于 2022-6-20 11:09 | 顯示全部樓層
好資料,必須支持樓主
回復

使用道具 舉報

ID:58874 發表于 2022-6-20 23:45 | 顯示全部樓層
好資料,必須支持開源
回復

使用道具 舉報

ID:893249 發表于 2022-6-21 21:56 來自觸屏版 | 顯示全部樓層
請問ad采集的哪里的電壓,pwm輸出到哪里?是要控制什么嗎?
回復

使用道具 舉報

ID:425251 發表于 2022-6-22 08:09 | 顯示全部樓層
好資料,必須支持開源。收藏了。
回復

使用道具 舉報

ID:1036478 發表于 2022-6-22 20:23 | 顯示全部樓層
  好資料,必須支持開源
回復

使用道具 舉報

ID:1033693 發表于 2022-6-25 11:13 | 顯示全部樓層
好資料,有獨立的思考方式
回復

使用道具 舉報

ID:61140 發表于 2022-6-25 22:21 | 顯示全部樓層
本帖最后由 xiaoyuxinke 于 2022-9-14 15:29 編輯
nicevoip 發表于 2022-6-21 21:56
請問ad采集的哪里的電壓,pwm輸出到哪里?是要控制什么嗎?

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

使用道具 舉報

ID:965189 發表于 2022-9-13 21:46 | 顯示全部樓層
好資料就要下載學習。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久精品视频 | 亚洲一区中文字幕 | 国产精品欧美精品日韩精品 | 日日干夜夜操 | 中文字幕亚洲视频 | 日韩精品不卡 | 国产日韩免费视频 | 精品亚洲视频在线 | 成人在线视频网站 | 看羞羞视频| 范冰冰一级做a爰片久久毛片 | 免费99视频 | 在线免费视频一区 | 久久精品国产免费看久久精品 | 亚洲一区成人 | 欧美一区二区在线观看 | 91精品成人久久 | 久热久热 | 国产一区二区视频免费在线观看 | h漫在线观看 | 伊人久久综合影院 | 日本精品视频在线 | 99久久久无码国产精品 | 国产日韩欧美精品一区二区 | 国产毛片久久久 | 中文字幕一区二区三区乱码在线 | 久久成人精品视频 | 成人免费在线观看 | 色婷婷久久久亚洲一区二区三区 | 日本成年免费网站 | 99色播 | 国产精品视频一 | 拍真实国产伦偷精品 | 国产精品毛片一区二区在线看 | 亚洲精品电影网在线观看 | 国产精品日韩一区 | 亚洲二区精品 | 一区二区国产在线观看 | 成人在线一区二区三区 | 久久精品网 | 欧美色综合一区二区三区 |