|
這周在上次實(shí)現(xiàn)的電子鐘(51單片機(jī)初學(xué)實(shí)踐:用DS1302模塊和LCD1602顯示屏實(shí)現(xiàn)電子鐘)的基礎(chǔ)上作了以下2點(diǎn)改進(jìn):1、將LCD1602屏幕更換為1.44寸 TFT顯示屏
主要考慮是TFT顯示屏可以使用不同字體和顏色,更方便定制顯示界面
2、將STC89C52RC單片機(jī)更換為STC12C5A60S2單片機(jī)
首先是空間更大,STC12C5A60S2單片機(jī)(60K bytes flash ROM, 1280 bytes data RAM),STC89C52RC單片機(jī)(8K bytes flash ROM, 512 bytes data RAM)
其次STC12C5A60S2單片機(jī)有單獨(dú)的SPI接口(P1.5 MOSI 和 P1.6 MISO),可以更好地驅(qū)動TFT顯示屏
STC12C5A60S2單片機(jī)有10位ADC(P1.0 - P1.7),可以采集光敏電阻電壓,自動調(diào)整TFT顯示屏背光亮度
STC12C5A60S2單片機(jī)有專用PWM輸出(P1.3 和 P1.4,可以很方便地調(diào)整TFT顯示屏背光亮度
TFT顯示屏效果:
從上到下依次為:年月日 星期幾 時分秒 氣溫 光敏電阻電壓
串口打印效果:
實(shí)物接線效果:
在實(shí)踐過程中,有以下心得:
1、STC12C5A60S2單片機(jī)有專用的串口定時器,更方便設(shè)置波特率
- /* 串口配置函數(shù),通信波特率 9600 */
- void UART1_Config()
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //配置串口為模式1,允許發(fā)送和接收
- //9600bps@11.0592MHz
- BRT = 0xDC; //設(shè)定獨(dú)立波特率發(fā)生器重裝值
- AUXR |= 0x04; //獨(dú)立波特率發(fā)生器時鐘為Fosc,即1T
- AUXR |= 0x01; //串口1選擇獨(dú)立波特率發(fā)生器為波特率發(fā)生器
- AUXR |= 0x10; //啟動獨(dú)立波特率發(fā)生器
- EA = 1; //啟用中斷
- ES = 1; //啟用串口中斷
- }
復(fù)制代碼
2、P3.2需要設(shè)置為推挽模式,以便更好地驅(qū)動顯示屏背光
- #ifdef MCU_STC12
- //P3.2 set as push-pull output mode, for LCD backlight
- P3M1 &= ~(1<<2);
- P3M0 |= (1<<2);
- #endif
復(fù)制代碼
3、ADC采樣輸入,需要用到P1.0和P1.1兩個端口,P1.0用于測量TL431輸出的參考電壓2.5v,P1.1用于測量光敏電阻當(dāng)前分壓
- void ADC_Init()
- {
- P1ASF = 0x03; //選擇P1.0和P1.1作為ADC采樣輸入
- // ADRJ=1時,10位A/D轉(zhuǎn)換結(jié)果的高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轉(zhuǎn)換器電源, 540個時鐘周期轉(zhuǎn)換一次
- 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;
- }
復(fù)制代碼
TL431和光敏電阻接線示意
光敏電阻的特點(diǎn)是光照越強(qiáng)阻值越小,分壓降低,而在弱光環(huán)境則是阻值變大,分壓升高,如下二圖所示
可以根據(jù)這個特點(diǎn)自動調(diào)整顯示屏背光強(qiáng)度
4、PWM輸出
不需要修改頻率,直接設(shè)置為SysClk/12
PCA模塊工作模式設(shè)定為8位PWM,無中斷
占空比調(diào)整通過設(shè)置不同的CCAP1L/H值來實(shí)現(xiàn)
- <blockquote>// 1.3和1.4口 PWM占空比,數(shù)值越大,占空比越小
復(fù)制代碼
5、在TFT屏幕上顯示字符
需要注意12x16和12x24這種字符點(diǎn)陣數(shù)據(jù),由于12不是8的整數(shù)倍,實(shí)際存儲16bit,使用時,需要跳過最后4個填充bit
//采用設(shè)置窗口方法填充12x24點(diǎn)陣數(shù)字
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函數(shù)內(nèi)容:
- 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執(zhí)行以下分支
- {
- //printf(">>>===\r\n");
- ReadAndShowTemperature(-5);
-
- ReadAndShowPhotoresistorVoltage();
- timer_flag_5s = 0;
- }
- }
- }
復(fù)制代碼
STC12C5A60S2單片機(jī)手冊下載地址(點(diǎn)替換成.):www點(diǎn)stcmcudata點(diǎn)com/datasheet/stc/STC-AD-PDF/STC12C5A60S2.pdf
1.44寸TFT(ST7735)顯示屏資料(點(diǎn)替換成.):www點(diǎn)lcdwiki點(diǎn)com/zh/1.44inch_SPI_Module_ST7735S_SKU:MSP1443
完整代碼見附件,文件列表如圖所示:
以上代碼使用最小系統(tǒng)和面包板調(diào)試,接線簡單,具體端口可參看config.h
初學(xué)單片機(jī),難免有錯漏之處,還請各位壇友不吝賜教。
DS1302_UART_ST7735_STC12C5A60S2.7z
(2.34 MB, 下載次數(shù): 222)
2020-7-26 16:12 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|