一答倡、實驗內容
在keil軟件中編寫程序裁厅,利用燒錄軟件下載hex文件實現(xiàn)在大板單片機的8*8點陣中顯示“54”的指令枫匾。
二狭握、keil的使用及生成hex文件
1.project->new uvision project->保存->Atmel->AT89C52->ok
2.file->text1->書寫代碼調試保存為.c類型
3.project->target->右擊source group->add existing files to group->選擇剛保存的.c格式文件
4.右擊target->options for target->output->勾選creat hex file->再次調試->結果出現(xiàn)creating hex from"..."
5.打開燒錄軟件->芯片類型:STC89Cxx(new)->選擇hex文件進行下載
三递览、程序編寫
(利用原有基礎實驗10改編而成)
1.在單片機點陣中行線高電平有效叼屠,列線低電平有效。原有程序中u8 ledwei[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}拆成二進制0111 1111绞铃,1011 1111镜雨,1101 1111,1110 1111儿捧,1111 0111荚坞,1111 1011,1111 1101菲盾,1111 1110颓影,可以看出ledwei表示依次使得每一列有效,后面使用循環(huán)函數(shù)先控制選的列懒鉴,再進行此列中哪個二極管發(fā)光的控制诡挂。
2..數(shù)字“54”設計
當ledwei為0x7f即選擇第一列時,通過圖可以看出段選信號為1111 0001临谱,以此類推得出所有代碼璃俗。
3..程序如下:
#include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
#include
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
u8 ledduan[ ]={0xf1,0x91,0x91,0x9f,0xf0,0x10,0x10,0xff};//確定每一列顯示的二極管計算代碼值
u8 ledwei[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//后面利用循環(huán)函數(shù)依次選擇某一列
/*******************************************************************************
* 函 數(shù) 名? ? ? ? : delay
* 函數(shù)功能 ? : 延時函數(shù)悉默,i=1時城豁,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函數(shù)名? ? ? ? : Hc595SendByte(u8 dat)
* 函數(shù)功能 ? : 向74HC595發(fā)送一個字節(jié)的數(shù)據(jù)
* 輸入? ? ? ? ? : 無
* 輸出? ? ? ? : 無
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat>>7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
/*******************************************************************************
* 函 數(shù) 名? ? ? : main
* 函數(shù)功能 : 主函數(shù)
* 輸? ? 入? ? ? : 無
* 輸? ? 出? ? : 無
*******************************************************************************/
void main()
{
u8 i;
while(1)
{
P0=0x7f;
for(i=0;i<8;i++)
{
P0=ledwei[i]; ? //位選
Hc595SendByte(ledduan[i]); //發(fā)送段選數(shù)據(jù)
delay(100); ? //延時
Hc595SendByte(0x00);? //消隱
}
}
}
四、注意
程序書寫時:端口號必須大寫3巍3恰雳旅!
單片機設置:一定要將JOE短接片短接到GND端,如果不需要595后面的小燈點亮可以拔掉JP595短接片<淞摹A肜薄!
人有視覺殘留甸饱,當時間間隔過短時沦童,會出現(xiàn)重影。消隱是為了防止進行下一次位選段選的時候受到上一位選的段選信號干擾叹话。當顯示完某列后偷遗,利用消隱關閉數(shù)碼管,再進行下一位的顯示驼壶。