這周在上次實現的電子鐘(51單片機初學實踐:用DS1302模塊和LCD1602顯示屏實現電子鐘)的基礎上作了以下2點改進:1、將LCD1602屏幕更換為1.44寸 TFT顯示屏
主要考慮是TFT顯示屏可以使用不同字體和顏色,更方便定制顯示界面
2、將STC89C52RC單片機更換為STC12C5A60S2單片機
首先是空間更大,STC12C5A60S2單片機(60K bytes flash ROM, 1280 bytes data RAM),STC89C52RC單片機(8K bytes flash ROM, 512 bytes data RAM)
其次STC12C5A60S2單片機有單獨的SPI接口(P1.5 MOSI 和 P1.6 MISO),可以更好地驅動TFT顯示屏
STC12C5A60S2單片機有10位ADC(P1.0 - P1.7),可以采集光敏電阻電壓,自動調整TFT顯示屏背光亮度
STC12C5A60S2單片機有專用PWM輸出(P1.3 和 P1.4,可以很方便地調整TFT顯示屏背光亮度
TFT顯示屏效果:
從上到下依次為:年月日 星期幾 時分秒 氣溫 光敏電阻電壓
51hei圖片_20200726151412.jpg (74.4 KB, 下載次數: 54)
下載附件
2020-7-26 15:39 上傳
串口打印效果:
Annotation 2020-07-26 002733.png (32.88 KB, 下載次數: 66)
下載附件
2020-7-26 15:41 上傳
實物接線效果:
51hei圖片_20200726151404.jpg (98.61 KB, 下載次數: 54)
下載附件
2020-7-26 15:42 上傳
在實踐過程中,有以下心得:
1、STC12C5A60S2單片機有專用的串口定時器,更方便設置波特率
- /* 串口配置函數,通信波特率 9600 */
- void UART1_Config()
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //配置串口為模式1,允許發送和接收
- //9600bps@11.0592MHz
- BRT = 0xDC; //設定獨立波特率發生器重裝值
- AUXR |= 0x04; //獨立波特率發生器時鐘為Fosc,即1T
- AUXR |= 0x01; //串口1選擇獨立波特率發生器為波特率發生器
- AUXR |= 0x10; //啟動獨立波特率發生器
- EA = 1; //啟用中斷
- ES = 1; //啟用串口中斷
- }
復制代碼
2、P3.2需要設置為推挽模式,以便更好地驅動顯示屏背光
- #ifdef MCU_STC12
- //P3.2 set as push-pull output mode, for LCD backlight
- P3M1 &= ~(1<<2);
- P3M0 |= (1<<2);
- #endif
復制代碼
3、ADC采樣輸入,需要用到P1.0和P1.1兩個端口,P1.0用于測量TL431輸出的參考電壓2.5v,P1.1用于測量光敏電阻當前分壓
Annotation 2020-07-26 143927.png (211.56 KB, 下載次數: 58)
下載附件
2020-7-26 15:49 上傳
Annotation 2020-07-26 145214.png (169.29 KB, 下載次數: 53)
下載附件
2020-7-26 15:49 上傳
Annotation 2020-07-26 144746.png (342.87 KB, 下載次數: 59)
下載附件
2020-7-26 15:51 上傳
Annotation 2020-07-26 144938.png (365.95 KB, 下載次數: 77)
下載附件
2020-7-26 15:52 上傳
Annotation 2020-07-26 145039.png (129.26 KB, 下載次數: 79)
下載附件
2020-7-26 15:52 上傳
Annotation 2020-07-26 145114.png (151.42 KB, 下載次數: 43)
下載附件
2020-7-26 15:52 上傳
- void ADC_Init()
- {
- P1ASF = 0x03; //選擇P1.0和P1.1作為ADC采樣輸入
- // ADRJ=1時,10位A/D轉換結果的高2位存放在ADC_RES的低2位中,低8位存放在ADC_RESL中
- AUXR1 |= 1<<2; //set ADRJ=1 : 10bit result = ADC_RES<<8 + ADC_RESL
- ADC_RES = 0;
- ADC_RESL = 0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL; // 打開A/D轉換器電源, 540個時鐘周期轉換一次
- Delay10us();
- }
- uint16 ADC_Get_Result(uint8 channel)
- {
- uint16 res;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | channel;
- _nop_(); //Must wait before inquiry
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR & ADC_FLAG));
- ADC_CONTR &= ~ADC_FLAG;
- res = (ADC_RES & 0x03) << 8;
- res += ADC_RESL;
- Delay10us();
- Delay10us();
- return res;
- }
復制代碼
TL431和光敏電阻接線示意
Annotation 2020-07-25 232140.png (13.73 KB, 下載次數: 66)
下載附件
2020-7-26 15:53 上傳
Annotation 2020-07-25 232258.png (45.62 KB, 下載次數: 57)
下載附件
2020-7-26 15:54 上傳
光敏電阻的特點是光照越強阻值越小,分壓降低,而在弱光環境則是阻值變大,分壓升高,如下二圖所示
可以根據這個特點自動調整顯示屏背光強度
51hei圖片_20200726151430.jpg (82.99 KB, 下載次數: 54)
下載附件
2020-7-26 16:17 上傳
4、PWM輸出
不需要修改頻率,直接設置為SysClk/12
Annotation 2020-07-26 141225.png (235.05 KB, 下載次數: 60)
下載附件
2020-7-26 15:56 上傳
Annotation 2020-07-26 141016.png (393.76 KB, 下載次數: 66)
下載附件
2020-7-26 15:57 上傳
PCA模塊工作模式設定為8位PWM,無中斷
Annotation 2020-07-26 142547.png (136.79 KB, 下載次數: 72)
下載附件
2020-7-26 15:59 上傳
占空比調整通過設置不同的CCAP1L/H值來實現
Annotation 2020-07-26 141931.png (161.21 KB, 下載次數: 74)
下載附件
2020-7-26 16:01 上傳
Annotation 2020-07-26 142110.png (179.41 KB, 下載次數: 58)
下載附件
2020-7-26 16:01 上傳
- <blockquote>// 1.3和1.4口 PWM占空比,數值越大,占空比越小
復制代碼
5、在TFT屏幕上顯示字符
需要注意12x16和12x24這種字符點陣數據,由于12不是8的整數倍,實際存儲16bit,使用時,需要跳過最后4個填充bit
//采用設置窗口方法填充12x24點陣數字
void Display_Digit_12x24(uint8 x, uint8 y, uint16 fc, uint16 bc, uint8 idx)
{
uint8 i,j,k;
LCD_Set_Region(x, y, 12, 24);
for(i=0; i<3*16; i++)
{
if(1 == i%2) k = 4;
else k = 8;
for(j=0; j<k; j++)
{
if(digit12x24[idx][ i]&(0x80>>j))
{
SPI_Write_Word(fc);
}
else
{
if (fc != bc)
{
SPI_Write_Word(bc);
}
}
}
}
}
6、main函數內容:
- void main()
- {
- int8 slen = 0;
- uint8 pdata uart_cmd_buf[64] = {0};
- DS18B20_Start();
- UART1_Config(); // 9600 baud
- Timer0Init(); //T0定時10ms
- DS1302_Init(); //初始化RTC時鐘
- ADC_Init();
- #ifdef MCU_STC12
- //P3.2 set as push-pull output mode, for LCD backlight
- P3M1 &= ~(1<<2);
- P3M0 |= (1<<2);
- #endif
- SPI_Init();
- LCD_Init();
- PWM_Init();
- delay_ms(500);
- LCD_Show_Format();
- while(1)
- {
-
- Uart_Cmd_Check(&uart_cmd_buf, sizeof(uart_cmd_buf)-1);
- if (timer_flag_250ms) //每250ms讀取依次時間
- {
- ReadAndShowRtc();
- timer_flag_250ms = 0;
- }
- if (timer_flag_5s) //每隔5s執行以下分支
- {
- //printf(">>>===\r\n");
- ReadAndShowTemperature(-5);
-
- ReadAndShowPhotoresistorVoltage();
- timer_flag_5s = 0;
- }
- }
- }
復制代碼
STC12C5A60S2單片機手冊下載地址(點替換成.):www點stcmcudata點com/datasheet/stc/STC-AD-PDF/STC12C5A60S2.pdf
1.44寸TFT(ST7735)顯示屏資料(點替換成.):www點lcdwiki點com/zh/1.44inch_SPI_Module_ST7735S_SKU:MSP1443
完整代碼見附件,文件列表如圖所示:
Annotation 2020-07-26 160835.png (14.84 KB, 下載次數: 50)
下載附件
2020-7-26 16:09 上傳
以上代碼使用最小系統和面包板調試,接線簡單,具體端口可參看config.h
初學單片機,難免有錯漏之處,還請各位壇友不吝賜教。
DS1302_UART_ST7735_STC12C5A60S2.7z
(2.34 MB, 下載次數: 222)
2020-7-26 16:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|